Список с пропусками — различия между версиями

Материал из Викиконспекты
Перейти к: навигация, поиск
(Поиск элемента)
(Вставка элемента)
Строка 31: Строка 31:
  
 
===Вставка элемента===
 
===Вставка элемента===
Todo
+
Для вставки элемента в список с пропусками, нам необходимо выполнить следующие шаги:
 +
# Найти с помощью алгоритма поиска позицию, куда нам надо вставить этот элемент
 +
# Вставить наш элемент в нижний уровень списка с пропусками
 +
# «Подбросить монетку» и в зависимости от результата протолкнуть элемент на уровень выше
 +
# Повторять предыдущий шаг до тех пор, пока у нас «подброс монетки» дает положительный результат
 +
 
 +
Таким образом, если использовать честную монету, то математическое ожидание количества элементов на втором уровне равняется <tex>\frac{n}{2}</tex>, на третьем уровне <tex>\frac{n}{5}</tex> и т.д. На уровне <tex>log(n)</tex> у нас окажется <tex>\frac{n}{2^n}</tex> элементов.
 +
 
 
===Удаление элемента===
 
===Удаление элемента===
 
Todo
 
Todo

Версия 17:45, 29 мая 2012

Список с пропусками (skip-list) — одна из вероятностных структур данных, на ряде параллельных отсортированных связных списков с эффективностью, сравнимой с бинарными деревьями поиска. Все операции со списком с пропусками осуществляются за [math]O(\log{n})[/math] с большой вероятностью.

Отсортированный связный список является простейшей структурой со временем поиска [math]\theta(n)[/math]. Одним из способов улучшить асимптотику данной структуры является добавление дополнительного уровня, обеспечивающего быстрый доступ через несколько элементов.

Операции над структурой

Поиск элемента

Допустим, что в нашем списке с пропусками существуют два уровня: [math]L_1[/math], в котором содержатся все элементы и [math]L_2[/math], в котором присутствует только часть из них. Между одинаковыми элементами этих двух списков существуют ссылки.

В таком случае алгоритм поиска в этой структуре будет представлять из себя следующие операции:

  1. Начинаем поиск элемента в верхнем левом углу
  2. Передвигаться будем по списку [math]L_2[/math], пока значение в следующей ячейке меньше или равно ключу
  3. Переместиться в нижний уровень и продолжить аналогичный метод поиска по списку [math]L_1[/math]

Тогда время работы алгоритма поиска будет зависеть от количества элементов на уровне [math]L_2[/math]. Представим, что на этот уровень у нас случайным образом попало несколько элементов. Следовательно в худшем случае поиска мы получим следующую оценку на время работы:

[math] \approx \vert L_2\vert + \frac{\vert L_1\vert }{\vert L_2\vert } = \vert L_2\vert + \frac{n}{\vert L_2\vert }[/math]

Минимизируя, мы получаем, что [math]\vert L_2 \vert ^ 2 = n[/math]

В итоге время за которое мы найдем элемент в списке с пропусками с двумя уровнями будет равняться:

[math] \sqrt{n} + \frac{n}{\sqrt{n}} = 2 \sqrt{n}[/math]

Делая аналогичные подсчеты для списков с пропусками, в которых содержится больше уровней, получаем:

  • Для трех уровней: [math] 3 \sqrt[3]{n}[/math]
  • Для четырех уровней: [math] 4 \sqrt[4]{n}[/math]
  • Для пяти уровней: [math] 5 \sqrt[5]{n}[/math]
  • Для [math]\log{n}[/math] уровней: [math] \log{n} \sqrt[\log{n}]{n} = 2 \log{n}[/math]

В списках с пропусками, в которых содержится [math]\log{n}[/math] уровней будет себя вести очень похоже на сбалансированные бинарные деревья поиска. В идеальной данной структуре соотношение между соседними уровнями будет равняться двум. Поиск в [math]\log{n}[/math] списке с пропусками будет осуществляться за асимптотическое время [math]O(\log{n})[/math].

Вставка элемента

Для вставки элемента в список с пропусками, нам необходимо выполнить следующие шаги:

  1. Найти с помощью алгоритма поиска позицию, куда нам надо вставить этот элемент
  2. Вставить наш элемент в нижний уровень списка с пропусками
  3. «Подбросить монетку» и в зависимости от результата протолкнуть элемент на уровень выше
  4. Повторять предыдущий шаг до тех пор, пока у нас «подброс монетки» дает положительный результат

Таким образом, если использовать честную монету, то математическое ожидание количества элементов на втором уровне равняется [math]\frac{n}{2}[/math], на третьем уровне [math]\frac{n}{5}[/math] и т.д. На уровне [math]log(n)[/math] у нас окажется [math]\frac{n}{2^n}[/math] элементов.

Удаление элемента

Todo