БИНАРНЫЙ ПОИСК.ppt
- Количество слайдов: 22
Бинарные деревья поиска Дepeво - это либо пустое дерево, либо узел с конечным числом связанных с ним отдельных деревьев, именуемых поддеревьями. Бинарные деревья nоиска, это деревья, у которых каждый узел имеет не более двух дочерних узлов, причем левый и правый узлы различаются. У каждоrо узла дерева есть поле значения, хранящееся в узле, и поля, указывающие на левый и правый потомки данноrо узла, а также на родительский узел.
Бинарным деревом поиска ero делает следующее свойство: значения в узлах дерева располаrаются таким образом, что в любой момент для любоrо узла х значения всех узлов в ero левом поддереве не превышают значения узла х, а значения всех узлов в ero правом поддереве не меньше значения узла х.
БИНАРНЫЙ ПОИСК Дерево Бинарное дерево поиска
ОДНО ИЗ ПРЕДСТАВЛЕНИЙ БИНАРНОГО ДЕРЕВА ПОИСКА
Выполнение операции поиска основано на том, что, находясь на определенной вершине, можно всегда однозначно указать, в каком из поддеревьев находится искомое значение (если таковое имеется в данном дереве), так как, согласно свойству бинарного дерева поиска все значения узлов в левом поддереве не больше, а в правом меньше значения в не
Поиск наименьшеrо и наибольшеrо элементов в бинарном дереве поиска Чтобы достичь наименьшеrо (наибольшеrо) элемента, надо двиrаться по левым (или соответственно правым) ветвям дерева до тех пор, пока это возможно.
Поиск очередноrо и предшествующеrо узла Эта задача решается без выполнения непосредственноrо сравнения узлов, с использованием исключительно знаний о структуре дерева. Рассмотрим поиск следующеrо за х элемента. Если правое поддерево х непустое, то очевидно, что следующий за х элемент это минимальный элемент правоrо поддерева. Если же правое поддерево х пустое и у х имеется следующий за ним элемент у, то у наименьший предок х, левый наследник котoporo, также является предком х.
На рис. в следующим за элементом 3 идет элемент 4, левый потомок котoporo 2 является предком 3. Для поиска такого предка мы просто идем по дереву в направлении корня, пока не найдем узел, который является левым дочерним узлом cвoeгo родителя (им может оказаться и сам текущий узел).
Вставка узла в дерево и ero удаление из дерева Сначала выполняем поиск места, куда следует вставить новый узел. а затем вставляем ero, изменяя поля у встaвляемоrо узла и егo родительскоrо узла. Tree. Insert(root, z) // Входные данные: узел z, добавляемый в дерево с корневым узлом root / / Выходные данные: дерево с добавленным в негo узлом z у=о х = root while (х # О) do begin у = х; if (value[z] < value[x]) then х = left [ х] else х= right [ х] end; parent [z] = у if у = о then root = z // Вставка в пустое дерево else if value[z] < value[y] then left [у] = z else right [у] = z
Процедура начинает работу с кopнeвoгo узла и идет вниз, перемещая указатель х. При проходе вниз указатель у постоянно указывает на родительский по отношению к х узел, а сам указатель перемещается в соответствии с результатами сравнения значений в текущем и встaвляемом узлах. После тoгo, как указатель х становится равным 0, он нaходится именно в той позиции, куда следует поместить новый узел z.
Процедура удаления узла из дерева несколько сложнее, поскольку должна рассматривать различные варианты. Так, если у удаляемого узла нет дочерних узлов, то удаление сводится к тому, чтобы в родительском узле обнулить тот указатель на дочерний узел, который в настоящий момент указывает на удаляемый узел.
Если у удаляемого узла только один дочерний узел, то удаление также легко осуществить. В этом случае соответствующий указатель в родительском узле должен указывать на дочерний по отношению к удаляемому узел. Соответственно должен быть исправлен и указатель на родительский узел в дочернем по отношению к удаляемому.
Если же у удаляемого узла два дочерних, то надо найти следующий за ним узел (у котopoгo не может быть левого дочернего узла в силу свойства бинарного дерева поиска), извлечь eгo из дерева и заменить им удаляемый узел.
Последовательный поиск Данная функция проверяет, находится ли число v среди элементов массива а[1], а[1+1], . . . , а[r] путем последовательного сравнения с каждым элементом, начиная с начала. Если по достижении последнего элемента нужное значение не найдено, то функция возвращает значение -1. Иначе она возвращает индекс элемента массива, содержащего искомое число. int search(int a[], int v, int 1, int r) { for (int i = 1; i <= r; i ++) if (v = = a[i]) return i; return -1; }
Последовательный поиск исследует N чисел при каждом неуспешном поиске и в среднем порядка N/2 чисел при каждом успешном поиске. Алгоритм последовательного поиска в упорядоченной таблице проверяет N чисел для каждого поиска в худшем случае и порядка N/2 чисел в среднем.
Бинарный поиск int search(int a[], int v, int 1, int r) { while (r >= 1) { int m = (l+r)/2; if (v == a[m]) return m; if (v < a[m]) r = m-1; else 1 = m+1 ; } return -1; }
Если числа в таблице упорядочены, можно отбросить половину из них, после сравнения искомого значения с числом из середины таблицы. Если они равны, то поиск прошел успешно, если искомое число меньше, то мы применим такой же метод к левой части таблицы, если больше — то к правой. На рис. представлен пример выполнения этого метода над набором чисел. Бинарный поиск исследует не более [lg. N]+1 чисел.
1488 1578 1973 3665 4426 4548 5435 5435 5446 6333 6385 6455 6504 6937 6965 7104 7230 8340 8958 9208 9364 9550 9645 9686 БИНАРНЫЙ ПОИСК Чтобы проверить, содержится ли число 5025 в таблице, приведенной в левой колонке, мы сначала сравниваем его с 6504, из чего следует, что дальше необходимо рассматривать первую половину массива. Затем производится сравнение с числом 4548 (середина первой половины), после чего исследуется вторая половина первой половины. Мы продолжаем этот процесс, работая с подмассивом, в котором может содержаться искомое число, если оно есть в таблице. В заключение мы получаем подмассив с одним элементом, не равным 5025, из чего следует, что 5025 в таблице не содержится.
Эмпирическое изучение последовательного и бинарного поиска
БИНАРНЫЙ ПОИСК.ppt