求助有關哈夫曼樹的問題!急!滿意的答案再加

時間 2021-11-01 03:16:32

1樓:楊嘉路

路徑和路徑長度

若在一棵樹中存在乙個結點序列k1,k2,…kj ,使得ki是ki+1的雙親(1≤i≤j),則稱此結點序列是從k1到kj的路徑。從k1~kj所經過的分支數稱為這兩結點間的路徑長度。

結點的權和帶權路徑長度

在許多應用中,常為樹中的結點賦上一有意義的實數,該實數稱為結點的權。結點的帶權路徑長度規定為從樹根結點到該結點之間的路徑長度與該結點的權的乘積。

樹的帶權路徑長度n

2樓:匿名使用者

基本術語

路徑和路徑長度

若在一棵樹中存在乙個結點序列k1,k2,…kj ,使得ki是ki+1的雙親(1≤i≤j),則稱此結點序列是從k1到kj的路徑。從k1~kj所經過的分支數稱為這兩結點間的路徑長度。

結點的權和帶權路徑長度

在許多應用中,常為樹中的結點賦上一有意義的實數,該實數稱為結點的權。結點的帶權路徑長度規定為從樹根結點到該結點之間的路徑長度與該結點的權的乘積。

樹的帶權路徑長度

n樹的帶權路徑長度為樹中所有葉子結點的帶權路徑長度之和,記為wpl= ∑ wili

i=1哈夫曼樹

哈夫曼(huffman)樹又稱最優二叉樹,它是n個帶權葉子結點構成的所有二叉樹中帶權路徑長度wpl最小的二叉樹。

構造哈夫曼樹

構造演算法如下:

(1) 根據與n個權值對應的n個結點構成具有n棵二叉樹的森林f=,其中第i棵二叉樹ti(1 ≤ i ≤ n)都只有乙個權值為wi的根結點,其左、右子樹均為空

(2) 在森林f中選出兩棵根結點的權值最小的樹作為一棵新樹的左、右子樹,且置新樹的根結點的權值為其左、右子樹上根結點權值之和

(3) 從f中刪除構成新樹的那兩棵,同時把新樹加入f中

(4) 重複第(2)和第(3)步,直到f中只含有一棵為止,此樹便為哈夫曼樹

哈夫曼編碼

等長編碼缺點:使傳送電文總長度很長

不等長編碼缺點:解碼的二義性或多義性

字首編碼:對某一字符集進行不等長編碼時,任一字元編碼都不是其它字元編碼的字首

哈夫曼編碼:由編碼哈夫曼樹所得到的字元編碼(由編碼哈夫曼樹所得到的字元編碼)

例:在一電文中,六個字元a,b,c,d,e,f的出現頻率依次為4,2,6,8,3,2,如圖(a)

由此構造的哈夫曼編碼樹如圖(b)所示

a、b、c、d、e、f的哈夫曼編碼依次為:00、1010、01、11、100、1011

電文的最短傳送長度l=wpl=4×2+2×4+6×2+8×2+3×3+2×4=61

3樓:匿名使用者

既然這麼急,就說是用什麼語言啊,c/c++、basic...

還有,英文詞典裡的單詞統計前,是讀帶單詞表的檔案,還是自定義初始化賦值就可以了呢!

你說要用c,我用的是turbo c 2 編譯的,怎麼不是c++呢,我可是從百忙中啊!

其中假設英語詞典以單詞表形式儲存在c:\word.txt中,且每一行乙個單詞。

**如下:

/*huffmancode by tc 2

author: ejau

ver 1.00

data:19/05/2006

*/#include

#include

#include

#include

#include

typedef struct htnode,*huffmantree;

typedef char **huffmancode;

typedef struct mincode;

void error(char *message);

huffmancode huffmancoding(huffmantree ht,huffmancode hc,float *kt,unsigned int n);

mincode select(huffmantree ht,unsigned int n);

void main()

while(fscanf(file1,"%s",count)!=eof)

fclose(file1);

int tatolnum=0;

for(i=0;i<=n;i++)

tatolnum=tatolnum+w[i];

for(i=1;i<=n;i++)

kt[i]=(float *)w[i]/tatolnum;

hc=huffmancoding(ht,hc,kt,n);

printf("huffmancode:\n");

printf("letter\t\tweight\t\tcode\n");

for(i=1;i<=n;i++)

printf("%c\t\t%f\t\t%s\n",i+64,kt[i],hc[i]);

}void error(char *message)

huffmancode huffmancoding(huffmantree ht,huffmancode hc,float *kt,unsigned int n)

for(;i<=m;i++,p++)

for(i=n+1;i<=m;i++)

printf("ht list:\n");

printf("letter\t\tweight\t\tparent\t\tlchild\t\trchild\n");

for(i=1;i<=m;i++)

printf("%c\t\t%f\t\t%d\t\t%d\t\t%d\n",i+64,ht[i].weight,ht[i].parent,ht[i].

lchild,ht[i].rchild);

hc=(huffmancode)malloc((n+1)*sizeof(char *));

cd=(char *)malloc(n*sizeof(char *));

cd[n-1]='\0';

for(i=1;i<=n;i++)

free(cd);

return hc;

}mincode select(huffmantree ht,unsigned int n)

tempi=i++;

for(;i<=n;i++)

if(ht[i].weights2)

code.s1=s1;

code.s2=s2;

return code;}

關於哈夫曼樹的問題,各位可以幫小女子看看嘛

這題表示哈夫曼樹的節點的度要麼是0要麼是m設度不為0 即非葉結點 的個數為x 則總的結點數為 x n 除根結點外,其餘的每乙個結點都有乙個分支連向乙個結點,對於度為m的每個結點都有m個分支,而度為0的結點是沒有分支的,所以從分支的情況來看 總的結點數字 x m 1 這裡的1為根結點 兩者相等,所以答...

有關AP課程的問題急滿意有分追加,絕不吝嗇

1.微積分ab或bc,物理b,統計,微觀經濟先學微積分吧,在學物理,在學經濟,在學統計,因為統計最為文科,考前看效果最好,理科的東西學了不容易忘,所以早點看比較好。2.這我就不知道了,你自己上網找找吧,我全部都是自學的。書目我可以推薦下,普林斯頓。3.我在第一問里已經回答了。4.我說的幾門都能換,你...

解碼系統,對文字檔案中的字元進行哈夫曼編碼,生成編碼檔案(壓縮檔案,字尾名 co

超人先生一號 我給你個差不多的,你自己修改一下就可以用了 huffman編碼和解碼 include include include include typedef struct htnode,huffmantree typedef struct huffmancode typedef struct ...