Я считаю, что принятый ответ неверен.
На самом деле построение кучи снизу вверх — это O(n), но это только верхняя граница, применимая к общему случаю. В конкретных случаях можно работать лучше, например, когда у нас есть 8 элементов. Ниже я представлю хотя бы один способ, которым можно построить кучу из 8 элементов за 8 сравнений.
Допустим, у нас есть 8 элементов {A, B, C, D, E, F, G, H}, и мы ничего не знаем об их относительном порядке. Начнем с сравнения любых четырех пар восьми элементов. После этого шага мы выполнили 4 сравнения и теперь имеем 4 «упорядоченные» пары, как показано ниже:
A > B, C > D, E > F, G > H
Теперь обратите внимание, что с помощью 1 сравнения мы можем соединить две пары в дереве N = 4. Например, если мы возьмем первые две пары и сравним A и C, мы получим либо дерево слева внизу (если A > C) или тот, что справа (если C > A):
A | C
C B | A D
D | B
Мы применяем тот же процесс к двум другим парам, в итоге получив два дерева N = 4, используя пока 6 сравнений. У нас есть что-то вроде:
A E
C B and G F
D H
С помощью одного дополнительного сравнения мы можем решить, какой из них имеет более высокий порядок между A или E. Скажем, A > E
без ограничения общности. На данный момент мы использовали 7 сравнений. Наконец, мы используем наше последнее оставшееся сравнение, чтобы определить порядок между элементами ниже A (B и C), и используем эту информацию, чтобы изменить дерево слева вверху на один из двух ниже (B > C слева, C > Б справа):
A | A
B | C
C D | B D
Наконец, поскольку мы уже знаем, что A > E
, теперь легко соединить два дерева, которые у нас есть (одно с корнем в E и одно с корнем в A), как показано ниже:
A
E B
G F D C
H
И мы закончили, у нас есть куча из 8 элементов, построенных с 8 сравнениями. Надеюсь все понятно хахаха
person
belbs
schedule
15.08.2015