1. 程式人生 > >9.24 設計一個沒有擴容負擔的堆結構

9.24 設計一個沒有擴容負擔的堆結構

題目】:

  堆結構一般是使用固定長度的陣列結構來實現的。這樣的實現雖然足夠經典,但存在擴容的負擔,比如不斷向堆中增加元素,使得固定陣列快耗盡時,就不得不申請一個更大的固定陣列,然後把原來陣列中的物件複製到新的數組裡完成堆的擴容,所以,如果擴容時堆中的元素個數為N,那麼擴容行為的時間複雜度為O(N)。請設計一種沒有擴容負擔的堆結構,即在任何時刻有關堆的操作時間複雜度都不超過O(logN)

 

要求】:

  1、沒有擴容的負擔

  2、可以生成小根堆,也可以生成大根堆

  3、包含getHead方法,返回當前堆頂的值

  4、包含getSize方法,返回當前堆的大小

  5、包含add(x)方法,即向堆中新加元素x,操作後依然是小根堆/大根堆

  6、包含popHead方法,即刪除並返回堆頂的值,操作後依然是小根堆/大根堆

  7、如果堆中的節點個數為N,那麼各個方法的時間複雜度為:

    getHead : O(1)

    getSize : O(1)

    add : O(logN)

    popHead : O(logN)

 

題目來源:左程雲老師《程式設計師程式碼面試指南》