禁止碼迷,布布扣,豌豆**,碼農教程,愛碼網等第三方爬蟲**爬取!
目錄哈夫曼樹
優先順序佇列(非 stl 庫)
延伸閱讀
49
我們如果按照分割木塊的思想去分析,會顯得很不直觀,所以我們直接通過我們的目標來組合出最花費的情況,那麼這就很顯然要使用貪心演算法來解決。如圖所示用圓形來表示小木塊。
要保證花費更小,就需要讓較短的木塊後生成,較長的木塊先生成,因此我選擇較小的兩個木塊,還原為它們被分割出來之前的狀態。即選擇兩個長度為 1 的木塊,組合成乙個長度為 2 的木塊。
接下來我要去生成下乙個木塊,選擇兩個目前最短的木塊,還是兩個 1 長度的木塊,組合成長度為 2 的木塊。
重複上述操作。
模擬完畢,觀察一下我們發現,我們已經還原出了木塊的每一次應該如何切割,由於木塊切割費用與其長度相等,因此我們把黃色源泉的數字都加起來,發現正好是 49。此時我可以說,問題已經解決了,我們把目標木塊當成乙個個結點,長度當做權,這道題不就是要建一棵哈夫曼樹嘛。
將上述函式封裝好,並新增讀取資料的**即可實現。
#includeusing namespace std;
typedef struct htnode, * huffmantree;
void creathuffmantree(huffmantree& ht, int n); //建哈夫曼樹
void select(huffmantree ht, int k, int &idx1, int &idx2); //找孩子結點
int main()
cout << sum;
}void creathuffmantree(huffmantree& ht, int n)
for (i = 1; i <= n; i++)
cin >> ht[i].weight; //輸入各個結點的權值
//建哈夫曼樹
for (i = n + 1; i <= m; i++)
}void select(huffmantree ht, int k, int& idx1, int& idx2)
min1 = ht[i].weight;
idx1 = i;
}else if (ht[i].parent == 0 && min2 > ht[i].weight)}}
為了使費用最省,我們使用貪心演算法的思想,每一次選擇最小的兩段木頭拼回去,直到將所有木頭拼成一段完整的木頭,每次一拼接都計算一次費用。我們發現,優先順序佇列也是可以實現貪心演算法的。
我們首先需要先把這個佇列修改成小頂堆,方便我們實現優先順序佇列。
接下來令兩個元素出佇列,計算一次費用,然後將兩個元素之和的數字入佇列。
重複上述操作,使的佇列只剩乙個元素。
在這裡我們可以看出優先順序佇列是可以解決問題的,此時的問題是我該怎麼控制堆中的資料元素個數?通過觀察,每一次是出堆 2 個元素,入堆 1 個元素,也就是說每次的淨出堆元素是 1 個,那麼就在堆中元素為 1 時結束這個流程就行了。
接下來就是如何調整堆的問題了,比較粗暴的方式是每次更改之後都建初堆,但是這樣效率和哈夫曼樹差不多,優化不是很明顯。根據我們剛剛的分析,既然有 2 次出堆,那麼在出堆之後保證剩下的元素也是堆就可以了,那麼只需要 2 次調整堆。比較方便的操作是第一次出堆時,拿堆的最後乙個元素到堆頂調整堆,第二次出堆時直接把入堆元素填充到堆頂調整堆。
#includeusing namespace std;
void heapify(int a_heap, int idx1, int idx2);
void creatheap(int a_heap, int n);
int main()
creatheap(a_heap, count); //建初堆
while (count != 1)
cout << money;
return 0;
}void heapify(int a_heap, int idx1, int idx2) //調整堆,細節見上文
if (insert_node <= a_heap[i])
a_heap[idx1] = a_heap[i];
idx1 = i;
}a_heap[idx1] = insert_node;
}void creatheap(int a_heap, int n) //建初堆,細節見上文
}
哈夫曼樹與哈夫曼編碼
堆、優先順序佇列和堆排序
pta 修理牧場
農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l i個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是l i的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成...
PTA 資料結構 修理牧場
7 8 修理牧場 25 分 農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l i 個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是l i 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度...
PTA 7 10 修理牧場 25 分
農夫要修理牧場的一段柵欄,他測量了柵欄,發現需要n塊木頭,每塊木頭長度為整數l 個長度單位,於是他購買了一條很長的 能鋸成n塊的木頭,即該木頭的長度是l 的總和。但是農夫自己沒有鋸子,請人鋸木的酬金跟這段木頭的長度成正比。為簡單起見,不妨就設酬金等於所鋸木頭的長度。例如,要將長度為20的木頭鋸成長度...