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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? huffman_h.cpp

?? 使用huffman二叉樹對文件進(jìn)行壓縮,代碼中使用了自適應(yīng)算法。不需要兩次遍歷源文件!
?? CPP
字號:
#include "huffman_h.h"#include <math.h>void huffman_h::generate_codes(int num, const unsigned long* weights){	if (num <= 1 || weights == NULL)		throw new huffman_exception("參數(shù)非法");		int heap_num, i, nonzero_count;	// 分配生成Huffman樹時使用的堆結(jié)構(gòu),其大小是元素?cái)?shù)目的2倍	unsigned long* heap = new unsigned long[2*num];	if (heap == NULL) throw new huffman_exception("內(nèi)存不足");		// 將所有元素權(quán)值值(葉子結(jié)點(diǎn))復(fù)制到堆的后半部分,堆的前半部分置0	memcpy(heap + num, weights, sizeof(unsigned long)*num);	memset((char *)heap, 0, num * sizeof (*heap));	// 將堆的前半部分視作指針,按順序指向后半部分的葉子結(jié)點(diǎn)	// 同時統(tǒng)計(jì)權(quán)值非0的葉子結(jié)點(diǎn)數(shù)目	for (nonzero_count = i = 0; i < num; i++)		if (heap[num + i])			heap[nonzero_count++] = num + i;	if (pow(2.0, (double)max_code_len) < (double)nonzero_count)		throw new huffman_exception("元素個數(shù)超出了預(yù)設(shè)的最大碼長限制");	/* 將堆的前半部分視作指針,按照指針?biāo)傅臋?quán)值大小,把堆的前半部分組織成為	   堆排序(Heap Sort)算法中定義的"堆",即:堆對應(yīng)一棵完全二叉樹,且所有非葉	   結(jié)點(diǎn)的值均不大于其子女的值,根結(jié)點(diǎn)的值是最小的.在這里,根結(jié)點(diǎn)是heap[0]	   參見數(shù)據(jù)結(jié)構(gòu)或算法書籍中的堆排序(Heap Sort)算法介紹 */	heap_num = nonzero_count;	for (i = heap_num / 2; i > 0; i--)	{		register int curr, child;		curr = i;		child = curr * 2;		while (child <= heap_num)		{			if (child < heap_num && heap[heap[child]] < heap[heap[child - 1]])				child++;			if (heap[heap[curr - 1]] > heap[heap[child - 1]])			{				register unsigned long temp;				temp = heap[child - 1];				heap[child - 1] = heap[curr - 1];				heap[curr - 1] = temp;				curr = child;				child = 2 * curr;			}			else				break;		}	}		/* 創(chuàng)建Huffman樹	   這里,創(chuàng)建Huffman樹的過程利用了堆排序(Heap Sort)算法的基本原理,即根結(jié)點(diǎn)是	   最小的元素,樹中最后一個元素是最大的元素.選出根結(jié)點(diǎn)后,把最后的元素調(diào)到根	   結(jié)點(diǎn),從樹根到樹葉,讓最后的元素移動到合適的位置,重新建成堆.這樣,總是可以	   找出2個最小的子樹,將這兩個子樹合并后,再作為新元素放到堆中.所有子樹都合并	   后,Huffman樹就建成了.(參見數(shù)據(jù)結(jié)構(gòu)或算法書籍中的堆排序算法介紹) 	   這一段代碼的運(yùn)行結(jié)果是整個heap數(shù)組成了一棵Huffman樹,heap[0]未用,樹根是	   heap[1],其中保存所有權(quán)值值的總和, heap[2]..heap[num-1]對應(yīng)于所有根以外	   的分支結(jié)點(diǎn),其中保存的是雙親結(jié)點(diǎn)的索引值, heap[num]..heap[num*2-1]對應(yīng)于所	   有葉子結(jié)點(diǎn)(即所有要編碼的元素),其中保存的是雙親結(jié)點(diǎn)的索引值 */	// 為了建樹之后,對二叉樹進(jìn)行限制碼長的調(diào)整,有必要在建樹過程中,每選出一個	// 葉子結(jié)點(diǎn),就用數(shù)組index按順序記錄下元素位置	int* index = new int[num]; int index_i = 0;	if (index == NULL) throw new huffman_exception("內(nèi)存不足");	/* 當(dāng)用于堆排序的二叉樹中還有結(jié)點(diǎn)時循環(huán) */	while (heap_num > 1)	{		int pos[2];		/* 循環(huán)2次,找出2個最小的子樹,存入pos中 */		for (i = 0; i < 2; i++)		{			register int curr, child;			/* 根結(jié)點(diǎn)就是最小的結(jié)點(diǎn) */			pos[i] = heap[0];			if (pos[i] >= num) // 如果是葉子結(jié)點(diǎn),就記錄				index[index_i++] = pos[i];			/* 將最后的結(jié)點(diǎn)移動到根結(jié)點(diǎn)處,總結(jié)點(diǎn)數(shù)目減1 */			heap[0] = heap[--heap_num];			/* 以下是重建堆的過程 */			curr = 1;			child = 2;			while (child <= heap_num)			{				if (child < heap_num &&					heap[heap[child]] < heap[heap[child - 1]])					child++;				if (heap[heap[curr - 1]] > heap[heap[child - 1]])				{					register int temp;					temp = heap[child - 1];					heap[child - 1] = heap[curr - 1];					heap[curr - 1] = temp;					curr = child;					child = 2 * curr;				}				else					break;			}		}		/* 合并子樹,其結(jié)果作為新的結(jié)點(diǎn)放入堆中(但不在堆排序的二叉樹內(nèi),實(shí)際		   上,新加入的結(jié)點(diǎn)是和堆的后半段一起構(gòu)成了Huffman樹) */		heap[heap_num + 1] = heap[pos[0]] + heap[pos[1]];		/* 子樹的左,右分支都指向子樹的根結(jié)點(diǎn) */		heap[pos[0]] = heap[pos[1]] = heap_num + 1;		/* 把子樹根結(jié)點(diǎn)作為葉子結(jié)點(diǎn),放到堆排序中的二叉樹內(nèi) */		heap[heap_num] = heap_num + 1;		{			/* 在堆中,讓新加入的葉子結(jié)點(diǎn)上升到合適的位置,不破壞堆的秩序 */			register int parent, curr;			heap_num++;			curr = heap_num;			parent = curr >> 1;			while (parent && heap[heap[parent -	1]]	> heap[heap[curr - 1]])			{				register int temp;				temp = heap[parent - 1];				heap[parent	- 1] = heap[curr - 1];				heap[curr -	1] = temp;				curr = parent;				parent = curr >> 1;			}		}	}			// 從根出發(fā),求每個編碼的碼長	int overflow = 0; // 記錄有多少個編碼超長		const int tmp = sizeof(unsigned long)*8 + 1;	int len_count[tmp];	memset(len_count, 0, sizeof(int)*tmp);	heap[0] = (unsigned long)(-1l); // 雙親結(jié)點(diǎn)為0的葉子,可由此算得碼長0	heap[1] = 0; // 根結(jié)點(diǎn)碼長為0	for (i = 2; i < 2*num; i++)	{				heap[i] = heap[heap[i]] + 1; // 結(jié)點(diǎn)碼長等于雙親結(jié)點(diǎn)碼長加1		if (i >= num)		{			if (heap[i] <= (unsigned long)max_code_len)				len_count[heap[i]]++;			else // 統(tǒng)計(jì)超長葉子結(jié)點(diǎn)數(shù)量			{							heap[i] = max_code_len;				overflow++;			}		}	}	// 如果有編碼被限制了碼長,就意味著碼長為max_code_len的編碼	// 數(shù)量已經(jīng)超過了二叉樹的容量,必須做二叉樹的重整		if (overflow > 0)	{		// 假設(shè)把超長葉子結(jié)點(diǎn)都去掉,計(jì)算碼長max_code_len處還可騰出幾個位置		// 計(jì)算方法是,從根開始,每層的分支結(jié)點(diǎn)數(shù)目等于上層分支結(jié)點(diǎn)數(shù)乘2減		// 本層葉子結(jié)點(diǎn)數(shù);最后一層的分支結(jié)點(diǎn)數(shù),就是可騰出的空位數(shù)量		int nonleaf = 1, bits; 		for(i = 1; i <= max_code_len; i++)			nonleaf = nonleaf * 2 - len_count[i]; 		// 先把nonleaf個超長結(jié)點(diǎn)放到max_code_len這一層		overflow -= nonleaf;		len_count[max_code_len] += nonleaf;		// 調(diào)整剩下的超長結(jié)點(diǎn),這個循環(huán)只調(diào)整碼長的計(jì)數(shù)數(shù)組len_count		while(overflow > 0)		{			bits = max_code_len - 1;			while(len_count[bits] == 0) bits--; // 向上找到一個有葉子的層次			len_count[bits]--; // 把葉子移下一層			len_count[bits+1] += 2; // 把移下來的葉子和超長的一個結(jié)點(diǎn)合并為一個子樹			overflow --;		};		// 下面這個循環(huán)真正對碼長進(jìn)行調(diào)整		// 從碼長最長的結(jié)點(diǎn)開始,在堆中倒著數(shù),如果發(fā)現(xiàn)實(shí)際數(shù)目		// 和len_count中記錄的不一致,就調(diào)整碼長,使之和len_count一致		int m, n; index_i = 0;		for(bits = max_code_len; bits != 0; bits--)		{			n = len_count[bits];			while(n != 0)			{				m = index[index_i++];				if (heap[m] != (unsigned long)bits)					heap[m] = bits;				n--;			}					}	}	code_lens.clear();	for (i = num; i < 2*num; i++)		code_lens.push_back(heap[i]);	// 由碼長得到canonical huffman編碼	generate_canonical_codes();	delete[] heap;	delete[] index;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩欧美高清dvd碟片| 久久久99久久| hitomi一区二区三区精品| 亚洲国产精品一区二区www在线| 日韩精品一区在线| 日本精品免费观看高清观看| 国产精品一级片| 午夜亚洲福利老司机| 亚洲日本一区二区| 欧美激情一区二区三区蜜桃视频| 日韩小视频在线观看专区| 日本二三区不卡| 成人免费高清在线观看| 美国毛片一区二区三区| 亚洲成人久久影院| 亚洲色图在线视频| 国产精品免费丝袜| 久久一区二区三区国产精品| 日韩午夜在线影院| 欧美精品乱码久久久久久按摩| 91色婷婷久久久久合中文| 国产成人av一区二区三区在线观看| 日产欧产美韩系列久久99| 亚洲午夜精品网| 一二三四区精品视频| 亚洲欧美乱综合| 日韩一区欧美一区| 欧美国产视频在线| 久久久久久免费网| 26uuu亚洲| 久久久久久夜精品精品免费| 精品国产百合女同互慰| 91精品国产综合久久福利软件| 欧美性videosxxxxx| 欧美写真视频网站| 精品视频免费在线| 欧美高清视频www夜色资源网| 欧美在线制服丝袜| 欧美人妖巨大在线| 欧美一区二区三区免费大片 | 欧美亚洲动漫制服丝袜| 91网上在线视频| 91成人免费电影| 91久久香蕉国产日韩欧美9色| 91久久精品一区二区三区| 91性感美女视频| 欧美亚洲愉拍一区二区| 精品1区2区3区| 日韩一区二区三区视频在线观看| 日韩午夜激情视频| 久久九九久久九九| 中文字幕日韩av资源站| 亚洲女同女同女同女同女同69| 一区二区三区免费| 午夜av一区二区三区| 久久99久久久久| 丰满岳乱妇一区二区三区| 99国产精品国产精品久久| 日本韩国欧美国产| 日韩一区二区三区高清免费看看| 久久一留热品黄| 中文字幕一区二区三区蜜月| 亚洲一线二线三线久久久| 日韩经典一区二区| 国产成人免费视频网站高清观看视频| 国产成人自拍网| 一本大道综合伊人精品热热| 欧美日韩国产免费一区二区| 精品国产露脸精彩对白 | 国产女主播在线一区二区| 国产精品久久久久久亚洲伦 | 日韩精品亚洲一区二区三区免费| 美女www一区二区| 成人免费黄色大片| 欧洲亚洲国产日韩| 久久这里只有精品首页| 亚洲天堂精品在线观看| 日韩成人伦理电影在线观看| 国产精品77777| 欧美色老头old∨ideo| 精品国产91亚洲一区二区三区婷婷| 国产精品情趣视频| 日韩福利视频导航| 不卡一二三区首页| 欧美一级日韩免费不卡| 国产精品污www在线观看| 无码av中文一区二区三区桃花岛| 国产精品一区二区免费不卡| 欧美自拍偷拍一区| 欧美国产视频在线| 免费一级欧美片在线观看| 不卡的av在线播放| 欧美va在线播放| 一区二区三区四区精品在线视频| 精品亚洲aⅴ乱码一区二区三区| 色婷婷av一区二区三区大白胸| 精品国产免费一区二区三区香蕉| 亚洲最新视频在线播放| 国产夫妻精品视频| 欧美一区二区三区四区在线观看| 亚洲欧洲色图综合| 国产成人综合亚洲网站| 欧美一区二区三区男人的天堂| 亚洲欧美偷拍卡通变态| 国产.精品.日韩.另类.中文.在线.播放| 欧美日韩精品一区二区| 亚洲欧美日韩一区二区| 国产成人午夜99999| 日韩小视频在线观看专区| 亚洲亚洲精品在线观看| www.亚洲色图.com| 国产视频亚洲色图| 国产麻豆精品在线| 欧美成人三级在线| 日韩精品一二三| 欧美精品乱码久久久久久按摩 | 亚洲主播在线播放| 成人h动漫精品一区二区| 久久久午夜精品理论片中文字幕| 奇米精品一区二区三区在线观看| 欧美日韩一级二级| 亚洲一二三四久久| 在线欧美一区二区| 亚洲美腿欧美偷拍| 色综合久久久久综合体桃花网| 国产精品久久久久国产精品日日| 国产精品中文字幕欧美| 国产三级欧美三级日产三级99| 黄一区二区三区| 久久久久久久久伊人| 国产精品一区二区果冻传媒| 久久一留热品黄| 国产高清在线精品| 国产精品无码永久免费888| 成人av手机在线观看| 国产精品久久毛片a| 成人精品高清在线| 亚洲欧美自拍偷拍| 欧美亚洲尤物久久| 天天综合色天天综合| 欧美一区午夜视频在线观看| 美女视频一区二区| 欧美成人一区二区三区片免费| 久久成人久久鬼色| 国产欧美精品一区aⅴ影院| 国产成都精品91一区二区三| 综合网在线视频| 欧美在线不卡视频| 天天做天天摸天天爽国产一区 | 亚洲超丰满肉感bbw| 91精品国产91久久综合桃花| 久久精品国产澳门| 久久蜜臀精品av| www.亚洲在线| 无吗不卡中文字幕| 亚洲综合无码一区二区| 91精品国产综合久久久蜜臀图片| 蜜臀va亚洲va欧美va天堂| 国产偷国产偷亚洲高清人白洁| 成人h动漫精品| 亚洲国产成人91porn| 日韩欧美一二三区| 成人毛片视频在线观看| 一区二区免费看| 日韩欧美一区二区久久婷婷| 国产成人精品影院| 亚洲免费观看高清完整版在线观看熊 | 亚洲精品视频在线观看网站| 777xxx欧美| 风间由美性色一区二区三区| 亚洲精品国产一区二区三区四区在线| 欧美日韩视频在线观看一区二区三区| 蜜臀av性久久久久蜜臀aⅴ流畅| 国产拍揄自揄精品视频麻豆| 欧美三级乱人伦电影| 国产精品一区二区你懂的| 亚洲精品成人在线| 日韩精品在线一区| 色天天综合色天天久久| 美女被吸乳得到大胸91| 国产精品国产自产拍高清av | 亚洲日本青草视频在线怡红院| 91精品在线免费观看| 成人a级免费电影| 免费成人av在线播放| 亚洲日本中文字幕区| 精品少妇一区二区三区视频免付费 | 在线日韩一区二区| 国产成人啪免费观看软件| 亚洲大片在线观看| 国产精品美女一区二区三区| 欧美高清视频www夜色资源网| eeuss鲁片一区二区三区| 青青草成人在线观看| 亚洲摸摸操操av| 久久久久久久久久久电影| 欧美一区二区日韩一区二区| 91福利国产成人精品照片| 国产精品主播直播| 日本不卡一区二区三区|