390
правок
Изменения
→Построение
==Построение==
Допустим, что нам задан односвязный отсортированный списоки мы хотим построить на его основе список с пропусками, позволяющий в среднем за <tex>O(\log{n})</tex> времени выполнять операции добавления, удаления и поиска элементов.
[[Файл:SkipList.png]]
Функция <tex>\ \mathtt{buildLvlbuild\_lvl} \ </tex> возвращает новый уровень списка с пропусками на основе предыдущего построенного уровня.
'''list''' buildLvl build_lvl ('''list''' lvl) <font color=darkgreen>// Отсеивание нечётных элементов</font> '''list''' nextLvl next_lvl
'''node''' i = lvl.head() <font color=darkgreen>// Перебор всех элементов lvl</font>
'''while''' (i != ''null'') '''and''' (i != lvl.tail())
i = i.next.next <font color=darkgreen>// Переход к следующему чётному элементу</font>
'''return''' nextLvl next_lvl
Функция <tex>\ \mathtt{skipListskip\_list} \ </tex> принимает в качестве аргумента односвязный отсортированный список и возвращает новый список с пропусками, построенный на его основе.
'''list''' skipList skip_list ('''list''' l): '''list''' lvl = buildLvlbuild_lvl(l) <font color=darkgreen>// Построение первого уровня</font> '''while''' lvl.size() > 2 <font color=darkgreen>// Добавление следующих уровней; последний содержит не более двух элементов</font> lvl = buildLvl build_lvl (lvl) '''return''' lvl <font color=darkgreen>// Возвращает ссылку на начало верхнего уровня</font>
==Операции над структурой==