為什麼建立乙個二叉堆的時間為O N 而不是O Nlog N

時間 2021-05-31 10:50:03

1樓:蔣甬杭

回想一下淘汰賽就行了。

淘汰賽對陣表就是一棵典型的二叉樹。

比賽結束後,每棵子樹都滿足樹根大於等於左右子節點。最強球隊在樹根。

N支球隊淘汰賽需要打O(N)場,沒問題吧。

備註:由於建堆時子樹的樹根也是候選球隊,所以每場淘汰賽是3選1,而不是2選1。那些一開始就在很上面的,就當做「種子隊」理解就好。

2樓:王贇 Maigo

自頂向下建堆時,最下層的 個元素最多都可能要上公升 層,所以時間複雜度為 。

自底向上建堆時:

最下層的 個元素不需要動;

次下層的 個元素最多下沉 1 層;

倒數第三層的 個元素最多下沉 2 層;

依此類推,所有元素總的移動次數最多為

這是乙個高中常見的、等差數列與等比數列逐項相乘後求和的問題。解法為兩邊同乘以公比(或其倒數)後與原式錯位相減:

故時間複雜度為 。

3樓:靈劍

雖然已經解決了還是簡述一下:

如果用普通插入的方式,則總的時間複雜度為

證明方式通過將求和放縮到積分進行,ln x的積分是 x ln x - x,再利用

這樣求和就可以放縮到兩個積分上

顯然階就是O(nlogn)了

而標準的構造方式從後往前進行,越是底層的節點需要的步驟反而越少,因為底層節點很多而上層節點少,於是節約了時間,總的時間複雜度為

證明方式仍然是放縮到積分,跟上面一樣的,不再贅述

證明求和式的階的最簡便的方法之一就是放縮到積分,對於單調函式非常有效。除此以外,錯位相加(或者叫做Abel求和公式)也是常用的方法。

補充一下,準確來說前面求和當中的log k應該是要向下取整的,但是因為每個取整的誤差不超過1,累積不超過O(n),而這裡的複雜度總和肯定是超過O(n)的,所以這部分誤差不會影響最後結果,如果是考試題的話,最好改用:

當然結果是沒有區別的。

釋迦摩尼為什麼不再去建立乙個自己的美好世界讓我們過去呢?

清瀟 佛陀的意思是 覺悟者老師 而不是神 只有神這種無聊的生物才創世 淨土世界這東西至少釋迦摩尼老師沒本事創造 畢竟佛也是人啊 雖然人和人的體質不能一概而論 但是人類是有極限的!他只教了你們怎麼可以當下就活在極樂之中 學不學的會看你們緣分造化了 釋迦佛也有淨土啊。狹義的來講,此世界的五淨居天,就是淨...

為什麼時間被作為乙個單一的維度?

有無同學 個人感覺時間作為單一的尺度,相對性較為可控,因為社會 科學發展需要,我們需要讓日常生活有普適性的認知,而時間就像乙個決定或影響意識維度的變數,人的思維意識容易在思維的解釋中受到各種限制,時空的框架雖然也是限制,但也能讓我們能夠不以那麼抽象的視角去認識和生活。 科學已死 時間從哲學邏輯上是空...

為什麼不可以寫乙個型別為 Maybe a a 的函式?

火星最強指揮官 主要有兩個原因 1.Haskell的多態函式是引數化多型。比如 Maybe a a,這裡的a是任意型別,你是無法構造乙個任意型別的值的 當引數是Just x的時候,你可以直接使用這個x,但是當引數是Nothing的時候,你就無法構造a了 解決方法有兩種 1 讓Haskell支援ad ...