D(哈夫曼樹)

2021-07-10 14:46:25 字數 1635 閱讀 3210

#include #include#include using namespace std;

structtree[100];

int main()

{ string s;

int arr[35];

int i,j,k,a,b,c,d,e,f,g;

double a;

while(cin>>s&&s!="end")

{memset(arr,0,sizeof(arr));

a=s.size();

for(i=0;i

簡單題意:題目任意給出一串字元,以end為結束。字元內容包括有26個大寫字母和乙個『_'。要求是算出8乘以字元數,再除以把字串的字元按哈夫曼樹組成的編碼總數,結                     果保留一位小數。案例可以看出輸入輸出的規則。

解題思路:首先,求出字元數,那是必須要做的,無論是被除數需要還是為以後的迴圈做準備都有必要。其實深入思考就可以知道,解決此問題有2個大難題,第一,把重複的                       字元表示提取出來而且還要知道每個字元的重複次數。第二,貪心演算法來求哈夫曼樹,並表示出來,計算出編碼總數。第乙個問題不是很難,在大一c++考試好像                         就是專門考到過這樣的題目,用乙個陣列套乙個字串然後減掉a再加加最後迴圈即可。第二個問題,那這個就是個大的問題了。首先根據哈夫曼樹的特性,建立個                       結構體 吧,裡面有4個屬性,它本身的權,它的左右兒子,它的父母。而後建立個結構體的陣列。一開始,我們需要初始化,也就是將整數陣列給結構體的屬性賦權                     值,其他屬性清0。其次,擴充套件一下結構體的陣列,因為我們一開始只給有權值的賦值了,但是根據哈夫曼樹,有多少個葉子,圓圈總數是葉子樹的二倍減一,所以                       要把擴充套件的 除權值以外的屬性清零。下面的步驟才是重點:迴圈的目的是找到已有陣列裡的最小兩個權值,然後把這2個作為此左右兒子,此為他們的父母,此權值                     也會成為他們的權值和。把此放入陣列,再進行迴圈,直到陣列滿位置,找到樹根。最後的求編碼值,思路是:找到一開始時候的陣列,也就是葉子樹,從每個葉子                     開始,迴圈找到 它離根的距離,即就是它的編碼位數,然後迴圈此陣列就可以實現。輸出用c語言更加簡單。

做題感想:其實這題比較難了,為什麼選這道題呢?其實我也有自己的想法,主要是想有個好一點的做題的開頭吧,鼓勵自己要堅持下去。上課那天的前天剛得了腸胃炎掛了水                     還沒有好,所以那天上課昏昏沉沉的,也沒有怎麼聽明白,回來自己看的課件弄的。同學舍友在選課的時候就勸我別選,但我覺得有用就選了。這學期剛開始我就覺                     得壓力很大了,主要是專業課一下子轉難了,沒適應過來,其次我還和舍友一起報了駕校,再者我週六還有輔修,所以做題的時間非常少了,但我覺得時間總可以                         擠出來的。同學舍友看我那麼忙又要勸我退,我還是想學學。這道題我用了2天的時間,查閱了哈夫曼樹,改了好多次才a的,感覺很不錯,畢竟自己很喜歡成功這                       種感覺,雖然代價有點大,但畢竟學到點東西了。大學該留下點什麼的,acm確實是個不錯的選擇,我希望自己能一直堅持下去,就算沒有時間做題,咬著牙,男人                    不會半途而廢!

哈夫曼編碼 哈夫曼樹

1.定義 哈夫曼編碼主要用於資料壓縮。哈夫曼編碼是一種可變長編碼。該編碼將出現頻率高的字元,使用短編碼 將出現頻率低的字元,使用長編碼。變長編碼的主要問題是,必須實現非字首編碼,即在乙個字符集中,任何乙個字元的編碼都不是另乙個字元編碼的字首。如 0 10就是非字首編碼,而0 01不是非字首編碼。2....

哈夫曼樹 哈夫曼編碼

定義從a結點到b結點所經過的分支序列為從a結點到b結點的路徑 定義從a結點到b結點所進過的分支個數為從a結點到b結點的路徑長度 從二叉樹的根結點到二叉樹中所有結點的路徑長度紙盒為該二叉樹的路徑長度 huffman樹 帶權值路徑長度最小的擴充二叉樹應是權值大的外界點舉例根結點最近的擴充二叉樹,該樹即為...

哈夫曼編碼 哈夫曼樹

哈夫曼樹是乙個利用權值進行優化編碼的乙個比較奇怪的樹,他的實現比較簡單,用途也比較單一。哈夫曼樹的實現,實現要求 通過哈夫曼樹可以保證在編碼過程中不會出現例如 1000和100這樣的編碼規則,否則就會編碼失敗,因為1000和100在某些情況下的編碼會一模一樣。通過哈夫曼樹可以保證權值大的值進行編碼時...