Скачать презентацию Алгоритмы и структуры данных Лекция 6 Упорядоченные деревья Скачать презентацию Алгоритмы и структуры данных Лекция 6 Упорядоченные деревья

Л-6 мет прогр 2012-2013.ppt

  • Количество слайдов: 16

Алгоритмы и структуры данных Лекция 6 Упорядоченные деревья (деревья поиска) 1 Алгоритмы и структуры данных Лекция 6 Упорядоченные деревья (деревья поиска) 1

Деревья. Упорядоченные деревья Если использовать внутренние узлы дерева для обозначения того, что «левый потомок Деревья. Упорядоченные деревья Если использовать внутренние узлы дерева для обозначения того, что «левый потомок меньше правого» , можно использовать двоичное дерево для записи упорядоченного списка. На рисунке показано двоичное дерево, содержащее упорядоченный список с числами 1, 2, 4, 6, 7, 9. Добавление элементов Начнем с корневого узла. По очереди сравним значения всех узлов со значением нового элемента. Если значение нового элемента меньше или равно значению узла, перейдем вниз по левой ветви дерева. Если новое значение больше, чем значение узла, перейдем вниз по правой ветви. Когда этот процесс дойдет до листа, элемент помещается в эту точку. 2

Деревья. Упорядоченные деревья Двоичное дерево поиска (англ. binary search tree, BST) — это двоичное Деревья. Упорядоченные деревья Двоичное дерево поиска (англ. binary search tree, BST) — это двоичное дерево, для которого выполняются следующие дополнительные условия (свойства дерева поиска): Оба поддерева — левое и правое, являются двоичными деревьями поиска. У всех узлов левого поддерева произвольного узла X значения ключей данных меньше, чем значение ключа данных самого узла X. У всех узлов правого поддерева того же узла X значения ключей данных не меньше, чем значение ключа данных узла X. //описание узла Type PTree = ^TTree; TTree = Record Data : Integer; Left, Right : PTree; end; //корень дерева описывается ссылочной переменной Var Tree : PTree; 3

Деревья. Упорядоченные деревья //Добавление элементов procedure Ins. Tree (var ANode : PTree; n : Деревья. Упорядоченные деревья //Добавление элементов procedure Ins. Tree (var ANode : PTree; n : lnteger); begin if ANode = nil then begin new (ANode); with ANode^ do begin Left : = nil; Right : = nil; Data : = n; end else if n< ANode^. Data then Ins. Tree(ANode^. Left, n) else Ins. Tree(ANode^. Right, n); end; 4

Деревья. Упорядоченные деревья Удаление элементов Удаление элемента из упорядоченного дерева немного сложнее, чем его Деревья. Упорядоченные деревья Удаление элементов Удаление элемента из упорядоченного дерева немного сложнее, чем его вставка. После удаления элемента, программе может понадобиться переупорядочить другие узлы, чтобы соотношение «меньше» продолжало выполняться для всего дерева. При этом нужно рассмотреть несколько случаев. a) Удаление элемента, если вершина является конечной Eсли у удаляемого узла нет потомков (вершина является конечной), можно просто убрать его из дерева, так как порядок оставшихся узлов при этом не изменится. Пример 1. (а) б) Удаление узла с единственным потомком Если у узла всего один дочерний узел, можно поместить его (дочерний узел) на место удаленного узла. Для этого надо изменить соответствующую ссылку у предшествующей вершины. Пример 1. (b). 5

Деревья. Упорядоченные деревья Удаление элементов б) Пример 2. Удаление узла с единственным потомком На Деревья. Упорядоченные деревья Удаление элементов б) Пример 2. Удаление узла с единственным потомком На рисунке показано дерево, из которого удаляется узел 4, имеющий всего один дочерний узел. Порядок остальных потомков удаленного узла останется неизменным, поскольку они являются также потомками и дочернего узла. 6

Деревья. Упорядоченные деревья с) Удаляемый узел имеет два дочерних (заменяющий узел не имеет потомков) Деревья. Упорядоченные деревья с) Удаляемый узел имеет два дочерних (заменяющий узел не имеет потомков) Если из удаляемой вершины выходят две ветви, то нужно найти подходящую вершину, которую можно было бы вставить на место удаляемой вершины. В этом случае удаляемый узел нужно заменить либо на самый правый элемент его левого поддерева, либо на самый левый элемент его правого поддерева. Такие элементы (самый правый, самый левый) не могут иметь более одного потомка. Чтобы заменить удаляемый элемент на самый правый элемент его левого поддерева, нужно двигаться вниз по левой ветви, выходящей из удаляемого узла. Затем нужно двигаться вниз по правым ветвям до тех пор, пока не найдется узел, который не имеет правой ветви. Это и есть нужный узел. В дереве, показанном слева на рисунке, узел 3 является самым правым узлом в левой от узла 4 ветви. Можно заменить узел 4 листом 3, сохранив при этом порядок дерева. Пример 1 7

Деревья. Упорядоченные деревья с) Удаляемый узел имеет два дочерних (заменяющий узел не имеет потомков) Деревья. Упорядоченные деревья с) Удаляемый узел имеет два дочерних (заменяющий узел не имеет потомков) Пример 2. Удаляемая вершина (5) имеет два дочерних листа. Пример 3. Удаляемая вершина имеет два дочерних узла. Заменяется на самый правый элемент левого поддерева. 8

Деревья. Упорядоченные деревья с) Удаляемый узел имеет два дочерних. Остается последний вариант — заменяющий Деревья. Упорядоченные деревья с) Удаляемый узел имеет два дочерних. Остается последний вариант — заменяющий узел имеет левого потомка. В этом случае, можно переместить этого потомка на место, освободившееся в результате перемещения замещающего узла, и дерево снова будет расположено в нужном порядке. Уже известно, что самый правый узел левого поддерева не имеет правого потомка, иначе он не был бы таковым. Это означает, что не нужно беспокоиться, не имеет ли замещающий узел двух потомков. Эта сложная ситуация показана на рисунке. В этом примере удаляется узел 8. Самый правый элемент в его левой ветви — это узел 7, который имеет левого потомка — узел 5. Чтобы сохранить порядок дерева после удаления узла 8, заменим узел 8 узлом 7, а узел 7 — узлом 5. Узел 7 получает новых потомков, а узел 5 сохраняет своих. Удаление узла, если заменяющий его узел имеет левого потомка 9

Деревья. Упорядоченные деревья //удаление элементов Необходимо удалить из дерева Tree узел со значением поля Деревья. Упорядоченные деревья //удаление элементов Необходимо удалить из дерева Tree узел со значением поля Data=x. В процедуре Delete. Node различаются три случая: 1. Узла со значением, равным х, нет. 2. Узел со значением х имеет не более одного потомка. 3. Узел со значением х имеет двух потомков. Procedure Delete. Node(x : Integer; var ANode : PTree); Var q : PTree; Procedure Del(var R : PTree); Begin if R^. Right <> nil then Del(R. ^Right) else begin // R^. Right = nil q^. Data : = R^. Data; q : = R; R : = R^. Left; Dispose(q); end; End; { Del } 10

Деревья. Упорядоченные деревья //удаление элементов begin { Delete. Tree } if ANode = nil Деревья. Упорядоченные деревья //удаление элементов begin { Delete. Tree } if ANode = nil then showmessage (‘Элемента с ключом ’+inttostr(x)+’ в дереве нет’) else if x < ANode^. Data then Delete. Node(x, ANode^. Left) else if x > ANode^. Data then Delete. Node(x, ANode^. Right) else begin //x = ANode^. Data q : = ANode; //адрес удаляемой вершины if q^. Right = nil then begin ANode : = q^. Left; Dispose(q); end else if q^. Left = nil then begin ANode : = q^. Right; Dispose(q); end else Del(q^. Left); end; 11

Деревья. Упорядоченные деревья Обход упорядоченных деревьев Полезное свойство упорядоченных деревьев состоит в том, что Деревья. Упорядоченные деревья Обход упорядоченных деревьев Полезное свойство упорядоченных деревьев состоит в том, что их порядок совпадает с порядком симметричного обхода. Например, при симметричном обходе дерева, показанного на следующей странице на рисунке слева, обращение к узлам происходит в порядке 2 -4 -5 -6 -7 -8 -9. Это свойство симметричного обхода упорядоченных деревьев приводит к простому алгоритму сортировки с помощью дерева поиска или упорядоченного дерева: 1. Добавить элементы к упорядоченному дереву. 2. Вывести элементы, используя симметричный обход. Этот алгоритм обычно работает достаточно хорошо. Тем не менее, если добавлять элементы к дереву в определенном порядке, то дерево может стать высоким и тонким. На следующей странице на рисунке справа показано упорядоченное дерево, которое получается при добавлении к нему элементов в порядке 1, 6, 5, 2, 3, 4. Другие последовательности также могут приводить к появлению высоких и тонких деревьев. 12

Деревья. Упорядоченные деревья Симметричный обход Дерево, полученное добавлением упорядоченного дерева: элементов в порядке: 2, Деревья. Упорядоченные деревья Симметричный обход Дерево, полученное добавлением упорядоченного дерева: элементов в порядке: 2, 4, 5, 6, 7, 8, 9. 1, 6, 5, 2, 3, 4 13

Деревья. Упорядоченные деревья Чем выше становится упорядоченное дерево, тем больше времени требуется для добавления Деревья. Упорядоченные деревья Чем выше становится упорядоченное дерево, тем больше времени требуется для добавления новых элементов в нижнюю часть дерева. В наихудшем случае, после добавления N элементов, дерево будет иметь высоту порядка O(N). Полное время вставки всех элементов в дерево будет при этом порядка O(N^2). Поскольку для обхода дерева требуется время порядка O(N), полное время сортировки чисел с использованием дерева будет равно O(N^2)+O(N)=O(N^2). Если дерево остается достаточно коротким, оно имеет высоту порядка O(log(N)). В этом случае для вставки элемента в дерево потребуется всего порядка O(log(N)) шагов. Вставка всех N элементов в дерево потребует порядка O(N * log(N)) шагов. Тогда сортировка элементов при помощи дерева потребует времени порядка O(N * log(N)) + O(N) = O(N * log(N)). Время выполнения порядка O(N * log(N)) намного меньше, чем O(N^2). Например, построение высокого и тонкого дерева, содержащего 1000 элементов, потребует выполнения около 1 000 шагов. Построение короткого дерева с высотой порядка O(log(N)) займет всего около 10 000 шагов. 14

Деревья. Упорядоченные деревья Если элементы первоначально расположены в случайном порядке, форма дерева будет представлять Деревья. Упорядоченные деревья Если элементы первоначально расположены в случайном порядке, форма дерева будет представлять что‑то среднее между этими двумя крайними случаями. Хотя его высота может оказаться несколько больше, чем log(N), оно, скорее всего, не будет слишком тонким и высоким, поэтому алгоритм сортировки будет выполняться достаточно быстро. Форма упорядоченного дерева зависит от порядка вставки в него новых узлов. Способы балансировки деревьев применяются для того, чтобы деревья не становились слишком высокими и тонкими, независимо от того, в каком порядке в них добавляются новые элементы. 15

Деревья. Упорядоченные деревья Задания. 1. Построить двоичное дерево поиска, включая в него значения последовательности Деревья. Упорядоченные деревья Задания. 1. Построить двоичное дерево поиска, включая в него значения последовательности целых чисел 10, 21, 15, 7, 9, 17, 4, 2, 14, 25. 2. Осуществить прямой, симметричный, обратный обходы дерева и обход по ширине. 3. Удалить из полученного дерева последовательно узлы со значениями 17, 4, 10. 4. Построить двоичное дерево поиска, включая в него значения последовательности целых чисел 25, 14, 12, 2, 4, 17, 9, 7, 15, 21, 10. 5. Выполнить для него задания 2 и 3. 6. Описать алгоритм поиска в упорядоченном дереве и оценить время поиска. 7. Описать рекурсивный алгоритм вычисления глубины дерева. 16