Изменения

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

Список с пропусками

790 байт добавлено, 23:02, 20 марта 2019
Нет описания правки
==Построение==
 
Допустим, что нам задан односвязный отсортированный список.
 
[[Файл:SimpleList.png]]
 Тогда на самом нижнем <tex>L_1</tex>-ом первом уровне мы расположим все элементы списка в таком же порядкезаданный список, на <tex>L_2</tex>-ом втором <tex>-</tex> только элементы с чётными номерамис ссылками на соответствующие элементы первого уровня, на <tex>L_3</tex> третьем <tex>-</tex> с номерами , кратными <tex>4</tex> , и так далее. Такой список будет позволять в среднем за <tex>O(\log{n})</tex> выполнять операции поиска, добавления и удаления элементов. 
[[Файл:SkipList.png]]
 
 
Функция <tex>\ \mathtt{buildLvl} \ </tex> возвращает новый уровень списка с пропусками на основе предыдущего построенного уровня.
 
'''list''' buildLvl ('''list''' lvl) <font color=darkgreen>// Отсеивание нечётных элементов</font>
'''list''' nextLvl
'''node''' i = lvl.head() <font color=darkgreen>// Перебор всех элементов lvl</font>
'''while''' (i != ''null'') '''and''' (i != lvl.tail())
nextLvl.push_back(node(i.key, i)) <font color=darkgreen>// Конструктор node(key, down) возвращает новую вершину с ключом key и ссылкой down на соответствующую вершину предыдущего уровеня</font>
i = i.next.next <font color=darkgreen>// Переход к следующему чётному элементу</font>
'''return''' nextLvl
 
Функция <tex>\ \mathtt{skipList} \ </tex> принимает в качестве аргумента односвязный отсортированный список и возвращает новый список с пропусками, построенный на его основе.
 
'''list''' skipList ('''list''' l):
'''list''' lvl = buildLvl(l) <font color=darkgreen>// Построение первого уровня</font>
'''while''' lvl.size() > 2 <font color=darkgreen>// Добавление следующих уровней; последний содержит не более двух элементов</font>
lvl = buildLvl (lvl)
'''return''' lvl <font color=darkgreen>// Возвращает ссылку на начало верхнего уровня</font>
==Операции над структурой==
* <tex>key</tex> {{---}} ключ типа K
Конструктор
<code>
'''list''' skip_list ('''list''' l):
'''list''' lvl = build_lvl(l) <font color=darkgreen>// Здесь происходит построение первого уровня</font>
'''while''' lvl.size() > 2
lvl = build_lvl (lvl) <font color=darkgreen>// Добавление следующих уровней; последний содержит два элемента</font>
'''return''' t
 
'''list''' build_lvl ('''list''' lvl) <font color=darkgreen>// Отсеивание нечётных элементов</font>
'''list''' next_lvl
'''node''' i = lvl.head() <font color=darkgreen>// Перебор всех элементов lvl</font>
'''while''' (i != ''null'') '''and''' (i != lvl.tail())
next_lvl.push_back(node(i.key, i)) <font color=darkgreen>// Добавление чётного элемента;</font>
i = i.next.next <font color=darkgreen>// он содержит ключ и ссылку на предыдущий уровень</font>
'''return''' next_lvl
</code>
Поиск элемента по ключу:
<code>
390
правок

Навигация