Список с пропусками — различия между версиями
GosuGDR (обсуждение | вклад) (→Поиск элемента) |
GosuGDR (обсуждение | вклад) (→Вставка элемента) |
||
| Строка 31: | Строка 31: | ||
===Вставка элемента=== | ===Вставка элемента=== | ||
| − | + | Для вставки элемента в список с пропусками, нам необходимо выполнить следующие шаги: | |
| + | # Найти с помощью алгоритма поиска позицию, куда нам надо вставить этот элемент | ||
| + | # Вставить наш элемент в нижний уровень списка с пропусками | ||
| + | # «Подбросить монетку» и в зависимости от результата протолкнуть элемент на уровень выше | ||
| + | # Повторять предыдущий шаг до тех пор, пока у нас «подброс монетки» дает положительный результат | ||
| + | |||
| + | Таким образом, если использовать честную монету, то математическое ожидание количества элементов на втором уровне равняется <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) — одна из вероятностных структур данных, на ряде параллельных отсортированных связных списков с эффективностью, сравнимой с бинарными деревьями поиска. Все операции со списком с пропусками осуществляются за с большой вероятностью.
Отсортированный связный список является простейшей структурой со временем поиска . Одним из способов улучшить асимптотику данной структуры является добавление дополнительного уровня, обеспечивающего быстрый доступ через несколько элементов.
Операции над структурой
Поиск элемента
Допустим, что в нашем списке с пропусками существуют два уровня: , в котором содержатся все элементы и , в котором присутствует только часть из них. Между одинаковыми элементами этих двух списков существуют ссылки.
В таком случае алгоритм поиска в этой структуре будет представлять из себя следующие операции:
- Начинаем поиск элемента в верхнем левом углу
- Передвигаться будем по списку , пока значение в следующей ячейке меньше или равно ключу
- Переместиться в нижний уровень и продолжить аналогичный метод поиска по списку
Тогда время работы алгоритма поиска будет зависеть от количества элементов на уровне . Представим, что на этот уровень у нас случайным образом попало несколько элементов. Следовательно в худшем случае поиска мы получим следующую оценку на время работы:
Минимизируя, мы получаем, что
В итоге время за которое мы найдем элемент в списке с пропусками с двумя уровнями будет равняться:
Делая аналогичные подсчеты для списков с пропусками, в которых содержится больше уровней, получаем:
- Для трех уровней:
- Для четырех уровней:
- Для пяти уровней:
- Для уровней:
В списках с пропусками, в которых содержится уровней будет себя вести очень похоже на сбалансированные бинарные деревья поиска. В идеальной данной структуре соотношение между соседними уровнями будет равняться двум. Поиск в списке с пропусками будет осуществляться за асимптотическое время .
Вставка элемента
Для вставки элемента в список с пропусками, нам необходимо выполнить следующие шаги:
- Найти с помощью алгоритма поиска позицию, куда нам надо вставить этот элемент
- Вставить наш элемент в нижний уровень списка с пропусками
- «Подбросить монетку» и в зависимости от результата протолкнуть элемент на уровень выше
- Повторять предыдущий шаг до тех пор, пока у нас «подброс монетки» дает положительный результат
Таким образом, если использовать честную монету, то математическое ожидание количества элементов на втором уровне равняется , на третьем уровне и т.д. На уровне у нас окажется элементов.
Удаление элемента
Todo