建堆O(n)時間復雜度證明

建堆復雜度先考慮滿二叉樹,計算完全二叉樹建堆復雜度基本相同。

對滿二叉樹而言,第i層(根為第0層)有2^i個節點。由于建堆過程自底向上,以交換作為主要操作,因此第i層任意節點在最不利情況下,需要經過(n-i)次交換操作才能完成以該節點為堆根節點的建堆過程。因此,時間復雜度計算如下:

T(n) = 2^0 * (n - 0) + 2^1 * (n - 1) + ... + 2^n * (n - n) = sum((n - i) * 2^i)

采用錯位相減法:

  • 原式乘2得:
  • T(n) * 2 = 2^1 * (n - 0) + 2^2 * (n - 1) + ... + 2^(n+1) * (n - n)
  • = sum((n - i) * 2^(i+1))
  • 原式如下:
  • T(n) = 2^0 * (n - 0) + 2^1 * (n - 1) + ... + 2^n * (n - n)
  • = sum((n - i) * 2^i)
  • 相減得:
  • 2T(n) - T(n) = -n + 2^1 + 2^2 + ... + 2^n = 2 * (1 - 2^n) / (1 - 2) - n
  • = 2^(n+1) - 2 - n

上面推導中,n為層數編號(自0層根節點開始)。故總節點數為(1 + 2 + 4 + ... + 2^n) = 2^(n+1) - 1。漸進時,忽略減1取N = 2^(n+1)

T(N) = 2^(n+1) - n - 2 = N * (1 - logN / N - 2 / N) ≈ N

故時間復雜度為O(N),得證。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容