Лекция №7. Поиск. Деревья поиска. Предмет "Структуры и алгоритмы обработки данных" - Presentation Transcript
Хакасский государственный университет им. Н.Ф. Катанова
Структуры и алгоритмы обработки данных
Лекция: Поиск. Бинарный поиск. Деревья
поиска.
Николай Гребенщиков, www.grebenshikov.ru
Задача поиска - очень широкая.
Дано: множество элементов.
Найти: подмножество по заданным критериям поиска.
Что можно искать? Какие могут быть критерии поиска?
1
Из чего складывается время работы поиска - T (n)
• Tprepare(n) - подготовительная часть - организация струк-
туры данных для множества элементов
• Tf ind(n) - сам поиск - время работы алгоритма поиска
2
Поиск по ключу
1 class SomeData<K,D> {
2 K key;
3 D data;
4 }
Дано: множество элементов с заданным ключом. Условие:
на множестве возможных ключей можно установить отношее
порядка.
Найти: подмножество элементов с ключом равным заданно-
му.
3
Бинарный поиск - алгоритм поиска элемента x в отсорти-
рованном списке A длинны n.
1. Сравнить x c A [ n/2 ], если x = A [ n/2 ], то мы нашли.
2. Запустить рекурсию поиска с подсписком [0, n/2 − 1],
если x < A [ n/2 ] иначе с подсписком [ n/2 + 1, n + 1]
5
Бинарный поиск
A:
0 1 2 3 4 5 6 7 8 9
1 2 32 47 63 64 86 89 91 95
Найти x = 64
1. [0, 9] : x > A[4] = 63
2. [5, 9] : x < A[7] = 89
3. [5, 6] : x < A[6] = 86
4. [5, 5] : x = A[5] = 64 - Успех
6
Бинарный поиск - http://algolist.manual.ru
1 int function binarySearch (Array A, int lB, int uB, K key) {
2 while (true) {
3 M = (Lb + Ub)/2;
4 if (key < A[M]) then
5 Ub = M - 1;
6 else if (Key > A[M]) then
7 Lb = M + 1;
8 else
9 return M;
10 if (Lb > Ub) then
11 return -1;
12 }
13 }
8
Бинарный поиск - Скорость работы
• Tprepare(n) = O(log(n)) или O(n) - зависит от способа сор-
тировки - разберем позже.
• Tf ind(n) = O(log(n)) - докажем сейчас.
T (n) = T (n/2) + Θ(1)
Используем основной метод:
nlog21 = n0 = 1 = Θ(1) = f (n) ⇒ Второй случай
⇒ T (n) = Θ(log(n))
9
Двоичное/бинарное дерево поиска (англ. binary search tree,
BST) - это двоичное дерево, для которого выполняются сле-
дующие дополнительные условия:
• У всех узлов левого поддерева произвольного узла X зна-
чения ключей меньше, нежели значение ключа узла X.
• У всех узлов правого поддерева произвольного узла X
значения ключей не меньше, нежели значение ключа узла
X.
• Оба поддерева - левое и правое, являются двоичными
деревьями поиска.
10
Бинарное дерево поиска - Пример
11
АТД Бинарное дерево поиска
1 class SearchTreeNode<T> {
2 public Comparable key;
3 public T value;
4 }
5 interface SearchTree<T> {
6 void insert(SearchTreeNode<T> node);
7 void remove(Comparable key);
8 SearchTreeNode<T> find(Comparable key);
9 }
12
Бинарное дерево поиска - Вставка
1. Найти место для вставки, используя алгоритм поиска.
2. Вставить.
15
Бинарное дерево поиска - Скорость работы
Tinsert(n) = O(H(n))
Tprepare(n) = O(n · H(n))
Tf ind(n) = O(H(n))
H(n) - высота дерева. H(n) =?
16
Бинарное дерево поиска
Высота дерева зависит от данных и последовательности за-
полнения им дерева.
Например: H(n) = n
Тогда: Tprepare(n) = O(n2), Tf ind(n) = O(n)
17
Бинарное дерево поиска - Примеры высот
• Для полного дерева - H(n) = log2(n)
• Для случайного дерева (равномерное распределение) -
H(n) = O(log(n)) - доказательство, можно взять как до-
клад на семинар.
18
Сбалансированные деревья поиска - это деревья поиска,
структура которых поддерживается приближенной к стурк-
туре полного дерева, и высота таких деревьев равна O(log(n)).
Методы поддержания баланса бинарных деревьев поиска:
• АВЛ-дерево
• 2-3-дерево (доклад на семинар)
• Красно-черные деревья (доклад на семинар)
• и другие (доклады на семинаре)
19
АВЛ-дерево - сбалансированное по высоте двоичное дерево
поиска: для каждой его вершины высота её двух поддеревьев
различается не более чем на 1.
Оно названо по первым буквам фамилий его изобретателей,
Г. М. Адельсона-Вельского и Е. М. Ландиса, которые впер-
вые предложили использовать АВЛ-деревья в 1962.
20
Пример АВЛ-дерева
21
Пример не АВЛ-дерева
22
АВЛ-дерево - скорость работы.
Найдем высоту дерева - H(n).
1. Пусть N (h) - минимальное количество узлов для АВЛ-
дерева высотой h.
2. N (h) = 1 + N (h − 1) + N (h − 2) ⇒ N (h) > Fh, где Fh - h-е
число Фиббоначи.
ϕh ϕh
√ , тогда N (h) > √ ⇒ H(n) < logϕ (n ·
3. Известно, что Fh =
√ 5 5
5)
4. H(n) = O(log(n))
23
АВЛ-дерево - скорость работы.
Tprepare(n) = O(n · log(n))
Tf ind(n) = O(log(n))
24
Механизм поддержание сбалансированности АВЛ-дерева
- изменение структуры дерева при добавлении и удалении
элементов.
Повороты:
• Левый
• Правый
• Лево-правый
• Право-левый
25
Список литературы
• Ахо А., Хопкрофт Д., Ульман Д. Структуры данных и
алгоритмы. - М. : Издательский дом “Вильямс”, 2000.
сс.146-182.
• Кормен Т., Лейзерсон Ч., Ривест Р., Штайн К. Алгорит-
мы: построение и анализ, 2-е издание. - М. : Издатель-
ский дом “Вильямс”, 2007. сс.103-104, 316-364.
• Кнут Д, Искусство программирования, том 3. Сортировка
и поиск, 2-е изд. - М. : Издательский дома “Вильямс”,
2000. сс.425-526.
30
0 comments
Post a comment