banner
指数爆炸

指数爆炸

我做了对饭 !
github
bilibili

二分ヒープを構築する際、なぜ皆が最後の葉でないノードから順番に沈下調整を行うのか、根ノードから順番に沈下調整を行わないのか、それらの時間の複雑さには違いがあるのでしょうか?

以下のテキストを日本語に翻訳してください:

以下我说的从根节点开始逐个进行下沉调整也是不遍历叶子结点的。

時間の複雑さの概念の問題から、実際には 2 つのオブジェクトの時間の複雑さを比較する際には明確ではありません。例えば、A の時間の複雑さは O (n/2) であり、B の時間の複雑さは O (n) です。教科書の概念では係数を取り除くべきですので、A と B の時間の複雑さは同じですが、実際のアプリケーションでは、賢い人は A を選ぶでしょう。なぜなら、A の中の n には 2 以外の要素がなく、時間の複雑さが少なくなるからです。

したがって、私たちは比較を明確にするために、次に時間の複雑さを計算する過程を詳細に行います。


まず、根ノードから始まり、個々に下降調整を行うため、配列のすべての非葉ノードを走査する必要があります。もし n 個のノードがあるとすると、すべての非葉ノードは n/2 個あり、したがって時間の複雑さは O (n/2) です。

次に、下降調整の過程で、各ノードは最低限下降する必要がなく、最大で木の深さまで下降する必要があります。木の深さは logn です。したがって、各ノードの下降の時間の複雑さは O (logn/2) です。

したがって、根ノードから始まり、個々に下降調整を行う総合的な時間の複雑さは O ((n/2)*(logn/2)) です。


次に、最後の非葉ノードから始まり、個々に下降調整を行う時間の複雑さを計算します。同様に、すべての非葉ノードの数は n/2 であり、時間の複雑さは O (n/2) です。

次に、下降調整の過程で、各ノードは最低限下降する必要がなく、最大で木の深さまで下降する必要があります。木の深さは logn です。

したがって、各ノードの下降の時間の複雑さも O ((n/2)*(logn/2)) です。

実際には、最後の非葉ノードから始まり、個々に下降調整を行う場合と根ノードから始まり、個々に下降調整を行う場合の時間の複雑さは、いずれも O (nlogn) です。したがって、時間の複雑さの観点では、本質的な違いはありません。

上記は私が本を読んでいる間に思考と洞察を引き起こしたものであり、必ずしも正確ではありません。読者の皆さんの議論を歓迎します!一緒に学び、進歩しましょう。

読み込み中...
文章は、創作者によって署名され、ブロックチェーンに安全に保存されています。