В чем сложность извлечения всех n элементов из кучи?

Чтобы построить кучу, часто ошибочно считают, что O (n log n) - это строгая верхняя граница, но на самом деле это O (n).

Я хочу сказать, что извлечение всех n элементов из кучи - это O (n log n), но, исходя из того, что я знаю о сложности построения кучи, я колеблюсь и думаю, что это может быть O (n) для по той же причине создание кучи - O (n).

Это верно?

Каждый раз, когда мы открываем, нам нужно найти новый корень, а функция heapify займет время O (h), где h - высота двоичного дерева. Для сбалансированного двоичного дерева, такого как куча, h = log_2 (n). Но количество узлов уменьшается один за другим для каждого попа, поэтому h должно уменьшаться.

Поэтому, если бы мне нужно было вычислить сложность, я бы сделал что-то вроде

O(log_2(n) + log_2(n-1) + ... + log_2(1))
= O(log_2(n * (n-1) * ... * (1))
= O(log_2(n^n)) 
= O(n log_2(n)

Но действительно ли это строгая верхняя граница?


person roulette01    schedule 30.09.2020    source источник


Ответы (1)


Представьте, что есть способ сделать n запросов из кучи за время O (n). Это даст вам алгоритм сортировки на основе сравнения, который выполняется за время O (n) следующим образом:

  • Создайте кучу за время O (n), используя heapify.
  • Используйте алгоритм времени O (n), чтобы сделать n всплывающих окон.

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

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

person templatetypedef    schedule 30.09.2020
comment
Небольшая мелочь: этот аргумент не доказывает, что n всплывающих окон берут Ω (n log n), но что n вставок и n всплывающих окон принимают это. Например, отсортированная двухсторонняя очередь, используемая как куча, будет делать n всплывающих окон за O (n) за O (n ^ 2) для вставок. - person Sneftel; 01.10.2020
comment
Я интерпретировал вопрос OP как конкретно о двоичных кучах, но да, вы правы, что вы можете ускорить n всплывающих окон, если используете другую структуру. - person templatetypedef; 01.10.2020