亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? huffman_arithmetic.c

?? 自己用C編寫的Huffman編碼通信系統應用
?? C
字號:
#include "huffman.h"
//2006-11-04
/*利用哈夫曼樹很容易求出給定字符集及其概率(或頻度)分布的最佳不等長編碼。哈夫曼編碼正是一種應用廣泛
  且非常有效的數據壓縮技術。該技術一般可將數據文件壓縮掉20%至90%,其壓縮效率取決于被壓縮文件
  的特征。
*/
/*由哈夫曼樹求得編碼為最優異字頭碼的原因:
①每個葉子字符ci的碼長恰為從根到該葉子的路徑長度li,平均碼長(或文件總長)又是二叉樹的帶權路徑長度WPL。而哈夫曼樹是WPL最小的二叉樹,因此編碼的平均碼長(或文件總長)亦最小。
②樹中沒有一片葉子是另一葉子的祖先,每片葉子對應的編碼就不可能是其它葉子編碼的前綴。即上述編碼是二進制的異字頭碼。
*/

/*-------------------------------------------------------------------------------------*/
//在函數InputWeightData()中調用函數characters_analysis()從而求出了N和M的大小。
void CreateHuffmanTree(HuffmanTree T,const char* const FILENAME) //構造哈夫曼樹;T[M-1]為其根結點
{
	int i;
	int p1;
	int p2;    

	InitHuffmanTree(T); //將T初始化,T有M個結點,即T是有M個元素的數組。
	InputWeightData(T,FILENAME);//輸入N個葉子的權值及數據至T[0..N-1]的weight域及data域
	for(i = N;i < M;++i){ //共進行N-1次合并,新結點依次存于T[i]中
		SelectMin(T,i - 1,&p1,&p2); //在T[0..i-1]中選擇兩個權最小的根結點,其序號分別為p1和p2
        T[p1].parent = i; //數組下標;其值>=0。
		T[p2].parent = i;        
        T[i].lchild = p1; //最小權的根結點是新結點的左孩子
		T[i].rchild = p2; //次小權的根結點是新結點的右孩子
		T[i].weight = T[p1].weight + T[p2].weight;
	} 
}

/*-------------------------------------------------------------------------------------*/
//哈夫曼編碼算法——由哈夫曼樹T求得字符集的"哈夫曼編碼表H"
void SetHuffmanEncodeTable(HuffmanTree T,HuffmanCodeTable H) //根據哈夫曼樹T求哈夫曼編碼表H
{
	int child;
	int parent; // c和p分別指示T中孩子和雙親的位置
	int i; 
    char code[N1 + 1]; //臨時存放編碼,數組大小為N1 + 1。
	int start; //指示編碼在code中的起始位置

	code[N1] = '\0'; //編碼結束符
	for(i = 0;i < N;++i){ //依次求N個葉子結點T[i]的編碼
		H[i].ch = T[i].data;//讀入葉子T[i]對應的字符
		start = N1; //編碼起始位置的初值
		child = i; //從葉子T[i]開始上溯
		while((parent = T[child].parent) >= 0){//直至上溯到T[c]是樹根為止,樹根時parent為-1。
			code[--start] = (T[parent].lchild == child) ? '0' : '1';//用一個三目運算符表示
//若T[child]是T[parent]的左孩子,則生成代碼0;否則生成代碼1
            child = parent; //繼續上溯
		}
		strcpy(H[i].bits,&code[start]); //復制編碼位串,在此好好理解字符串拷貝
/*&code[start]表示是以字符串code的從start位置開始到結束的一個code的字符子串。因為start是字符串
  開始的有效位置,所以從此地方開始拷貝字符串。*/
	}
}

/*-------------------------------------------------------------------------------*/
//哈夫曼編碼——對原始數據文件"DATAFILE"的編碼:
//對數據文件中的1個字符進行編碼
char HuffmanEncode(HuffmanCodeTable H,FILE* fp1,FILE* fp2)
{
	int i = 0;
	char ch;
	char code[N1 + 1]; //臨時存放編碼	

	ch = ReadACharFromFile(fp1); //從原始數據文件中讀取一個字符
	if(ch == '\0') //當讀到文件尾標記EOF時返回了標記'\0'
		return ch; //返回'\0'標記讀到文件尾標記EOF

	FindChar(H,ch,&i); //在哈夫曼編碼表H中找到字符ch的位置i
	if(ch == H[i].ch)
		strcpy(code,H[i].bits); //編碼結果存在code中
	WriteStringsToFile(fp2,code);//把字符串code寫入編碼文件保存
	return '!'; //返回非'\0'
}

/*----------------------------------------------------------------------------------*/
//哈夫曼譯碼——對已編碼文件"ENCODEFILE"的譯碼:
/*算法中可以使用T[i].lchild是否為-1來判定T[i]是否為葉子結點,是因為哈夫曼樹是嚴格二叉樹,樹中
  沒有度數為1的分支結點。*/
//哈夫曼樹的根結點為T[M-1]。 
//對1個字符對應的編碼序列進行譯碼
char HuffmanDecode(HuffmanTree T,HuffmanCodeTable H,FILE* fp1,FILE* fp2)
{
	int i;
	char ch;
	char ch1; //臨時存儲所譯碼的對應字符集中的字符。

	i = M -1; //指向樹的根結點。此地方要用M,不能用M1,注意!!!因為Huffman樹的結點總數是M。
	while(1){
		ch = ReadACharFromFile(fp1); //從編碼文件中讀取一個二進制碼'0'或'1'字符
		if(ch == '\0')  //當讀到文件尾標記EOF時返回了標記'\0'
			return ch; //返回'\0'標記讀到文件尾標記EOF

		if(ch == '0')
			i = T[i].lchild; //轉向左孩子
		else
			i = T[i].rchild; //轉向右孩子
		if(T[i].lchild == -1){ //則已到葉子結點
			ch1 = H[i].ch;//對應哈夫曼碼表中的字符
			WriteACharToFile(ch1,fp2); //把譯碼結果寫入譯碼文件保存
			break; //結束此次譯碼
		}
	}
    return '!'; //返回非'\0'
}

/*--------------------------------------------------------------------------------------------*/
void InitHuffmanTree(HuffmanTree T) //將T初始化,T有M個結點,即T是有M個元素的數組。
{
	int i;

/*初始定義的數組大小為M1;其有效數據元素為M個。M是在程序中所求;M1是一個常量,以聲明數組的
  大小(編譯時就要確定數組的大小)。*/
	for(i = 0;i < M1;++i){ //這里M的值還沒有求出來,故對整個初始數組進行初始化
		T[i].data = '\0';
		T[i].weight = 0.0;
		T[i].lchild = -1;
		T[i].rchild = -1;
		T[i].parent = -1;
	}
}	

/*--------------------------------------------------------------------------------------*/
//輸入N個葉子的權值及數據至T[0..N-1]的weight域及data域
//由分析原始數據文件后得到字符集F的字符個數N。在函數characters_analysis()中求出了N和M。
void InputWeightData(HuffmanTree T,const char* const FILENAME) 
{
	int i;
    StrSetFrequencyTable F; //字符集的頻率(頻度)表F(數組),有N個元素(對應N個字符)

    characters_analysis(F,FILENAME);//分析數據文本文件的字符構成及各字符的頻率(頻度)
//到此已求出了N和M的大小。
	for(i = 0;i < N;++i){ //這里要用N,表示N個葉子結點。不能用N1。注意!!!
		T[i].data = F[i].data;
		T[i].weight = F[i].weight;
	}
}

/*---------------------------------------------------------------------------------*/
void SelectMin(HuffmanTree T,int i,int* p1,int* p2)//在T[0..i]中選擇兩個權最小的根結點,由p1,p2返回其位置
{
	int minimum1; //最小值位置標記
	int minimum2; //次小值位置標記
	int j;
	int flag1;
	int flag2;
	int FLAG;

	FLAG = 0;
	for(j = 0;j <= i;++j){//在當前的(i+1)個結點中選取兩個權值最小的根結點
		while(T[j].parent != -1)//找一個樹根;為-1時即為求解問題時森林中某孤立樹的樹根。
			++j; 		
		flag1 = j;
		if(FLAG == 0){//第一次要找兩個孤立樹的樹根,以后每次只需找一個;以后不再執行此代碼段。
			while(T[++j].parent != -1)//找下一個孤立樹的樹根;
				continue;
			flag2 = j;
			if(T[flag1].weight < T[flag2].weight){
				minimum1 = flag1;
				minimum2 = flag2;
				FLAG = 1;
				continue;//繼續找下一個孤立樹的樹根;進行下一次for循環
			}
		}
		if(T[flag1].weight < T[minimum1].weight){
            minimum2 = minimum1; //修正次小值
			minimum1 = flag1; //修正最小值
		}			
		else if(T[flag1].weight < T[minimum2].weight)//只需修正次小值
			minimum2 = flag1; 			
	}
	*p1 = minimum1;
	*p2 = minimum2;
}

/*------------------------------------------------------------------------------*/
void FindChar(HuffmanCodeTable H,char ch,int* ptr_i)
{
	int j;

	for(j = 0;j < N;++j){
		if(H[j].ch == ch){
			*ptr_i = j;
			break;
		}
	}
}

/*-------------------------------------------------------------------------------*/
/*① 初始森林中的n棵二叉樹,每棵樹有一個孤立的結點,它們既是根,又是葉子
  ② n個葉子的哈夫曼樹要經過n-1次合并,產生n-1個新結點。最終求得的哈夫曼樹中共有2n-1個結點。
  ③ 哈夫曼樹是嚴格的二叉樹,沒有度數為1的分支結點。

哈夫曼算法的簡要描述:
     在上述存儲結構上實現的哈夫曼算法可大致描述為(設T的類型為HuffmanTree):
(1)初始化
將T[0..m-1]中2n-1個結點里的三個指針均置為空(即置為-1,因為數組下標從0開始),權值置為0.0,
數據值置為'0'。
(2)輸入
讀人n個葉子的權值存于向量的前n個分量(即T[0..n-1])中。它們是初始森林中n個孤立的根結點上的權值。
(3)合并
對森林中的樹共進行n-1次合并,所產生的新結點依次放人向量T的第i個分量中(n≤i≤m-1)。每次合并分兩步:
①在當前森林T[0..i-1]的所有結點中,選取權最小和次小的兩個根結點[p1]和T[p2]作為合并對象,
  這里0≤p1,p2≤i-1。
②將根為T[p1]和T[p2]的兩棵樹作為左右子樹合并為一棵新的樹,新樹的根是新結點T[i]。具體操作:
 將T[p1]和T[p2]的parent置為i,
 將T[i]的lchild和rchild分別置為p1和p2
 新結點T[i]的權值置為T[p1]和T[p2]的權值之和。
注意:合并后T[pl]和T[p2]在當前森林中已不再是根,因為它們的雙親指針均已指向了T[i],所以下一次合并
      時不會被選中為合并對象。
*/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
极品美女销魂一区二区三区| 亚洲综合一区二区精品导航| 久久精品国产精品青草| 日韩手机在线导航| 捆绑变态av一区二区三区| 久久精品一区二区| 9l国产精品久久久久麻豆| 亚洲免费三区一区二区| 欧美日韩国产精选| 狂野欧美性猛交blacked| 国产欧美一区二区三区在线老狼| 波多野结衣中文字幕一区二区三区| 亚洲日本欧美天堂| 欧美精品在线一区二区| 成人一区二区视频| 一区二区三区在线视频免费观看| 777久久久精品| 国产激情视频一区二区在线观看| 亚洲欧美一区二区视频| 6080yy午夜一二三区久久| 国产精品亚洲一区二区三区在线 | 亚洲无线码一区二区三区| 91精品国产美女浴室洗澡无遮挡| 国产精品一区二区不卡| 亚洲精品国产无套在线观| 欧美一区二区三区免费在线看| 粉嫩高潮美女一区二区三区| 午夜天堂影视香蕉久久| 国产亚洲成aⅴ人片在线观看| 91久久香蕉国产日韩欧美9色| 免费在线看成人av| 亚洲男人天堂av| 精品乱人伦一区二区三区| 色成人在线视频| 国产一区 二区 三区一级| 亚洲制服丝袜av| 国产欧美视频在线观看| 欧美精品久久99| 成人aaaa免费全部观看| 美女视频网站久久| 亚洲一区二区三区免费视频| 欧美国产一区二区在线观看 | 欧美大片一区二区三区| 一道本成人在线| 国产河南妇女毛片精品久久久| 亚洲成人一区在线| 亚洲日本中文字幕区| 久久久久国产精品免费免费搜索| 欧美精品v日韩精品v韩国精品v| 99精品视频一区二区三区| 国产一区三区三区| 91网上在线视频| 国产一区二区免费视频| 日韩av中文字幕一区二区三区| 亚洲婷婷综合色高清在线| 久久久精品人体av艺术| 欧美va天堂va视频va在线| 欧美日韩一区小说| 色美美综合视频| 成人av在线电影| 国产成人免费在线观看| 精油按摩中文字幕久久| 日韩精品色哟哟| 五月天网站亚洲| 亚洲综合激情另类小说区| 日韩理论片一区二区| 中文字幕在线播放不卡一区| 久久久精品影视| 337p日本欧洲亚洲大胆精品| 精品久久久久久最新网址| 欧美本精品男人aⅴ天堂| 欧美一级高清片在线观看| 在线不卡的av| 欧美一级片免费看| 制服丝袜激情欧洲亚洲| 欧美高清激情brazzers| 欧美一级理论片| 精品噜噜噜噜久久久久久久久试看| 日韩欧美国产wwwww| 欧美大片一区二区三区| 精品免费国产二区三区| 久久久不卡影院| 日本一区二区免费在线观看视频| 国产欧美一区二区精品性色| 国产精品萝li| 一区二区三区影院| 午夜影院在线观看欧美| 日韩av电影免费观看高清完整版在线观看| 午夜久久久久久久久| 日本亚洲最大的色成网站www| 日本精品一区二区三区高清| 欧美视频一区二区三区四区| 欧美精品第一页| 26uuu国产在线精品一区二区| 久久伊人中文字幕| 国产精品超碰97尤物18| 亚洲国产精品久久久男人的天堂| 日韩电影网1区2区| 国内成人精品2018免费看| 成人午夜在线播放| 在线观看亚洲精品视频| 日韩一区二区在线观看视频| 国产亚洲一区二区三区在线观看| 亚洲欧洲精品一区二区精品久久久| 亚洲一区二区三区四区五区中文| 美女视频免费一区| 成人黄色免费短视频| 在线免费观看不卡av| 日韩欧美一级片| 国产精品女主播在线观看| 亚洲精品va在线观看| 精品一区精品二区高清| 北岛玲一区二区三区四区| 欧美美女一区二区在线观看| 久久一二三国产| 一级日本不卡的影视| 久久国内精品视频| 99在线热播精品免费| 日韩欧美另类在线| 亚洲欧美国产高清| 精品一区二区成人精品| 91久久精品国产91性色tv| 欧美成人一区二区三区在线观看| 中文字幕视频一区二区三区久| 午夜精品视频在线观看| 成人午夜av在线| 欧美一级在线免费| 夜夜精品视频一区二区| 国产乱码一区二区三区| 欧美日韩在线一区二区| 国产精品久久久久aaaa樱花| 免费成人美女在线观看.| 在线观看91av| 亚洲欧洲99久久| 免费观看30秒视频久久| 91黄色免费版| 国产精品网站在线观看| 精品亚洲成av人在线观看| 欧美三区免费完整视频在线观看| 国产欧美视频一区二区| 久久99精品国产| 欧美区一区二区三区| 综合久久久久久久| 国产做a爰片久久毛片| 91精品国产综合久久国产大片| 一区二区三区美女| 99国产精品一区| 国产日韩精品一区二区三区在线| 免费在线观看成人| 欧美日韩黄色影视| 一区二区理论电影在线观看| 91免费在线视频观看| 国产精品久久久久久久久免费相片| 激情小说欧美图片| 日韩午夜在线影院| 日韩中文字幕av电影| 欧美日韩高清在线| 亚洲一区二区在线观看视频 | 美腿丝袜在线亚洲一区| 欧美日韩精品欧美日韩精品| 亚洲va欧美va国产va天堂影院| 97se亚洲国产综合自在线不卡 | 国产精品久久久久久久久晋中 | 亚洲色欲色欲www| 成人爱爱电影网址| 亚洲国产精品99久久久久久久久 | 中文字幕亚洲精品在线观看| 成人久久视频在线观看| 久久精品亚洲一区二区三区浴池| 国内偷窥港台综合视频在线播放| 久久久久久免费网| 欧美剧情电影在线观看完整版免费励志电影| 亚洲女同女同女同女同女同69| 99re6这里只有精品视频在线观看| 1区2区3区欧美| 在线观看国产日韩| 日韩黄色免费电影| 精品国产乱码久久久久久久久 | 国产精品狼人久久影院观看方式| 成人午夜视频在线| 亚洲精品国产品国语在线app| 欧美伊人久久久久久久久影院| 日日夜夜免费精品| 日韩一区二区在线看| 国产一区 二区 三区一级| 亚洲欧洲性图库| 欧美三级日本三级少妇99| 青青草国产成人99久久| 久久综合久久久久88| 成人看片黄a免费看在线| 亚洲自拍与偷拍| 日韩欧美一区在线| 国产成人免费网站| 亚洲精品视频免费观看| 欧美精品色综合| 国产精华液一区二区三区| 自拍av一区二区三区| 在线电影院国产精品| 国产成人无遮挡在线视频| 亚洲一区二区三区四区在线免费观看|