Рассматриваемые здесь тонкие и, в следующей лекции,
Для любого узла $$x$$ в дереве $$T_k$$ обозначим: $${\rm Degree} (x)$$ — количество детей узла $$x$$ ; $${\rm Rank}(x)$$ — ранг соответствующего узла в биномиальном дереве $$B_k$$.
На рис. 8.1 приведены примеры
(рис 8.1) Заметим, что в тонкой куче могут встречаться тонкие деревья одинакового
ранга, в то время как в
Утверждение. Для любого натурального числа $$n$$ существует
Действительно, любой
Пусть $$D(n)$$ — максимально возможный
Теорема [22] В тонкой куче из $$n$$ элементов $$D(n)\le \log_\Phi (n)$$, где $$\Phi = (1+\sqrt{5})/2$$ — золотое сечение.
Доказательство. Сначала покажем, что узел ранга $$k$$ в тонком дереве имеет не менее $$F_k \ge \Phi^{k-1}$$ потомков, включая самого себя, где $$F_k$$ — $$k$$ -е число Фибоначчи, определяемое соотношениями $$F_0 = 1$$, $$F_1 = 1$$, $$F_k = F_{k-2} + F_{k-1}$$ для $$k \ge 2$$.
Действительно, пусть $$T_k$$ — минимально возможное число
узлов, включая самого себя, в тонком дереве ранга $$k$$. По
свойствам $$1$$ и $$3$$
Числа Фибоначчи удовлетворяют этому же рекуррентному соотношению, причем неравенство можно заменить равенством. Отсюда по индукции следует, что $$T_k \ge F_k$$ для любых $$k$$. Неравенство $$F_k \ge \Phi^{k-1}$$ хорошо известно.
Теперь убедимся в том, что максимально возможный ранг $$D(n)$$
Отсюда следует, что $$D(n) \le \log_{\Phi}(n)+1$$.
Таким образом, узлы-братья связаны в двусвязный список при помощи
указателей $${\rm Left}$$ и $${\rm Right}$$. У самого левого
брата в этом списке
указатель $${\rm Left}$$ указывает на общего родителя всех узлов в
списке. У самого правого брата из списка указатель $${\rm Right}$$ заземлен.
Корни деревьев в тонкой куче связаны в односвязный
В случае необходимости в описании узла может присутствовать и другая прикладная информация. На рис. 8.2 приведен пример тонкой кучи.
Представление кучи со ссылками, в узлах указаны ранги
(рис 8.2) Заметим, что принадлежность заданного узла корневому списку кучи осуществляется проверкой указателя $${\rm Left}$$ на заземленность.
Введем еще одну запись $${\rm Heap}$$, которая будет соответствовать отдельной куче и иметь вид$$\eq*{ {\rm Heap} = ({\rm First}, {\rm Min}), }$$ где $${\rm First}$$ — указатель на начальный элемент корневого списка; $${\rm Min}$$ — указатель на элемент корневого списка с минимальным ключом.
Очевидно, что узел с минимальным ключом обязательно находится в корневом списке.
Сосредоточим внимание на амортизационных оценках трудоемкости. Будем
получать их
Операция увеличивает потенциал на $$1$$, так как добавляется одно дерево в корневой список кучи, но это не влияет на амортизационную оценку, которая равна фактической $$O(1)$$.
Находим любые два дерева, корни которых имеют одинаковые ранги,
и связываем их, делая корень с большим ключом новым левым потомком корня
с меньшим ключом, увеличивая ранг нового полученного
Рассмотрим теперь, с помощью каких средств реализуется связывающий шаг.
Для хранения ссылок на корни деревьев используем временный
массив $${\rm RankT}$$, размера $$D(n)$$. Величина $${\rm RankT}[i]$$ будет
указателем на
При включении списка детей необходимо учесть возможность помеченности детей минимального узла. То есть уменьшить их ранг там, где это необходимо. Это требование вытекает из свойства 2 определения тонкого дерева. Очевидно, что для проверки помеченности узла требуется $$O(1)$$ операций.
В результате выполнения связывающих шагов получаем заполненный массив $${\rm RankT}$$. Теперь остается только связать все деревья, находящиеся в этом массиве, в корневой список и найти в этом списке новый минимальный элемент. Очевидно, все это можно выполнить с трудоемкостью $$O(D(n))$$.
Чтобы оценить амортизационную стоимость операции $${\rm DeleteMin}$$, подсчитаем фактическую стоимость операции и изменение потенциала. Фактическая стоимость складывается из $$O(1)$$ операций на проверку кучи на пустоту, $$O(D(n))$$ действий при добавлении детей минимального узла в корневой список и $$O$$ (количество связывающих шагов) + $$O(D(n))$$ при выполнении связывающих шагов.
В итоге фактическая стоимость операции
Очевидно, что потенциал уменьшился, как минимум, на число связывающих шагов, так как при каждом связывающем шаге количество деревьев в корневом списке уменьшается на единицу. Поскольку амортизационная стоимость равна фактической стоимости плюс изменение потенциала, то амортизационная стоимость равна $$O(D(n))$$.
Покажем, как, затратив $$O(1)$$ амортизированного времени, исправлять его структуру. В процедуре $${\rm DecreaseKey}$$ после уменьшения ключа корректируется, если это необходимо, указатель на минимальный элемент кучи. После этого проверяется, не является ли измененный узел $$x$$ корнем дерева $$T$$. Если это действительно так, то процедура завершается, в противном случае переносим поддерево с корнем в узле $$x$$ в корневой список кучи и запускаем процедуру коррекции оставшегося дерева $$T'$$.
Будем различать два вида нарушений свойств
Рассмотрим подробнее каждое из двух видов нарушений. Назовем
узел $$y$$
узлом локализации братского нарушения среди детей узла $$z$$, если
(рис 8.3) Назовем узел $$y$$ узлом локализации родительского нарушения, если выполнено одно из трех условий:
Пример приведен на рис. 8.4.
(рис 8.4) Рассмотрим теперь, как можно перестроить дерево, чтобы избавиться от братского нарушения либо свести его к родительскому. Пусть узел $$y$$ — это узел локализации братского нарушения. Рассмотрим два возможных варианта.
Узел $$y$$ не помечен, то есть ранг его самого левого сына на единицу меньше ранга самого узла $$y$$. Пример — на рис. 8.5.
(рис 8.5) В данном случае, чтобы исправить братское нарушение, помещаем на место
пропущенного в братском списке поддерева поддерево с корнем в самом левом
сыне узла $$y$$. Узел $$y$$ при такой операции становится
помеченным, но зато дерево теперь удовлетворяет всем трем свойствам
определения
Узел $$y$$ помечен, тогда уменьшаем
(рис 8.6) Таким образом, мы либо исправим структуру дерева, либо рекурсивно придем к узлу локализации родительского нарушения.
Выясним, чтo же делать с родительскими нарушениями. Пусть узел $$y$$ — это узел локализации родительского нарушения, а узел $$z$$ — родитель узла $$y$$. Тогда предлагается переместить поддерево с корнем в узле $$y$$ в корневой список кучи, делая при этом узел $$y$$ непомеченным. Считаем, что $$z$$ — это не корень дерева. Если узел $$z$$ не был помечен, то, очевидно, процедура исправления дерева закончена. Если он был помечен, то считаем его узлом локализации нового родительского нарушения. При этом, очевидно, количество помеченных узлов уменьшится на единицу. Продолжая такого вида рекурсивные шаги, мы либо дойдем до корня дерева, либо исправим его структуру раньше. Если узел $$z$$ стал корнем, то для того чтобы исправить структуру дерева, необходимо лишь сделать ранг корня на единицу большим ранга его самого левого сына. На этом процедура исправления дерева будет закончена.
Заметим, что каждый промежуточный шаг рекурсии уменьшает число помеченных узлов на единицу и добавляет в корневой список не более одного дерева. Тогда потенциал при каждом шаге рекурсии уменьшается как минимум на единицу. Отсюда и следует обещанная оценка $$O(1)$$ времени выполнения операции $${\rm DecreaseKey}$$.
Итак, амортизационная трудоемкость выполнения операций\linebreak $${\rm DeleteMin}$$ и $${\rm Delete}$$ на тонкой куче из $$n$$ элементов равна $$O(\log n)$$, а для остальных операций, как было показано ранее, — $$O(1)$$.
Рассматриваемые здесь тонкие и, в следующей лекции,
Для любого узла $$x$$ в дереве $$T_k$$ обозначим: $${\rm Degree} (x)$$ — количество детей узла $$x$$ ; $${\rm Rank}(x)$$ — ранг соответствующего узла в биномиальном дереве $$B_k$$.
На рис. 8.1 приведены примеры
(рис 8.1) Заметим, что в тонкой куче могут встречаться тонкие деревья одинакового
ранга, в то время как в
Утверждение. Для любого натурального числа $$n$$ существует
Действительно, любой
Пусть $$D(n)$$ — максимально возможный
Теорема [22] В тонкой куче из $$n$$ элементов $$D(n)\le \log_\Phi (n)$$, где $$\Phi = (1+\sqrt{5})/2$$ — золотое сечение.
Доказательство. Сначала покажем, что узел ранга $$k$$ в тонком дереве имеет не менее $$F_k \ge \Phi^{k-1}$$ потомков, включая самого себя, где $$F_k$$ — $$k$$ -е число Фибоначчи, определяемое соотношениями $$F_0 = 1$$, $$F_1 = 1$$, $$F_k = F_{k-2} + F_{k-1}$$ для $$k \ge 2$$.
Действительно, пусть $$T_k$$ — минимально возможное число
узлов, включая самого себя, в тонком дереве ранга $$k$$. По
свойствам $$1$$ и $$3$$
Числа Фибоначчи удовлетворяют этому же рекуррентному соотношению, причем неравенство можно заменить равенством. Отсюда по индукции следует, что $$T_k \ge F_k$$ для любых $$k$$. Неравенство $$F_k \ge \Phi^{k-1}$$ хорошо известно.
Теперь убедимся в том, что максимально возможный ранг $$D(n)$$
Отсюда следует, что $$D(n) \le \log_{\Phi}(n)+1$$.
Таким образом, узлы-братья связаны в двусвязный список при помощи
указателей $${\rm Left}$$ и $${\rm Right}$$. У самого левого
брата в этом списке
указатель $${\rm Left}$$ указывает на общего родителя всех узлов в
списке. У самого правого брата из списка указатель $${\rm Right}$$ заземлен.
Корни деревьев в тонкой куче связаны в односвязный
В случае необходимости в описании узла может присутствовать и другая прикладная информация. На рис. 8.2 приведен пример тонкой кучи.
Представление кучи со ссылками, в узлах указаны ранги
(рис 8.2) Заметим, что принадлежность заданного узла корневому списку кучи осуществляется проверкой указателя $${\rm Left}$$ на заземленность.
Введем еще одну запись $${\rm Heap}$$, которая будет соответствовать отдельной куче и иметь вид$$\eq*{ {\rm Heap} = ({\rm First}, {\rm Min}), }$$ где $${\rm First}$$ — указатель на начальный элемент корневого списка; $${\rm Min}$$ — указатель на элемент корневого списка с минимальным ключом.
Очевидно, что узел с минимальным ключом обязательно находится в корневом списке.
Сосредоточим внимание на амортизационных оценках трудоемкости. Будем
получать их
Операция увеличивает потенциал на $$1$$, так как добавляется одно дерево в корневой список кучи, но это не влияет на амортизационную оценку, которая равна фактической $$O(1)$$.
Находим любые два дерева, корни которых имеют одинаковые ранги,
и связываем их, делая корень с большим ключом новым левым потомком корня
с меньшим ключом, увеличивая ранг нового полученного
Рассмотрим теперь, с помощью каких средств реализуется связывающий шаг.
Для хранения ссылок на корни деревьев используем временный
массив $${\rm RankT}$$, размера $$D(n)$$. Величина $${\rm RankT}[i]$$ будет
указателем на
При включении списка детей необходимо учесть возможность помеченности детей минимального узла. То есть уменьшить их ранг там, где это необходимо. Это требование вытекает из свойства 2 определения тонкого дерева. Очевидно, что для проверки помеченности узла требуется $$O(1)$$ операций.
В результате выполнения связывающих шагов получаем заполненный массив $${\rm RankT}$$. Теперь остается только связать все деревья, находящиеся в этом массиве, в корневой список и найти в этом списке новый минимальный элемент. Очевидно, все это можно выполнить с трудоемкостью $$O(D(n))$$.
Чтобы оценить амортизационную стоимость операции $${\rm DeleteMin}$$, подсчитаем фактическую стоимость операции и изменение потенциала. Фактическая стоимость складывается из $$O(1)$$ операций на проверку кучи на пустоту, $$O(D(n))$$ действий при добавлении детей минимального узла в корневой список и $$O$$ (количество связывающих шагов) + $$O(D(n))$$ при выполнении связывающих шагов.
В итоге фактическая стоимость операции
Очевидно, что потенциал уменьшился, как минимум, на число связывающих шагов, так как при каждом связывающем шаге количество деревьев в корневом списке уменьшается на единицу. Поскольку амортизационная стоимость равна фактической стоимости плюс изменение потенциала, то амортизационная стоимость равна $$O(D(n))$$.
Покажем, как, затратив $$O(1)$$ амортизированного времени, исправлять его структуру. В процедуре $${\rm DecreaseKey}$$ после уменьшения ключа корректируется, если это необходимо, указатель на минимальный элемент кучи. После этого проверяется, не является ли измененный узел $$x$$ корнем дерева $$T$$. Если это действительно так, то процедура завершается, в противном случае переносим поддерево с корнем в узле $$x$$ в корневой список кучи и запускаем процедуру коррекции оставшегося дерева $$T'$$.
Будем различать два вида нарушений свойств
Рассмотрим подробнее каждое из двух видов нарушений. Назовем
узел $$y$$
узлом локализации братского нарушения среди детей узла $$z$$, если
(рис 8.3) Назовем узел $$y$$ узлом локализации родительского нарушения, если выполнено одно из трех условий:
Пример приведен на рис. 8.4.
(рис 8.4) Рассмотрим теперь, как можно перестроить дерево, чтобы избавиться от братского нарушения либо свести его к родительскому. Пусть узел $$y$$ — это узел локализации братского нарушения. Рассмотрим два возможных варианта.
Узел $$y$$ не помечен, то есть ранг его самого левого сына на единицу меньше ранга самого узла $$y$$. Пример — на рис. 8.5.
(рис 8.5) В данном случае, чтобы исправить братское нарушение, помещаем на место
пропущенного в братском списке поддерева поддерево с корнем в самом левом
сыне узла $$y$$. Узел $$y$$ при такой операции становится
помеченным, но зато дерево теперь удовлетворяет всем трем свойствам
определения
Узел $$y$$ помечен, тогда уменьшаем
(рис 8.6) Таким образом, мы либо исправим структуру дерева, либо рекурсивно придем к узлу локализации родительского нарушения.
Выясним, чтo же делать с родительскими нарушениями. Пусть узел $$y$$ — это узел локализации родительского нарушения, а узел $$z$$ — родитель узла $$y$$. Тогда предлагается переместить поддерево с корнем в узле $$y$$ в корневой список кучи, делая при этом узел $$y$$ непомеченным. Считаем, что $$z$$ — это не корень дерева. Если узел $$z$$ не был помечен, то, очевидно, процедура исправления дерева закончена. Если он был помечен, то считаем его узлом локализации нового родительского нарушения. При этом, очевидно, количество помеченных узлов уменьшится на единицу. Продолжая такого вида рекурсивные шаги, мы либо дойдем до корня дерева, либо исправим его структуру раньше. Если узел $$z$$ стал корнем, то для того чтобы исправить структуру дерева, необходимо лишь сделать ранг корня на единицу большим ранга его самого левого сына. На этом процедура исправления дерева будет закончена.
Заметим, что каждый промежуточный шаг рекурсии уменьшает число помеченных узлов на единицу и добавляет в корневой список не более одного дерева. Тогда потенциал при каждом шаге рекурсии уменьшается как минимум на единицу. Отсюда и следует обещанная оценка $$O(1)$$ времени выполнения операции $${\rm DecreaseKey}$$.
Итак, амортизационная трудоемкость выполнения операций\linebreak $${\rm DeleteMin}$$ и $${\rm Delete}$$ на тонкой куче из $$n$$ элементов равна $$O(\log n)$$, а для остальных операций, как было показано ранее, — $$O(1)$$.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.