貪心演算法 (哈夫曼編碼)HuffmanCode

2021-08-07 03:37:17 字數 2852 閱讀 5475

哈夫曼編碼應用在於對於檔案的壓縮,壓縮效率是非常的高。實現哈夫曼編碼,得首先知道哈夫曼樹的形成過程是怎樣進行的:

1、對於所要編碼的資料,首先得將它們中找到其中的最小的兩個位置合併成乙個小樹,節點的權值是兩者相加形成的;

2、步驟1中得到的權值在進入原排列中,在此獲取新組合中的最小的兩個資料,在執行步驟1;

3、對於步驟1、2要重複執行它,執行的次數其實可以思考一下,其實有n個數,執行的次數一定是n-1次而已。

以上是哈夫曼編碼的大致形成過程,其實有很多細節的東西,還得去思考。

資料格式:

#define n

200

typedef

struct

huff huffumannode;

1⃣️、這裡哈夫曼樹的形成過程:

huffumannode * createtree(int w,char  *str,int n)

//這裡你要儲存資料當然不適用位址,而是用空間去儲存,這裡要去申請乙個空間;

//下面我們是不是要進入建立樹的過程了,那麼它執行的此時就是n-1次

for(int i=1;i

if(container[j]!=null)

} //這裡獲取兩個小標例如0,1

for(int j=small2;j

if(container[j]->weightweight)

small2=j; }

}//這裡就獲取最小兩個資料的下標了。

huffumantree=(huffumannode*)malloc(sizeof(huffumannode));

huffumantree->weight=container[small1]->weight+container[small2]->weight;

//這裡你可以把小的放在左邊,當然也可以是右邊,都是一樣的只要下面換一下就可以實現了.

huffumantree->lchild=container[small1];

huffumantree->rchild=container[small2];

container[small1]=huffumantree;

//這點非常重要的,這就是在此進入容器中參與找出最小的兩個資料,指標下移

container[small2]=null: }

}我們可以看一下樹建成功了,列印一下。

非遞迴前序列印一下:

//stack---->

#define inisize

2050

typedef

struct

stackstack;

typedef

struct

queuequeue;

void

inistack(

stack

*s)int

emptystack(

stack

*s)else

return2;}

void

clearstack(

stack

*s)void

push(

stack

*s,huffumannode

d)*(s->

top)=d;

s->

top++;

}void

pop(

stack

*s,huffumannode

*d)void

destroystack(

stack

*s)int

stacksize(

stack

*s) 列印一下:

void

norecuirprevios(

huffumannode

*tree)

else

} printf

(")\n");

} //接下來表示列印哈夫曼編碼了:

左子樹列印0,右子樹列印1;

我其實考慮用深度遞迴列印,那樣非常簡單的:

void

huffmancoding(

huffumannode

*huffmantree,

intdeepth)

cout

<<

endl;

} else

} }用例測試一下:

這裡還有乙個更佳簡單的就是用陣列來實現的:

資料封裝:

typedef

struct

huffrec

huffrec, *huffrecptr;

樹的核心演算法:

intgetminpos(

intm)

}return k;}

for(m=

n; m< 2*

n- 1; m++)

intgeneratecode()

// for(i= 0; i<

n; i++)

start

[i]= 0;

for(i=0; i<

n; i++)

// start

[i]= m; }

return0;

} for(i= 0; i<

n; i++)

這是其他的方法,不過我認為前面的方法還要好一點,鍊錶要比陣列節約空間。(陣列是我們老師給大家參考舉例而寫的)

我自己寫了鍊錶的方法實現,希望各位前輩多多指教!自己還差得遠呢。

貪心演算法之哈夫曼編碼

哈夫曼編碼簡介 舉例以及詳細說明 塊測試結果 二叉樹中有一種特別的樹 哈夫曼樹 最優二叉樹 其通過某種規則 權值 來構造出一哈夫曼二叉樹,在這個二叉樹中,只有葉子節點才是有效的資料節點 很重要 其他的非葉子節點是為了構造出哈夫曼而引入的!哈夫曼編碼是乙個通過哈夫曼樹進行的一種編碼,一般情況下,以字元...

演算法 貪心演算法 哈夫曼編碼 python

博主自己手擼的 若有有錯誤,感謝指出 直接上 目錄0 講義 0.1 二元字首碼 0.2 平均傳輸位數 0.3 偽碼 0.4 例項 計算平均位數 哈夫曼編碼 生成哈夫曼樹 主函式 哈夫曼編碼是資料結構常考知識點,對比以前c寫的 python真的簡單易懂。哈夫曼編碼,計算平均位數 def huffman...

貪心 哈夫曼編碼 哈夫曼樹

解決問題 哈夫曼樹 眾所周知,計算機以01串來儲存和運算。所以,如果我們想要存乙個字元或漢字,例如a,計算機會將它變為乙個01串,這個串就是a的編碼。如果我們輸入了乙個詞 cat。如果a的編碼是1,c的編碼是10,t的編碼是11,那麼 cat 對應的編碼就是 10111 好了,那麼問題來了 1011...