Изменения

Перейти к: навигация, поиск

Персистентный массив

40 байт добавлено, 03:16, 2 декабря 2017
Интерфейс
==Интерфейс==
* '''<tex>[ X ]''' </tex> статический конструктор, который принимает элемент X и возвращает массив, который содержит X в качестве его единственного элемента.* '''<tex>LENGTH''' [A] </tex> возвращает длину массива A.
* ε является пустым массивом, иногда также обозначается []
* '''<tex>A''' [i] </tex> принимает массив </tex> A = [''a''<sub>0</sub>a_0, ..., ana_n-1] </tex> и индекс ''<tex> i'' = 0..''n''-1</tex>, затем возвращает ''a''<sub>i</subtex>a_i.* '''<tex>CONCATENATE'''(A,B) </tex> конкатентирует два массива: <tex> if '' A'' = [''a''<sub>0</sub>a_0,...,''a''<sub>a_{n-1} ] </subtex>] and ''<tex> B'' = [''b''<sub>0</sub>b_0,...,''b''<sub>b_{m-1</sub>} ], ''n'',''m'' ≥ \geq 0</tex>, результат будет [''a''<sub>0</subtex>[a_0 ,...,''a''<sub>a_{n−1</sub>},"b"<sub>0</sub>b_0,...,''b''<sub>b_{m-1}] </subtex>]. Часто записывается как ''<tex> A'' · ''B'' </tex> вместо '''<tex>CONCATENATE'''</tex>(''A'',''B'').* '''<tex>HEAD'''</tex>(A,''i'') принимает на вход массив ''<tex> A'' = [''a''<sub>0</sub>a_0,...,''a''a_{n−1}] </tex> и производный '' <tex> int''</tex>, возвращает массив <tex> [''a''0a_0,...,''amina_{min(i−1,n−1)'' } ]</tex>. Если ''<tex> i'' < 0 </tex> результатом будет <tex> []</tex>.* '''<tex>TAIL'''(''A'',''i'') </tex> принимает на вход массив ''<tex> A'' = ["a"<sub>0</sub>a_0,...,an−1a_n−1] </tex> и производный <tex> int</tex>, возвращает массив <tex> [''amaxa_{max(''i'',0)'' } ,...,''a''a_{n−1}]</tex>. Если ''<tex> i'' ≥ ''\geq n''</tex>, результатом будет <tex> []</tex>.* '''<tex>B''' </tex> - структура, то ''<tex> seq (''B'')'' </tex> обозначает строку, которая представлена ''<tex> B''</tex>.
Основываясь на вышеприведенных операциях, ADT может быть расширен следующими операциями:
* '''<tex>[''x''0x0,..., ''x''x_{n−1}]''' </tex> является сокращением для '''<tex>CONCATENATE'''([x0x_0],'''CONCATENATE'''([x1x_1],'''CONCATENATE'''(...,'''CONCATENATE'''([''x''x_{n−2}],[''x''x_{n−1}])))) </tex> . Обратите внимание, что в программе оценка этого выражения всегда включает ''<tex> n-2'' </tex> конкатенации.* '''<tex>REVERSE'''[''A''] </tex> принимает на вход массив <tex> A = [''a''0a_0,...,''a''<sub>a_{n-1}] </subtex>] и возвращает [''a''<subtex>[a_{n-1</sub>},...,a0a_0]</tex>. * '''<tex>REPLACE'''[A,i, x] </tex> принимает на вход массив <tex> A = [''a''0a_0,...,''a''<sub>a_{n-1}]</subtex>] , индекс ''<tex> i'' = 0..''n'' − 1</tex>, и новый элемент ''<tex>x''</tex>, выводит [''a''<sub>0</subtex>[a_0,...,''a''<sub>a_{i-1</sub>}, ''x'',''a''<sub>a_{i+1</sub>},...,''a''<sub>a_{n-1}]</subtex>]. * '''''<tex>A''[i] ← ''\leftarrow x '''''</tex>является сокращенным обозначением <tex>A \leftarrow REPLACE(A,''i'', ''x'')</tex>. * '''<tex>INSERT'''[A,i, x] </tex> получает массив <tex> A = [''a''0a_0,...,''a''<sub>a_{n-1}]</subtex>] , индекс ''<tex> i'' = 0..n−1n-1 </tex> , и новый элемент <tex> x </tex> и возвращает массив <tex> [''a''0a_0,...,''a''<sub>a_{i-1</sub>}, x,''a''i a_i ,...,''a''a_{n−1}] = '''HEAD'''(A,''i'') · [''x''] · '''TAIL'''(A,''i)''</tex> , длина которого ''<tex> n''-1</tex> .* '''<tex>LEFTPART'''(A)</tex>: возвращает (non-deterministically) массив, представляющий последовательность префикса A.* ''' <tex> RIGHTPART'''(A)</tex> : возвращает (non-deterministically) массив, представляющий последовательность суффикса <tex> A</tex> .
==Реализация персистентных массивом в виде сбалансированных деревьев==
288
правок

Навигация