Читайте также: |
|
Пусть дан пирамидально-упорядоченный массив Ai, (i=1,…,N). Требуется добавить к нему еще один элемент Ai+1 и переупорядочить массив. Для этого введем текущий номер элемента в массиве k. В начальный момент положим k= N+1.
Свойство пирамидально-упорядоченности выполняется для всех соответствующих пар элементов, кроме, быть может, пары (k,k/2). Если для этой пары свойство A[k/2] ³ Ak выполняется, то массив пирамидально упорядочен и ничего больше делать не надо. Иначе поменяем местами пару элементов с индексами k и k/2. При этом элемент с индексом k/2 не уменьшится, поэтому поддерево, с него начинающееся, но идущее по другой ветке, чем (k,k/2) останется пирамидально-упорядоченным (т.е., например для четного k, останется верным A[k/2] ³ Ak+1).
Перед обменом местами элементов с индексами (k,k/2), элемент A[k/2] был не меньше всех элементов в поддереве, начинающегося с A[k/2], кроме, быть может, Ak. Поэтому, после обмена местами элементов с индексами (k,k/2), элемент Ak будет не меньше всех элементов в поддереве, начинающегося с Ak. Осталось присвоить k=[k/2], и выполнить те же самые действия для нового k.
Таким образом, мы произведем не более [log N]+1 обменов местами соседних элементов, из чего следует, что процедура добавления элемента в пирамиду может быть произведена за время O(log N).
Корректировка положения элемента
Пусть дан пирамидально-упорядоченный массив Ai, (i=1,…,N). Для текущего элемента в массиве с номером k изменим значение элемента Ak. Требуется переупорядочить массив.
Если Ak³ A2k и Ak³ A2k+1, то задача полностью сводится к предыдущей.
Пусть, для определенности, Ak< A2k. Но тогда A[k/2] ³ Ak (т.к. A[k/2] ³ A2k> Ak), из чего получаем, что все элементы из поддерева, начинающегося с k- го элемента массива не превосходят A[k/2]. В этом случае возможно применить процедуру Heapify(A,k,N). Время ее работы O(log N).
¢
Лекция 9
Бинарные деревья поиска
Бинарными деревьями называют деревья, в которых, как правило, задан корневой элемент или корень и для каждой вершины существует не более двух потомков. Например, для задания одной вершины бинарного дерева целых чисел в языке С можно использовать следующую структуру
Typedef struct STree_
{
Int value;
struct STree_ *prev;
struct STree_ *left, *right;
} STree;
здесь указатель prev указывает на родительский элемент данной вершины, а left и right – на двух потомков, которых традиционно называют левым и правым. Величина value называется ключом вершины.
Бинарное дерево называется деревом поиска, если для любой вершины дерева a ключи всех вершин в правом поддереве больше или равны ключа a, а в левом – меньше. Неравенства можно заменить на строгие, если известно, что в дереве нет равных элементов.
Далее мы постараемся придерживать синтаксиса языка С, т.е., как правило, мы будем использовать в качестве вершины дерева a переменную типа
STree *a;
Отсутствие потомка обозначается нулевым значением соответствующего указателя.
Часто, если это не будет приводить к двусмысленностям, под сравнением элементов мы будем подразумевать сравнение соответствующих ключей.
Ветвью дерева называется последовательность вершин дерева, каждый последующий элемент в которой является потомком предыдущего.
Длиной ветви дерева называется количество элементов в ветви.
Высотой дерева называется максимальная длина всех ветвей дерева.
Основные операции, которые можно совершать с бинарными деревьями:
· поиск элемента в дереве (т.е. элемента с ключом, равным заданному)
· добавление элемента в дерево
· удаление элемента из дерева
· поиск минимального и максимального элемента в дереве
· если рассмотреть дерево поиска, как упорядоченную по возрастанию последовательность элементов, то: для текущего элемента поиск следующего/предыдущего
· для данной вершины дерева v разбиение дерева поиска T на два дерева поиска T1 и T2 таких, что все элементы в T1 меньше или равны v, и все элементы в T2 больше или равны v
· для двух деревьев поиска T1 и T2 таких, что все элементы в T1 меньше или равнывсех элементов в T2 (будем далее для таких деревьев говорить, что дерево T1 меньше или равно дерева T2: T1 £ T2): слияние деревьев в одно дерево поиска T
Покажем, что все эти операции можно совершить за время O(h), где h – высота рассматриваемого дерева.
Дата добавления: 2015-10-30; просмотров: 156 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Поиск кратчайшего пути в графе | | | Сбалансированные и идеально сбалансированные бинарные деревья поиска |