<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=92.255.89.62&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=92.255.89.62&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/92.255.89.62"/>
		<updated>2026-07-18T07:34:09Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=82329</id>
		<title>Персистентный массив</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%9F%D0%B5%D1%80%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BD%D1%82%D0%BD%D1%8B%D0%B9_%D0%BC%D0%B0%D1%81%D1%81%D0%B8%D0%B2&amp;diff=82329"/>
				<updated>2022-05-20T18:48:18Z</updated>
		
		<summary type="html">&lt;p&gt;92.255.89.62: /* Реализация персистентных массивов в виде сбалансированных деревьев */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition=Мы называем ADT '''полностью персистентными'''(англ. fully persistent), если, помимо интерфейса, все операции сохраняют операнды неизменными, таким образом, что операнды и результаты таких операций могут быть свободно используемы повторно во время дальнейшего хода вычислений.&lt;br /&gt;
Мы называем структуру данных (как реализацию абстрактного типа данных англ.ATD) полностью персистентной, если она эффективно реализует все операции предполагаемого, полностью персистентного ADT.}}&lt;br /&gt;
==Интерфейс==&lt;br /&gt;
&lt;br /&gt;
*  &amp;lt;tex&amp;gt; [ X ]&amp;lt;/tex&amp;gt;  статический конструктор, который принимает элемент &amp;lt;tex&amp;gt;  X  &amp;lt;/tex&amp;gt; и возвращает массив, который содержит &amp;lt;tex&amp;gt;  X  &amp;lt;/tex&amp;gt; в качестве его единственного элемента.&lt;br /&gt;
*  &amp;lt;tex&amp;gt; LENGTH [A] &amp;lt;/tex&amp;gt;   возвращает длину массива &amp;lt;tex&amp;gt;  A  &amp;lt;/tex&amp;gt;.&lt;br /&gt;
* &amp;lt;tex&amp;gt; \varepsilon &amp;lt;/tex&amp;gt; является пустым массивом, иногда также обозначается  &amp;lt;tex&amp;gt; [ ]&amp;lt;/tex&amp;gt; &lt;br /&gt;
*  &amp;lt;tex&amp;gt; A [i] &amp;lt;/tex&amp;gt;   принимает массив  &amp;lt;tex&amp;gt;   A = [a_0, ..., a_{n-1} ] &amp;lt;/tex&amp;gt;   и индекс  &amp;lt;tex&amp;gt;  i = 0..n - 1 &amp;lt;/tex&amp;gt; , затем возвращает  &amp;lt;tex&amp;gt;   a_i &amp;lt;/tex&amp;gt;.&lt;br /&gt;
*  &amp;lt;tex&amp;gt; CONCATENATE(A,B) &amp;lt;/tex&amp;gt;   конкатентирует два массива:  если &amp;lt;tex&amp;gt;   A = [a_0,..., a_{n-1} ] &amp;lt;/tex&amp;gt;  и  &amp;lt;tex&amp;gt;  B = [b_0,..., b_{m-1} ]; n, m \geq 0&amp;lt;/tex&amp;gt; , результат будет  &amp;lt;tex&amp;gt;  [a_0 ,..., a_{n−1}, b_0,..., b_{m-1}] &amp;lt;/tex&amp;gt; . Часто записывается как  &amp;lt;tex&amp;gt;  A • B&amp;lt;/tex&amp;gt;   вместо  &amp;lt;tex&amp;gt; CONCATENATE (A,B) &amp;lt;/tex&amp;gt; .&lt;br /&gt;
*  &amp;lt;tex&amp;gt; HEAD (A,i) &amp;lt;/tex&amp;gt;   принимает на вход массив  &amp;lt;tex&amp;gt;  A = [a_0,...,a_{n−1}] &amp;lt;/tex&amp;gt;   и производный   &amp;lt;tex&amp;gt;  int&amp;lt;/tex&amp;gt; , возвращает массив  &amp;lt;tex&amp;gt;  [a_0,...,a_{min(i−1,n−1)} ] &amp;lt;/tex&amp;gt; .  Если  &amp;lt;tex&amp;gt;  i &amp;lt; 0&amp;lt;/tex&amp;gt;   результатом будет  &amp;lt;tex&amp;gt;  [  ]&amp;lt;/tex&amp;gt; .&lt;br /&gt;
*  &amp;lt;tex&amp;gt; TAIL (A,i) &amp;lt;/tex&amp;gt;   принимает на вход массив   &amp;lt;tex&amp;gt;  A = [a_0,...,a_n−1] &amp;lt;/tex&amp;gt;   и производный  &amp;lt;tex&amp;gt;  int&amp;lt;/tex&amp;gt; , возвращает массив  &amp;lt;tex&amp;gt;  [a_{max(i,0)} ,...,a_{n−1}]&amp;lt;/tex&amp;gt; . Если  &amp;lt;tex&amp;gt;  i \geq n&amp;lt;/tex&amp;gt; , результатом будет  &amp;lt;tex&amp;gt;  [  ]&amp;lt;/tex&amp;gt; .&lt;br /&gt;
*  Если &amp;lt;tex&amp;gt; B&amp;lt;/tex&amp;gt;  - структура, то  &amp;lt;tex&amp;gt;  seq (B) &amp;lt;/tex&amp;gt;   обозначает строку, которая представлена  &amp;lt;tex&amp;gt;  B&amp;lt;/tex&amp;gt; . &lt;br /&gt;
&lt;br /&gt;
Основываясь на вышеприведенных операциях, ADT может быть расширен следующими операциями:&lt;br /&gt;
&lt;br /&gt;
*	 &amp;lt;tex&amp;gt; [x0,..., x_{n−1}]&amp;lt;/tex&amp;gt;  является сокращением для  &amp;lt;tex&amp;gt; CONCATENATE ([x_0], CONCATENATE ([x_1],CONCATENATE(...,CONCATENATE([x_{n−2}],[x_{n−1}])))) &amp;lt;/tex&amp;gt;   . Обратите внимание, что в программе оценка этого выражения всегда включает  &amp;lt;tex&amp;gt;  n-2&amp;lt;/tex&amp;gt;   конкатенации.&lt;br /&gt;
*	 &amp;lt;tex&amp;gt; REVERSE[A] &amp;lt;/tex&amp;gt;   принимает на вход массив  &amp;lt;tex&amp;gt;  A = [a_0,...,a_{n-1}] &amp;lt;/tex&amp;gt;  и возвращает  &amp;lt;tex&amp;gt;  [a_{n-1},...,a_0] &amp;lt;/tex&amp;gt; . &lt;br /&gt;
*	 &amp;lt;tex&amp;gt; REPLACE [A,i, x] &amp;lt;/tex&amp;gt;   принимает на вход массив  &amp;lt;tex&amp;gt;   A = [a_0,...,a_{n-1}]&amp;lt;/tex&amp;gt;   , индекс  &amp;lt;tex&amp;gt;  i = 0.. n - 1 &amp;lt;/tex&amp;gt; , и новый элемент  &amp;lt;tex&amp;gt; x&amp;lt;/tex&amp;gt; , выводит  &amp;lt;tex&amp;gt; [a_0,...,a_{i-1}, x,a_{i+1},...,a_{n-1}]&amp;lt;/tex&amp;gt; . &lt;br /&gt;
*	 &amp;lt;tex&amp;gt; A[i] \leftarrow x &amp;lt;/tex&amp;gt; является сокращенным обозначением  &amp;lt;tex&amp;gt; A \leftarrow REPLACE(A,i, x)&amp;lt;/tex&amp;gt; .  &lt;br /&gt;
*	 &amp;lt;tex&amp;gt; INSERT[A,i, x]&amp;lt;/tex&amp;gt;  получает массив  &amp;lt;tex&amp;gt;   A = [a_0,...,a_{n-1}]&amp;lt;/tex&amp;gt;   , индекс  &amp;lt;tex&amp;gt;   i = 0..n - 1 &amp;lt;/tex&amp;gt;  , и новый элемент  &amp;lt;tex&amp;gt;   x &amp;lt;/tex&amp;gt;   и возвращает массив  &amp;lt;tex&amp;gt;  [a_0,...,a_{i-1}, x,a_i ,...,a_{n−1}] = HEAD(A,i) [x] • TAIL(A,i) &amp;lt;/tex&amp;gt;   , длина которого  &amp;lt;tex&amp;gt;   n-1&amp;lt;/tex&amp;gt;   .&lt;br /&gt;
* 	 &amp;lt;tex&amp;gt; LEFTPART (A) &amp;lt;/tex&amp;gt; возвращает массив, представляющий последовательность префикса &amp;lt;tex&amp;gt;    A&amp;lt;/tex&amp;gt;   .&lt;br /&gt;
*	 &amp;lt;tex&amp;gt;  RIGHTPART(A) &amp;lt;/tex&amp;gt;   возвращает массив, представляющий последовательность суффикса &amp;lt;tex&amp;gt;    A&amp;lt;/tex&amp;gt;   .&lt;br /&gt;
&lt;br /&gt;
==Реализация персистентных массивов в виде сбалансированных деревьев==&lt;br /&gt;
Будем использовать сбалансированные деревья в качестве нашей стандартной реализации постоянных массивов. (Реализации сбалансированных деревьев, таких как AVL-деревья и B-деревья, можно найти в соответствующих разделах сайта)&lt;br /&gt;
Решающим моментом является то, что мы допускаем множественные ссылки на одно и то же поддерево: хотя концептуальное представление постоянных массивов - ориентированные деревья, их представление в памяти различно. Мы допускаем, что узел может быть преемником многих разных узлов. &lt;br /&gt;
&lt;br /&gt;
{{Определение&lt;br /&gt;
|definition= Пусть  &amp;lt;tex&amp;gt; X&amp;lt;/tex&amp;gt;  - некоторое множество. Бинарное дерево с несколькими ссылками на  &amp;lt;tex&amp;gt; X&amp;lt;/tex&amp;gt;  является кортежем  &amp;lt;tex&amp;gt; B = (N, L, R) с L \cap  R = 0 /, L, R \subseteq  N × N&amp;lt;/tex&amp;gt; , таким, что&lt;br /&gt;
*  &amp;lt;tex&amp;gt; (N, L \cup R)&amp;lt;/tex&amp;gt;  является корневым ациклическим ориентированным графом  с узлами  &amp;lt;tex&amp;gt; N&amp;lt;/tex&amp;gt; , ребрами  &amp;lt;tex&amp;gt; L \cup R&amp;lt;/tex&amp;gt; . &lt;br /&gt;
* В каждом из двух подграфов &amp;lt;tex&amp;gt; (N, L)  и (N, R)&amp;lt;/tex&amp;gt;  каждый узел имеет  не более одного прямого преемника . &lt;br /&gt;
*Узлы без каких-либо преемников (листья B) должны быть все элементами  &amp;lt;tex&amp;gt; X&amp;lt;/tex&amp;gt; .&lt;br /&gt;
}}&lt;br /&gt;
Дано двоичное дерево с несколькими ссылками  &amp;lt;tex&amp;gt; B = (N,L,R)&amp;lt;/tex&amp;gt;  и узел   &amp;lt;tex&amp;gt; p \in N&amp;lt;/tex&amp;gt; . Пишут  &amp;lt;tex&amp;gt; LEFT(p) = q&amp;lt;/tex&amp;gt; , если  &amp;lt;tex&amp;gt; q&amp;lt;/tex&amp;gt;  является единственным приемником   &amp;lt;tex&amp;gt;  p  в (N,L)&amp;lt;/tex&amp;gt;   и, если  такого  &amp;lt;tex&amp;gt; q&amp;lt;/tex&amp;gt;   не существует, пишем  &amp;lt;tex&amp;gt; LEFT(p)= \perp&amp;lt;/tex&amp;gt; ,  предполагая, что  &amp;lt;tex&amp;gt; \perp &amp;lt;/tex&amp;gt;  не содержит  &amp;lt;tex&amp;gt; N&amp;lt;/tex&amp;gt; . Аналогично, пишут  &amp;lt;tex&amp;gt; RIGHT(p) = q&amp;lt;/tex&amp;gt; , если  &amp;lt;tex&amp;gt; q&amp;lt;/tex&amp;gt;  является единственным приемником   &amp;lt;tex&amp;gt; p в(N,R)&amp;lt;/tex&amp;gt;  и, если  такого  &amp;lt;tex&amp;gt; q&amp;lt;/tex&amp;gt;  не существует, пишем  &amp;lt;tex&amp;gt; RIGHT(p)= \perp&amp;lt;/tex&amp;gt; . Мы будем называть  &amp;lt;tex&amp;gt; LEFT (p)&amp;lt;/tex&amp;gt;  левым дочерним элементом  &amp;lt;tex&amp;gt; p&amp;lt;/tex&amp;gt;  и  &amp;lt;tex&amp;gt; RIGHT (p) &amp;lt;/tex&amp;gt;  правым дочерним элементом.&lt;br /&gt;
В  &amp;lt;tex&amp;gt;  B = (N, L \cup R)&amp;lt;/tex&amp;gt;  узел  &amp;lt;tex&amp;gt; p \in N&amp;lt;/tex&amp;gt;  может иметь много прямых предшественников  &amp;lt;tex&amp;gt; q&amp;lt;/tex&amp;gt; . Тогда ребра  &amp;lt;tex&amp;gt; (q, p) \in E&amp;lt;/tex&amp;gt;  называют ссылками от  &amp;lt;tex&amp;gt; q&amp;lt;/tex&amp;gt;  до &amp;lt;tex&amp;gt;  p&amp;lt;/tex&amp;gt; .&lt;br /&gt;
&lt;br /&gt;
С каждым узлом  &amp;lt;tex&amp;gt; p \in N&amp;lt;/tex&amp;gt;  мы можем идентифицировать строку  &amp;lt;tex&amp;gt; seq (p) \in X &amp;lt;/tex&amp;gt;  :&lt;br /&gt;
 Если p - лист, то согласно определению выше, &amp;lt;tex&amp;gt;  p \in X&amp;lt;/tex&amp;gt; . Мы можем установить  &amp;lt;tex&amp;gt; seq (p) = x&amp;lt;/tex&amp;gt;  (строка, содержащая только x). Поскольку  &amp;lt;tex&amp;gt; (N, L \cup R )&amp;lt;/tex&amp;gt;  ациклично, для всех внутренних узлов мы можем рекурсивно определить  &amp;lt;tex&amp;gt; p \in N  seq (p) = seq (LEFT (p)) seq (RIGHT (p))&amp;lt;/tex&amp;gt; , задав  &amp;lt;tex&amp;gt; seq (\perp) = ε &amp;lt;tex&amp;gt; . Наконец, пусть r - корень B. Тогда определимseq (B): = seq (r). В качестве примера, см. рисунок 1.2.&lt;br /&gt;
В нашей реализации мы поддерживаем с каждым узлом  &amp;lt;tex&amp;gt; p \in N&amp;lt;/tex&amp;gt;  длину  &amp;lt;tex&amp;gt; seq (LEFT (p))&amp;lt;/tex&amp;gt; . Это позволяет получить&lt;br /&gt;
 &amp;lt;tex&amp;gt; i-й&amp;lt;/tex&amp;gt;  символ строки  &amp;lt;tex&amp;gt; seq (B)&amp;lt;/tex&amp;gt; , пройдя путь от корня до соответствующего листа. Мы также поддерживаем значение HEIGHT (p) для каждого  &amp;lt;tex&amp;gt; p \in N&amp;lt;/tex&amp;gt; , которое определяется как максимальная&lt;br /&gt;
длина пути от p до листа в  &amp;lt;tex&amp;gt; q \in N&amp;lt;/tex&amp;gt; . Согласно этому определению все листья имеют высоту  &amp;lt;tex&amp;gt; 0&amp;lt;/tex&amp;gt;  и если мы устанавливаем  &amp;lt;tex&amp;gt; HEIGHT (\perp) = -1&amp;lt;/tex&amp;gt; , то  &amp;lt;tex&amp;gt; HEIGHT(p) = max(HEIGHT(LEFT(p)), HEIGHT(RIGHT(p)))+1&amp;lt;/tex&amp;gt; .  для всех  &amp;lt;tex&amp;gt; .p \in N&amp;lt;/tex&amp;gt; ..&lt;br /&gt;
Чтобы сбалансировать структуру, мы используем AVL-условие для двоичных деревьев. &lt;br /&gt;
Def3 Бинарное дерево  &amp;lt;tex&amp;gt; B = (N, L, R) &amp;lt;/tex&amp;gt;  является AVL-деревом, если оно удовлетворяет условию AVL, то есть для каждого  &amp;lt;tex&amp;gt; p \in N  |HEIGHT(LEFT(p))− HEIGHT(RIGHT(p))| \le 1&amp;lt;/tex&amp;gt; .&lt;br /&gt;
1.2 конкатенация постоянных массивов, представленных в виде двоичных деревьев&lt;br /&gt;
Для полноты мы покажем операции для конкатенации • и расщепления  &amp;lt;tex&amp;gt;  (HEAD и TAIL) &amp;lt;/tex&amp;gt; , которые особенно просты в реализации, запускаются во времени  &amp;lt;tex&amp;gt; O (HEIGHT (r)) &amp;lt;/tex&amp;gt;  и позволяют нам реализовать полный интерфейс персистентного массива ADT. Для конкатенации см. Алгоритм 1.2.&lt;br /&gt;
  &amp;lt;tex&amp;gt; NODE (l, r) &amp;lt;/tex&amp;gt;  является конструктором, который выдает созданный узел  &amp;lt;tex&amp;gt; p с LEFT (p) = l и RIGHT (p) = r&amp;lt;/tex&amp;gt; . Конструктор также определяет правильные значения  &amp;lt;tex&amp;gt; p&amp;lt;/tex&amp;gt;  для  &amp;lt;tex&amp;gt; HEIGHT (p) и LENGTH (p) &amp;lt;/tex&amp;gt; .&lt;br /&gt;
Обратите внимание, что время его работы равно  &amp;lt;tex&amp;gt; O (| HEIGHT (r) -HEIGHT (l) |)&amp;lt;/tex&amp;gt; . Далее мы покажем алгоритм  &amp;lt;tex&amp;gt; HEAD&amp;lt;/tex&amp;gt; , алгоритм для  &amp;lt;tex&amp;gt; TAIL&amp;lt;/tex&amp;gt;  является симметричным. &lt;br /&gt;
1.3  Разделение персистентного массива, представленного как двоичное дерево.&lt;br /&gt;
Учитывая корневой узел r высоты h и целое число i, алгоритм 1.3 свяжет не более чем  &amp;lt;tex&amp;gt; h + 1&amp;lt;/tex&amp;gt;  двоичных дерева. Стоимость одной конкатенации пропорциональна разнице высот.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
При использовании RAW с ограниченным размером арифметических операций, ADT для персистентных массивов могут быть реализованы таким образом, чтобы каждая из его операций выполнялась во времени O (logn).Если длины массивов представляются внутри границ слова. В противном случае временная граница O (min ((log n)2, k2)). Здесь n - максимальная длина задействованных массивов, а k – число, которые были использованы для создания массивов операндов.&lt;br /&gt;
&lt;br /&gt;
==Литература==&lt;br /&gt;
*[Nobuhiro Izumi Hui-Hsiung &amp;quot;Acta Applicandae Texematicae&amp;quot;,79–87.Bell numbers, log-concavity, and log-convexity 2000]&lt;br /&gt;
*[Aitken A. C. Edinburgh Texematical Notes,18–23 A problem in combinations 1933]&lt;br /&gt;
*[H. W.BeckerJohn Riordan &amp;quot;The arithmetic of Bell and Stirling numbers&amp;quot; American Journal of Texematics,1948,385–394]&lt;br /&gt;
*[E. T.Bell Exponential polynomials,Annals of Texematics,1934, 258–277]&lt;br /&gt;
*[E. T.Bell The iterated exponential integers,Annals of Texematics,1938,539–557]&lt;br /&gt;
*[http://www.tex.ucsd.edu/~ebender/CombText/ch-11.pdf Bender Edward A.Williamson, S. Gill, Set Partitions, 319–320, 2006]&lt;br /&gt;
* [[wikipedia:Bell numbers| Bell numbers]]&lt;br /&gt;
&lt;br /&gt;
==Примeчания==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
--[[Участник:MikeTerentyev|MikeTerentyev]] 16:07, 8 октября 2017 (MSK)MikeTerentyev&lt;br /&gt;
[[Категория: Алгоритмы и структуры данных]]&lt;/div&gt;</summary>
		<author><name>92.255.89.62</name></author>	</entry>

	</feed>