Изменения

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

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

781 байт добавлено, 20:11, 22 марта 2019
Поиск элемента
==Операции над структурой==
===Поиск элемента===
 
[[Файл:SkipListSearch.png|thumb|600px|Пример поиска числа <tex>8</tex>]]
Допустим, что в нашем списке с пропусками существуют <tex>k</tex> уровней, при этом первым уровнем будет исходный список.
В таком случае алгоритм поиска в этой структуре будет представлять из себя следующие операции:
# Начинаем поиск элемента в самом верхнем списке(<tex>k</tex>-ом) уровне# Переходим к следующему элементу списка, пока значение в следующей ячейке меньше или равно ключу
# Переместиться на один уровень вниз и перейти к шагу <tex>2</tex>. Если мы уже были на первом уровне <tex>-</tex> прекратить поиск.
Пример поиска числа В конце алгоритма функция вернёт элемент, значение которого не меньше ключа <tex>8key</tex> в списке из описания:или ссылку на хвост списка на первом уровне.
Если в качестве случайного источника мы будем использовать честную монету, то в среднем случае будет <tex>\log{n}</tex> уровне. На самом верхнем уровне будет не более двух элементов. Тогда на каждом уровне в среднем нужно проверить не более двух элементов (в противном случае могли бы вместо двух нижних элементов проверить ещё один уровнем выше). Уровней всего <tex>\log{n}</tex>, откуда вытекает оценка времени поиска элемента в <tex>O(\log{n})</tex>.
[[Файл:SkipListSearch.png]]====Псевдокод====
Функция <tex>\mathtt{find}</tex> возвращает ссылку на элемент, значение которого не меньше <tex>\mathtt{key}</tex>. В случае, если все элементы в списке с пропусками меньше <tex>\mathtt{key}</tex>, то возвращается ссылка на конец списка с пропусками.
'''T''' find ('''node''' res, '''K''' key)
'''while''' res.key < key <font color=darkgreen>// Пока значение вершины меньше ключа</font>
res = res.next() <font color=darkgreen>// Перейдём к следующей вершине в текущем уровне</font>
'''if''' res.down = ''null'' <font color=darkgreen>// Если мы находимся на первом уровне</font>
'''return''' res <font color=darkgreen>// Мы нашли искомый элемент</font>
'''return''' find(res.down, key) <font color=darkgreen>// Иначе спустимся на один уровень ниже</font>
Если в качестве случайного источника мы будем использовать честную монетуДля того, то в среднем случае будет чтобы найти элемент с ключом <tex>\logmathtt{nkey}</tex> уровне. На самом верхнем уровне будет не более двух элементов. Тогда на каждом уровне в среднем нужно проверить не более двух элементов (в противном случае могли бы вместо двух нижних элементов проверить ещё один уровнем выше). Уровней всего списке с пропусками <tex>\logmathtt{nlist}</tex>, откуда вытекает оценка времени поиска элемента в необходимо запустить <tex>O(\logmathtt{nfind})</tex>.следующим образом
Функция <tex>\mathtt{find}</tex> возвращает ссылку на элемент, значение которого не меньше <tex>\mathtt{key}</tex>. В случае, если все элементы в списке с пропусками меньше <tex>\mathtt{key}</tex>, то возвращается ссылка на конец списка с пропусками. '''T''' find ('''list''' skip_list, '''K''' key) '''node''' res '''for''' (res = skip_list.head; res.ref != ''null''; res = res.ref() <font color=darkgreen>// Пока ещё не дошли до первого уровня </font> '''while''' res., key < key <font color=darkgreen>// Пока значение вершины меньше ключа</font> res = res.next() <font color=darkgreen>// Перейти к следующей вершине в текущем уровне</font> '''return''' res
===Вставка элемента===
390
правок

Навигация