二叉堆一般用於涉及插入、刪除、查詢最值得題目。往往配合其它題型使用。
對頂堆
對頂堆常用於動態維護的問題。
動態中位數
動態求解前i個數的中位數。
黑盒子
動態求解前u[i]個數第i大的數。超市
貪心題目。需要用到二叉堆的查詢最值、插入和刪除功能。序列
多路歸併問題。注意到是求和問題,題目讓求m個序列「合併」得到的n個值,如果我們得到了前m - 1個序列「合併」n個值,那麼只需要把這n個值看成乙個新的序列,轉換成兩個序列「合併」成n個值的問題。很明顯用遞迴或遞推都可以。我們只需要解決如何「合併」兩個序列即可。
兩個序列如何合併呢?
a : a1 a2 a3 a4 …… an(a已經排好序)
b : b1 b2 b3 b4 …… bn
我們把那n ^ 2的序列寫成如下形式 :
b1 + a1 b1 + a2 b1 + a3 …… b1 + an
b2 + a1 b2 + a2 b2 + a3 …… b2 + an
……bn + a1 bn + a2 bn + a3 …… bn + an
我們得到了n個排好序的含有n個數的序列。
把n個序列的第乙個數儲存到乙個資料結構a中,那麼這n ^ 2個數中最小的那個數一定在a中。假設是b2 + a1,取出b2 + a1後,再把b2 + a2放入資料結構中。如此反覆,直到得到前n個數為止。
我們發現,該資料結構涉及到插入、刪除和查詢最值的操作,很明顯用二叉堆。
構造乙個帶有n個葉節點的k叉樹。每個節點都有權值wi和到根節點的距離li,該樹要求sum(wi * li)最小。這樣的樹稱為哈夫曼樹。
合併果子
畫圖可知,該問題等價於要求乙個帶有n個葉節點的二叉樹。每次合併兩堆的重量之和 等價於 這兩堆的葉節點的權值又被加了一次。於是該問題可以轉換為哈夫曼樹問題。
荷馬史詩
該編碼方式其實就是哈夫曼編碼。題目有要求:如何選擇 si,才能使替換以後得到的新的《荷馬史詩》長度最小。《荷馬史詩》的長度等於替換後的單詞的編碼長度乘以出現次數,很明顯是個哈夫曼樹。 把每個單詞看作葉節點,葉節點的權值是出現次數。將這些葉節點合併為k叉哈夫曼樹。
題目有乙個要求:對於任意的 1≤i,j≤n,i≠j,都有:si 不是 sj 的字首。我們可以聯想到trie樹。對於trie樹而言,從根節點到葉節點的字串不會是任何乙個字串的字首。
因此把該哈夫曼樹看成trie樹,節點的每個分支依次標記為0 ~ k - 1,就可以得到每個單詞的編碼。
題目還有乙個要求:在確保總長度最小的情況下,達達還想知道最長的 si 的最短長度是多少?我們只需要在合併權值相同的節點時,優先選擇深度最小的節點即可。
資料結構之(二叉)堆
二叉 堆是乙個陣列,是一顆近似完全二叉樹,分為大頂堆 小頂堆。表示堆的陣列a有兩個屬性 1 a.length表示陣列元素的個數 2 a.heap size表示有多少個堆元素儲存在陣列a中。更多的關於堆的性質的介紹 演算法導論第三版 p85 p89 程式設計珠璣 p141 p145。堆的操作主要包括堆...
資料結構之二叉堆
二叉堆的介紹 二叉堆是完全二元樹或者是近似完全二元樹,按照資料的排列方式可以分為兩種 最大堆和最小堆。示意圖如下 二叉堆一般都通過 陣列 來實現。陣列實現的二叉堆,父節點和子節點的位置存在一定的關係。有時候,我們將 二叉堆的第乙個元素 放在陣列索引0的位置,有時候放在1的位置。當然,它們的本質一樣 ...
資料結構 二叉堆
二叉堆一般用來實現優先佇列 優先佇列是一種至少允許以下兩種操作的資料結構 insert 以及 deletemin 同查詢樹一樣,二叉堆具有結構性與堆序性,對二叉堆的基本操作可能會破壞這些性質,所以二叉堆的操作要直到其基本性質滿足才能結束。一 結構性 二叉堆在結構上為完全二叉樹,其具有完全二叉樹的結構...