Не существует «естественного» способа удалить минимальное значение из максимальной кучи. Вам просто нужно посмотреть на все листовые узлы, чтобы определить, какой из них является минимальным.
Тогда вопрос в том, сколько существует листовых узлов. Интуитивно мы ожидаем, что доля узлов в куче, которые являются листьями, будет довольно близка к общему количеству узлов. Сделайте это до предела - если у вас есть куча в 1 000 000 штук, у вас будет один узел в верхнем слое, а все оставшиеся 999 999 элементов - в следующем слое. Даже в самом маленьком случае, когда куча представляет собой двоичную кучу, можно ожидать, что примерно половина элементов будет на нижнем уровне.
Точнее, займемся математикой! Сколько листьев будет у семизначной кучи с n узлами? Что ж, каждый узел в дереве будет либо
- быть листом, или
- иметь семерых детей,
с одним возможным исключением: поскольку самая нижняя строка может быть неполной, может существовать один узел с менее чем семью дочерними элементами. Поскольку это всего лишь один раз, мы можем игнорировать этот последний узел, когда имеем дело с миллионами элементов. Быстрое доказательство по индукции можно использовать, чтобы показать, что любое дерево, в котором каждый узел либо не имеет дочерних, либо семь дочерних узлов, будет иметь в семь раз больше листовых узлов, чем внутренних узлов (докажите это!), Поэтому мы ожидаем, что (7/8 ) тыс. узлов будут листами, в общей сложности 875 000 листов для проверки.
В результате лучшим ответом здесь будет примерно 10 6 сравнений.
person
templatetypedef
schedule
06.05.2020
O(n)
, поэтому ответ должен быть10^6
. - person Yonlif   schedule 06.05.2020