王道計算機機試練習 哈夫曼樹

2021-10-03 16:22:07 字數 1373 閱讀 2010

題目描述

哈夫曼樹,第一行輸入乙個數 n,表示葉結點的個數。需要用這些葉結點生 成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即 weight,題目需要輸出 所有結點的值與權值的乘積之和。

1)將所有結點放入集合 k。

2)若集合 k 中剩餘結點大於 2 個,則取出其中權值最小的兩個結點, 構造他 們同時為某個新節點的左右兒子,該新節點是他們共同的雙親結點,設定它的權 值為其兩個兒子結點的權值和。並將該父親結點放入集合 k。重複步驟 2 或 3。

3)若集合 k 中僅剩餘乙個結點, 該結點即為構造出的哈夫曼樹數的根結點, 所有構造得到的中間結點 (即哈夫曼樹上非葉子結點 )的權值和即為該哈夫曼樹 的帶權路徑和。 為了方便快捷高效率的求得集合 k 中權值最小的兩個元素,我們需要使用堆數 據結構。它可以以 o(logn)的複雜度取得 n 個元素中的最小元素。為了繞過對 堆的實現,我們使用標準模板庫中的相應的標準模板 ——優先佇列。

priority_queue<

int> q;

建立乙個儲存元素為 int 的堆 q,但是請特別注意這樣建立的堆其預設為大 頂堆,即我們從堆頂取得的元素為整個堆中最大的元素。而在求哈夫曼樹中,我 們恰恰需要取得堆中最小的元素,於是我們使用如下語句定義乙個小頂堆:

priority_queue<

int, vector<

int>

, greater<

int>> q;

//建立乙個小頂堆

關於堆的有關操作如下:

q.

push

(x);

//將元素 x 放入堆 q 中。

int a = q.

top();

// 取出堆頂元素,即最小的元素儲存在 a 中。

q.pop()

;//彈出堆頂元素,取出後堆會自動調整為乙個新的小頂堆。

#include

#include

using

namespace std;

priority_queue<

int, vector<

int>

, greater<

int>> q;

//建立乙個小頂堆

intmain()

int ans =0;

//儲存答案

while

(q.size()

>1)

cout << ans;

}return0;

}

在使用了優先佇列以後,求哈夫曼樹的過程不僅時間複雜度降低許多( o (nlogn)),同時**也輕便不少,所以使用資料結構堆來輔助求解哈夫曼樹, 是求哈夫曼樹的最佳選擇。

計算機機試題 哈夫曼樹

題目描述 哈夫曼樹,第一行輸入乙個數n,表示葉結點的個數。需要用這些葉結點生成哈夫曼樹,根據哈夫曼樹的概念,這些結點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。輸入 輸入有多組資料。每組第一行輸入乙個數n,接著輸入n個葉節點 葉節點權值不超過100,2 n 1000 輸出 輸出...

王道 哈夫曼樹(C )

題意 哈夫曼樹,第一行輸入乙個n,表示葉節點的個數。需要用這些葉節點生成哈夫曼樹,根據哈夫曼樹的概念,這些節點有權值,即weight,題目需要輸出所有結點的值與權值的乘積之和。樣例輸入輸出 輸入1 2 2 5 9 輸出 基礎 1.在一棵樹中,從任意乙個結點到達另乙個結點的通路被稱為路徑,該路徑上所需...

王道計算機機試練習 高精度大整數隨意進製換算

將 m 進製的數 x 轉換為 n 進製的數輸出。輸入 輸入的第一行包括兩個整數 m 和 n 2 m,n 36 下面的一行輸入乙個數 x,x 是 m 進製的數,現在要求你將 m 進製的數 x 轉換成 n 進製的數輸出。輸出 輸出 x 的 n 進製表示的數。該題初看起來很像一般的進製轉換,但提示中明確告...