Читайте также:
|
|
Д.Кнут. Искусство программирования для ЭВМ. тт 1-3. Москва. Мир. 1996-1998 Т.Кормен, Ч.Лейзерсон, Р.Ривест. Алгоритмы. Построение и анализ. Москва. МЦНМО. 1999. Препарата Ф., Шеймос М. Вычислительная геометрия. Москва. Мир. 1989 |
К вопросу о понимании предыдущих лекций. Найти ошибку. ``Доказательство'' того, что любое натуральное число можно однозначно описать не более, чем 20-тью словами (имеется в виду, можно использовать только существующие в языке слова, а не что-нибудь вроде "ШестьсотШестьдесятШесть"). Пусть это не так. Тогда существует множество, являющееся подмножеством натуральных чисел, каждый элемент которого невозможно назвать, использовав менее, чем 20 слов. У всякого подмножества натуральных чисел есть наименьший элемент.Получаем: "Наименьшее натуральное число, которое нельзя назвать менее, чем двадцатью словами, имеющимися в русском языке" - итого 13 слов потребовалось, дабы назвать данное число, которое принадлежит этому великолепному множеству => противоречие.
HeapSort или сортировка с помощью пирамиды.
Алгоритм основан на промежуточном упорядочивании массива входных данных {A1 ,…, AN }. Мы докажем, что промежуточно-упорядоченный массив (мы будем его называть пирамидально-упорядоченным) обладает свойством максимальности своего первого элемента. Тогда мы отрезаем от массива первый элемент и восстанавливаем утраченное свойство пирамидально-упорядоченности у оставшегося куска. Так, отрезая по одному (максимальному из оставшихся) элементу, мы можем `набрать’ полный упорядоченный массив.
Определение. Массив { A1 ,…, AN } называется пирамидально-упорядоченным, если для всех допустимых i: A[i/2] ³ Ai.
Иначе данное соотношение можно выписать следующим образом:
Ai ³ A2i и Ai ³ A2i+1 (*)
Легко видеть, что данные соотношения задают древообразную структуру, в вершине которой находится первый элемент дерева. Его потомками являются элементы с номерами 2 и 3, и т.д. В получившемся дереве все слои заполнены, кроме, быть может, последнего. Поэтому глубина дерева равна [log N]+1, где N – количество элементов в множестве.
Пусть для некоторого поддерева пирамиды, начинающегося с элемента с индексом i и заканчивающегося элементом с индексом N, выполнено свойство (*) для всех элементов поддерева, кроме вершины поддерева. Т.е. свойство выполняется для всех элементов, имеющих индексы больше i (здесь имеется в виду возможное невыполнения условий Ak ³ A2k и Ak ³ A2k+1 для k=i и его выполнение при k>i).
Определим процедуру Heapify(A,i,N), которая в данном случае подправляет элементы поддерева до полной пирамидально-упорядоченности элементов с индексами от i до N. Здесь A – рассматриваемый массив, i – индекс массива с которого начинается рассматриваемое поддерево, N – количество элементов во всем дереве.
Процедура Heapify(A,i,N) осуществляет следующие действия. Она проверяет условия
Ai ³ A2i в случае 2i£N
Ai ³ A2i+1 в случае 2i+1£N.
Если они выполняются (случаи 2i³N, 2i+1³N легко рассмотреть отдельно), то дальше ничего делать не надо, происходит выход из процедуры. Иначе, выбирается максимальный из элементов Ai, A2i, A2i+1 и выбранный элемент меняется местами с Ai. Не ограничивая общности рассуждений, допустим, что максимальным оказался элемент A2i, тогда после перестановки имеем Ai ³ A2i+1 , при этом элемент A2i+1 не изменился, поэтому свойство пирамидально-упорядоченности будет выполняться и дальше в данном (правом) поддереве. Далее рекурсивно вызываем процедуру Heapify(A,2i,N).
Исходя из построения процедуры Heapify, имеем следующее утверждение
Утверждение 1. Процедура Heapify(A,i,N) выполняется за время O(h(i,N)), где h(i,N) – глубина поддерева в пирамиде из N элементов, начинающегося с элемента с индексом i.
Алгоритм Heapsort(A,N) выглядит следующим образом
Дата добавления: 2015-10-30; просмотров: 108 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Некоторые задачи, сводящиеся к сортировке. | | | SortB (A, N, M, B) |