banner
指数爆炸

指数爆炸

我做了对饭 !
github
bilibili

在构建二叉堆时,为什么大家都使用从最后一个非叶子节点开始逐个进行下沉调整,而不采用从根节点开始逐个进行下沉调整?它们的时间复杂度有没有差异?

以下我說的從根節點開始逐個進行下沉調整也是不遍歷葉子結點的。

由於時間複雜度的概念問題,其實在比較兩個物件的時間複雜度的時候會不清晰,比如 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)。因此,在時間複雜度方面,它們並沒有本質上的區別。

上述是本人在看書的時候引發的一些思想和感悟,不一定正確,歡迎讀者們討論!大家一起學習一起進步

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。