Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Пособие часть 1.doc
Скачиваний:
53
Добавлен:
24.09.2019
Размер:
6.98 Mб
Скачать

Анализ алгоритма сортировки пирамидой

Оценим время работы функции downheap(). На каждой итерации её цикла элемент опускается в пирамиде на один уровень, поэтому общее число шагов пропорционально высоте h пирамиды, от корня которой мы начали спускаться.

Высоту можно определить следующим образом. Пусть пирамида содержит k элементов. На первом уровне пирамиды находится 1 элемент, на втором – 2, на третьем – 4 и т.д. В общем случае, на i-м уровне находится 2k-1 элементов. Исключением является последний уровень. Если он полностью заполнен, то имеем равенство:

1+2+4+…+2i-1+…+2h=k

Воспользовавшись формулой суммы геометрической прогрессии, имеем:

2h+1-1=k  h=log2(k+1)-1

Но, поскольку в пирамиде последний уровень заполнен не полностью, эту величину нужно округлить в большую сторону:

h=log2(k+1)-1

Таким образом, верхняя оценка составляет O(log k)

Несложно получить и нижнюю оценку. В худшем случае на вершине пирамиды оказывается элемент, который меньше всех остальных, и его приходится опускать до самого низу. Отсюда сразу получаем оценку Ω(log n).

Таким образом, точная асимптотическая оценка “погружения” элемента в пирамиду составляет Θ(log n).

Теперь выполним анализ собственно сортировки. На первой фазе функция downheap() вызывается порядка n раз, при этом каждый раз число элементов в пирамиде  n, поэтому можно считать, что временная сложность алгоритма составляет O(nlogn).

Примечание. Мы не учли, что почти во всех вызовах downheap() число элементов в пирамиде значительно меньше n. Если более аккуратно провести анализ первой фазы, можно показать, что построение пирамиды требует всего Θ(n) операций.

На второй фазе алгоритма выполняется n-1 вызов функции downheap(), при этом каждый вызов работает с пирамидой порядка n. Таким образом, сложность второй фазы и всего алгоритма — Θ(nlog n).

Один из недостатков алгоритма сортировки пирамидой состоит в том, что он не является устойчивым. Преимущества – алгоритм не использует дополнительной памяти, работает одинаково хорошо для среднего и худшего случая.

Реализация очереди с приоритетами на базе пирамиды

Очередь с приоритетами также часто реализуют с помощью пирамиды. При этом извлечение элемента с максимальным приоритетом из очереди осуществляется аналогично тому, как это делалось во 2-й фазе алгоритма пирамидальной сортировки.

Вставка элемента в очередь происходит похожим образом – помещаем элемент в конец пирамиды (увеличив её размер на единицу) и обеспечиваем выполнение основного свойства пирамиды для этого элемента. Основное отличие состоит в том, что при этом мы сравнивать элемент с его родителем (а не сыном) и при необходимости поднимать, а не опускать. Пример вставки элемента показан на рис.4.9.

Иногда требуется, чтобы элементы с одинаковым приоритетом выходили из очереди в том же порядке, в каком они и пришли. Для этого можно использовать разные способы, например, расширить приоритеты элементов очереди до двух частей – собственно приоритета и некоего порядкового номера, который будет увеличиваться на единицу для каждого нового элемента, помещаемого в очередь.

0

1

2

3

4

5

6

7

9

7

5

6

2

4

1

3

0

1

2

3

4

5

6

7

8

9

7

5

6

2

4

1

3

8

0

1

2

3

4

5

6

7

8

9

7

5

8

2

4

1

3

6

0

1

2

3

4

5

6

7

8

9

8

5

7

2

4

1

3

6

Рис 4.9. Вставка элемента в очередь с приоритетами на базе пирамиды