建堆的复杂度与过程
唉, 一直以為建堆的過程是這樣的:
?
1 個元素是一個堆
2 個元素時, 交換元素2與堆頂, 調整
3 個元素時, 交換元素3與堆頂, 調整
4 個元素時, 交換元素4與堆頂, 調整
。。
。。
一直到數組末尾, 于是整個數組就成為一個堆了。
?
這樣操作的復雜度是nlogn. 怎么與一般書上說的建堆的復雜度O(n)不一樣呢?
?
?
原來復雜度O(n)的建堆過程是這樣的: 從n/2元素開始, 以該點為根,使之成為一個堆; 然后再以n/2-1元素開始, 使之成為一個堆;,, 一直到數組第1個元素,使之成為一個堆; 于是整個數組就成為一個堆了。
?
這樣操作的復雜度是O(n)
?
?
?
假設有2^k個元素
第一種操作方式的復雜度是1 * 0 + 2 * 1 + 2^2 * 2 + ... + 2^(k-1) * (k-1)?????? ====>2^k * k ==> nlogn
第二種操作方式的復雜度是2^(k-1) * 1 + .... + 2 * (k-1) + 1 * k?????????????????????? ====>2^k?????? ==> n
?
兩種復雜度計算公式類似,有一定的迷惑性, 一直以為弄明白O(n)的復雜度, 原來是錯誤的
總結
- 上一篇: bug list---直接访问strin
- 下一篇: 阿里面试题解答