4.27总结

数据结构一:哈夫曼编码

哈夫曼编码的主要思想:为出现多次的字符编以较短的编码。 

编码的两个概念:

(1)前缀编码:如果在一个编码方案中,任一个编码都不是其他编码的前缀(最左字串),则称编码为前缀编码

(2)哈夫曼编码:对一颗具有n个叶子的哈夫曼树,若对树中的每个左分支赋予0,对每个右分支赋予1,则从根到每个叶子的路径上,各分支赋值分别构成一个二进制串,该二进制串即为哈夫曼编码

哈夫曼编码的性质:

  • 哈夫曼编码是前缀编码
  • 哈夫曼编码是最优前缀编码

哈夫曼编码的算法实现:

在构造哈夫曼树之后,求哈夫曼编码的主要思想就是:依次以叶子为出发点,向上回溯至根结点为止。回溯时走左分支则生成代码0,走右分支则生成代码1。

哈夫曼编码的存储表示:

由于每个哈夫曼编码都是变长编码,因此使用一个指针数组来存放每个字符编码串的首地址

typedef char **HuffmanCode//动态分配数组存储哈夫曼编码表

根据哈夫曼树求哈夫曼编码:

算法步骤

1.分配存储n个字符编码的编码表空间HC,长度为n+1;分配临时存储每个字符编码的动态数组空间cd,cd[n-1]置为'\0'

2.逐个求解n个字符的编码,循环n次,执行以下操作:

  • 设置变量start用于记录编码在cd中存放的位置,start初始时指向最后,即编码结束符位置n-1
  • 设置变量c用于记录从叶子节点向上回溯至根节点所经过的结点下标,c初始时为当前代编码字符的下标i,f用于记录i的双亲结点的下标;
  • 从叶子节点向上回溯至根节点,求得字符i的编码,当f没有到达根节点时,循环执行以下操作:
  1. 回溯一次start向前指一个位置,即--start;
  2. 若节点c是f的左孩子,则生成代码0,否则生成代码1,生成的代码0或1保存在cd[start]中;
  3. 继续向上回溯,改变c和f的值。
  • 根据数组cd的字符串长度为第i个字符编码分配空间HC[i],然后将数组cd中的编码复制到HC[i],然后将数组cd 中的编码复制到HC[i]中

3.释放临时空间cd

代码如下:

void CreateHuffmanCode(HuffmanTree HT,HuffmanCode &HC,int n)
{
	HC=new char*[n+1];//分配存储n个字符编码的编码表空间
	cd=new char[n];//分配临时存储每个字符编码的动态数组空间
	cd[n-1]='\0';//编码结束符
	for(i=1;i<=n;i++)//逐个字符求哈夫曼编码
	{
		start=n-1;//start开始时指向最后,即编码结束符位置
		c=i;
		f=HT[i].parent;//f指向c的双亲结点
		while(f!=0)//从叶子节点开始向上回溯,直到根节点
		{
			--start;//回溯一次start向前指一个位置
			if(HT[f].lchild==c)
			{
				cd[start]='0';
			}
			else
			{
				cd[start]='1';
			}
			c=f;
			f=HT[f].parent;
		}
		HC[i]=new char[n-start];
		strcopy(HC[i],&cd[start]);
	 } 
	 delete cd;
 } 

数据结构二:图

图的定义与基本术语:
图的定义:

图由两个集合V和E组成,记为G=(V,E)其中V是顶点的有穷非空集合 ,E是V中顶点偶对的有穷集合,这些偶对称称为边。

有向图:若边集E(G)为有向边的集合,则称该图为有向图

无向图:若边集E(G)为无向边的集合,则称该图为无向图

 图的基本术语:
用n表示图中顶点数目,用e表示边的数目

(1)子图:假设有两个图G=(v,E)和G'=(v',E'),如果v'包含于v且E'包含于E,则称G'为G的子图

 (2)无向完全图和有向完全图:对于无向图,若具有n(n-2)/2条边,则称为无向完全图。对于有向图,若具有n(n-1)条弧,则称为有向完全图

(3)稀疏图和稠密图:有很少条边或弧的图称为0稀疏图,反之称为稠密图

(4)权和网:在实际应用中,每条边可以标上具有某种含义的数值,该数值称为该边上的权值。这些权值可以表示从一个顶点到另一个顶点的距离或耗费。这种带权的图称为网

(5)邻接点:对于无向图G,如果图的边(v,v')\epsilonE,则称顶点v和v'互为邻接点,即v与v'邻接,边(v,v')依附于顶点v和v'或者说边与顶点相关联

(6)度,入度与出度:顶点v的度是指和v相关联的边的数目,入度是以顶点为头的弧的数目,出度是以顶点为尾的弧的数目

  (7) 路径和路径长度:在无向图G中,从顶点v到顶点v’的路径是一 个顶点序列,其中2.1,W,)EE, 1≤j<m。如果G是有向图,则路径也是有向的,顶点序列应满足<v,j-I,V.>∈E,1≤j≤m。路径长度是一条路径 上经过的边或弧的数目。

  (8) 回路或环:第一个顶点和最后一个顶点 相同的路径称 为回路或环。

  (9) 简单路径、简单回路或简单环:序列中顶点不重复出现的路径称为简单路径。除了第-一个顶点和最后-一个顶点之外,其余顶点不重复出现的回路,称为简单回路或简单环。

  (10) 连通、连通图和连通分量:在无向图G中,如果从顶点v到顶点v有路径,则称v和v’是连通的。如果对于图中任意两个顶点v1,y,∈V,v,和v,都是连通的,则称G是连通图。连通分量是指无向图中的极大连通子图
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值