收藏 分享(赏)

《数据结构A》第05章.ppt

上传人:jw66tk88 文档编号:8117853 上传时间:2019-06-09 格式:PPT 页数:119 大小:792.50KB
下载 相关 举报
《数据结构A》第05章.ppt_第1页
第1页 / 共119页
《数据结构A》第05章.ppt_第2页
第2页 / 共119页
《数据结构A》第05章.ppt_第3页
第3页 / 共119页
《数据结构A》第05章.ppt_第4页
第4页 / 共119页
《数据结构A》第05章.ppt_第5页
第5页 / 共119页
点击查看更多>>
资源描述

1、南京邮电大学计算机学院 陈慧南 2006年9月,数据结构,Data Structures in C+,南京邮电大学计算机学院 陈慧南 2006年9月,第5章 树,南京邮电大学计算机学院 陈慧南 2006年9月,5.1 树的基本概念 5.2 二叉树 5.3 二叉树的遍历 5.5 树和森林 5.6 堆和优先权队列 5.7 哈夫曼树和哈夫曼编码 5.8 并查集和等价关系,南京邮电大学计算机学院 陈慧南 2006年9月,5.1 树的基本概念,南京邮电大学计算机学院 陈慧南 2006年9月,树形结构是元素之间有着分层关系的结构,它类似于自然界中的树。这是一类很重要的非线性数据结构。一方面,计算机应用中,

2、常常出现嵌套的数据,树结构提供了对该类数据的自然表示。另一方面利用树结构,我们可以有效地解决一些算法问题。,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,5.1.1 树的定义,定义5.1 树是包括n个结点的有限非空集合D,R是D中元素的序偶的集合,R满足以下特性: (1)有且仅有一个结点rD,不存在任何结点vD,vr,使得R,称r为树的根 ; (2)除根r以外的所有结点uD,都有且仅有一个结点vD,vu,使得R。这样定义的树也称有根树,简称树。,南京邮电大学计算机学院 陈慧南 2006年9月,定义5.2 树是包括n个结点的有限非空集合T,其中,

3、一个特定的结点r称为根,其余结点 T-r划分成m(m0)个互不相交的子集T1,T2,Tm,其中,每个子集都是树,被称为树根r的子树。,南京邮电大学计算机学院 陈慧南 2006年9月,5.1.2 基本术语,树中元素常称为结点 。根和它的子树根(如果存在)之间形成一条边 。如果从某个结点沿着树中的边可到达另一个结点,则称这两个结点间存在一条路径 。,南京邮电大学计算机学院 陈慧南 2006年9月,若一个结点有子树,那么该结点称为子树根的双亲,子树的根是该结点的孩子。有相同双亲的结点互为兄弟。一个结点的所有子树上的任何结点都是该结点的后裔。从根结点到某个结点路径上的所有结点都是该结点的祖先 。,南京

4、邮电大学计算机学院 陈慧南 2006年9月,一个结点拥有的子树数称为该结点的度。度为零的结点称为叶子,其余结点称为分支结点。树中结点的最大的度称为树的度。 树是层次结构的,规定根结点的层次为1,其结点的层次等于其双亲结点的层次加1。树中结点的最大层次称为该树的高度。,南京邮电大学计算机学院 陈慧南 2006年9月,如果树中结点的各子树之间的次序是不重要的,可以交换位置,这样的树称为无序树。也就是我们通常所说的树。如果将树中结点的各棵子树看成是从左到右有次序的,则称该树为有序树。从左到右,可分别称这些子树为第一子树,第二子树等等。 森林是树的集合。果园或称有序森林是有序树的有序集合。,南京邮电大

5、学计算机学院 陈慧南 2006年9月,5.2 二叉树,南京邮电大学计算机学院 陈慧南 2006年9月,5.2.1 二叉树的定义,定义5.3 二叉树是结点的有限集合,该集合或者为空集,或者是由一个根和两棵互不相交的,称为该根的左子树和右子树的二叉树组成。,南京邮电大学计算机学院 陈慧南 2006年9月,二叉树的五种基本形态,二叉树与树的区别,二叉树可以为空二叉树二叉树结点的子树分为左、右子树,南京邮电大学计算机学院 陈慧南 2006年9月,5.2.2 二叉树的性质,性质5.1 二叉树的第i(i1)层上至多有2i-1 个结点。,证明:当i=1时,二叉树只有一个结点,结论成立。 设当i=k时结论成立

6、,则当i=k+1时,因为每个结点最多只有两个孩子,所以,第k+1层上至多有2*2k-1 =2k个结点,性质成立。,南京邮电大学计算机学院 陈慧南 2006年9月,性质5.2 高度为h的二叉树上至多有2h 1个结点。,证明:当h=0时,二叉树为空二叉树。当h0时,利用性质51,高度为h的二叉树中结点的总数最多为:,南京邮电大学计算机学院 陈慧南 2006年9月,性质5.3 包含n个元素的二叉树的高度至少为log2 (n+1),证明:由性质2,高度为h的二叉树最多有2h 1个结点,因而n2h 1, 则有hlog2(n+1)。因h是整数,所以h log2 (n+1)。,南京邮电大学计算机学院 陈慧南

7、 2006年9月,性质5.4 任意一棵二叉树中,若叶结点的个数为n0,度为2的结点的个数为n2,则必有n0=n2+1。,证明:设二叉树的结点总数为n,则 n=n0+n1+n2 孩子数为 n-1=n1+2n2,因此, n0=n2+1,南京邮电大学计算机学院 陈慧南 2006年9月,定义5.4 高度为h的二叉树恰好有2h 1个结点时称为满二叉树 。 定义5.5 一棵二叉树中,只有最下面两层结点的度可以小于2,并且最下一层的叶结点集中在靠左的若干位置上,这样的二叉树称为完全二叉树 。 定义5.6 扩充二叉树 也称2树,扩充二叉树中除叶子结点外,其余结点都必须有两个孩子。,南京邮电大学计算机学院 陈慧

8、南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,性质5.5 具有n个结点的完全二叉树的高度为log2 (n+1)。,证明:设完全二叉树的高度为h,则除最下层外,前h-1层形成满二叉树,总共有2h-1 1个结点;而最下层,即第h层的结点个数最多不超过2h-1个。因此有2h-11n2h1 移项得 2h-1n+12h 取对数 h-1log2(n+1) h log2(n+1) hlog2(n+1)+1 所以, h = log2 (n+1),南京邮电大学计算机学院 陈慧南 2006年9月,性质5.6 假定对一棵有n个结点的完全二叉树中的结点,按从上到下、从左到右的顺序,从0到n-1编

9、号,设树中某个结点的序号为i,0i0,则该结点的双亲的序号为(i-1)/2;,南京邮电大学计算机学院 陈慧南 2006年9月,(3)若2i+1n,则该结点的左孩子的序号为2i+1,否则该结点无左孩子;(4)若2i+2n,则该结点的右孩子的序号为2i+2,否则该结点无右孩子。,南京邮电大学计算机学院 陈慧南 2006年9月,5.2.3 二叉树ADT,ADT BTree 数据:二叉树是结点的有限集合,它或者为空集合,或 者由一个根结点和两棵互不相交的左、右子二叉树组成。 运算: Create(); 构造一棵空二叉树。Destroy():撤消一棵二叉树。IsEmpty():若二叉树为空,则返回tru

10、e,否则返回false。Clear():移去所有结点,成为空二叉树。,南京邮电大学计算机学院 陈慧南 2006年9月,Root(x): 若二叉树非空,则x有根的值,并返回true,否则返回false。MakeTree(x, left, right): 构造一棵二叉树:根的值为x,以left和right为左右子树。BreakTree(x, left, right):拆分二叉树为三部分:x为根的值,left和right分别为原树的左、右子树,南京邮电大学计算机学院 陈慧南 2006年9月,PreOrder(Visit):使用函数Visit访问结点, 先序遍历二叉树。InOrder(Visit):使

11、用函数Visit访问结点, 中序遍历二叉树。PostOrder(Visit):使用函数Visit访问结点, 后序遍历二叉树。 ,南京邮电大学计算机学院 陈慧南 2006年9月,5.2.4 二叉树的存储表示,完全二叉树的顺序表示,南京邮电大学计算机学院 陈慧南 2006年9月,二叉树的链接表示(二叉链表),共有n-1个指针域非空,恰有n+1个空指针域。,南京邮电大学计算机学院 陈慧南 2006年9月,5.2.5 二叉树类,程序5.1 二叉树结点类 template struct BTNode BTNode() lChild=rChild=NULL;BTNode(const T,南京邮电大学计算机

12、学院 陈慧南 2006年9月,BTNode(const T,南京邮电大学计算机学院 陈慧南 2006年9月,T element;BTNode* lChild, *rChild; ;,南京邮电大学计算机学院 陈慧南 2006年9月,程序5.2二叉树类 template class BinaryTree public:BinaryTree()root=NULL; BinaryTree()Clear();bool IsEmpty()const;void Clear();,南京邮电大学计算机学院 陈慧南 2006年9月,bool Root(T ,南京邮电大学计算机学院 陈慧南 2006年9月,prot

13、ected:BTNode* root; private:void Clear(BTNode* t);void PreOrder(void (*Visit)(T,南京邮电大学计算机学院 陈慧南 2006年9月,5.2.6 实现二叉树基本运算,程序5.3 部分二叉树运算 template bool BinaryTree:Root(T ,南京邮电大学计算机学院 陈慧南 2006年9月,template void BinaryTree:MakeTree(const T ,南京邮电大学计算机学院 陈慧南 2006年9月,template void BinaryTree:BreakTree(T ,南京邮电

14、大学计算机学院 陈慧南 2006年9月,void main(void) BinaryTreea,b,x,y,z; y.MakeTree(E,a,b); z.MakeTree(F,a,b); x.MakeTree(C,y,z); y.MakeTree(D,a,b); z.MakeTree(B,y,x); z.PreOrder(Visit);z.BreakTree(e,y,x);x.PreOrder(Visit); y.PreOrder(Visit); ,南京邮电大学计算机学院 陈慧南 2006年9月,5.3 二叉树遍历,南京邮电大学计算机学院 陈慧南 2006年9月,5.3.1 二叉树遍历算法,

15、遍历一个有限的结点集合,意味着对该集合中的每个结点访问且仅访问一次。,南京邮电大学计算机学院 陈慧南 2006年9月,先序遍历(VLR) 若二叉树为空,则空操作; 否则(a)访问根结点;(b)先序遍历左子树;(c)先序遍历右子树。,先序遍历结点次序:,B,D,C,E,F,A,南京邮电大学计算机学院 陈慧南 2006年9月,中序遍历(LVR) 若二叉树为空,则空操作; 否则(a)中序遍历左子树;(b)访问根结点;(c)中序遍历右子树,中序遍历结点次序:,D,A,E,C,F,B,南京邮电大学计算机学院 陈慧南 2006年9月,后序遍历(LRV) 若二叉树为空,则空操作; 否则(a)后序遍历左子树;

16、(b)后序遍历右子树;(c)访问根结点。,后序遍历结点次序:,B,E,F,C,A,D,南京邮电大学计算机学院 陈慧南 2006年9月,先序:,中序:,后序:,A,D,E,H,F,J,G,B,C,K,H,E,E,F,G,D,A,B,K,C,H,J,G,F,E,D,K,C,B,A,南京邮电大学计算机学院 陈慧南 2006年9月,层次遍历二叉树还可以按层次遍历。二叉树的层次遍历为:首先访问第一层上的结点,再访问第二层上的结点,依此类推,访问二叉树上全部结点。二叉树按层次遍历:A,D,B,G,C,H,F,K,J,G,南京邮电大学计算机学院 陈慧南 2006年9月,指向函数的指针变量 类型名 (* 指针

17、变量名)(参数表) 例如, void (*Visit )(T ,5.3.2 二叉树遍历的递归算法,南京邮电大学计算机学院 陈慧南 2006年9月,先序遍历 template void BinaryTree:PreOrder(void (*Visit)(T ,南京邮电大学计算机学院 陈慧南 2006年9月,(续) template void BinaryTree:PreOrder(void (*Visit)(T ,南京邮电大学计算机学院 陈慧南 2006年9月,5.3.3 二叉树遍历的应用实例,求二叉树的结点数 template int BinaryTree:Size() return Size

18、(root); ,南京邮电大学计算机学院 陈慧南 2006年9月,(续) template int BinaryTree:Size(BTNode * t) if (!t) return 0 ;else return Size(t-lChild)+Size(t-rChild)+1; ,南京邮电大学计算机学院 陈慧南 2006年9月,二叉树复制 template BTNode*BinaryTree:Copy(BTNode* t) if (!t) return NULL;BTNode* q=new BTNode(t-element);q-lChild=Copy(t-lChild);q-rChild=

19、Copy(t-rChild);return q; ,南京邮电大学计算机学院 陈慧南 2006年9月,5.5 树和森林,南京邮电大学计算机学院 陈慧南 2006年9月,5.5.1 森林与二叉树的转换,森林转换成二叉树:将森林中各树的根用线连起来,在树中,凡是兄弟用线连起来;去掉从双亲到除了第一个孩子以外的孩子的连线,只保留双亲到第一个孩子的连线;最后,使之稍微倾斜成习惯的二叉树形。其实,这里讨论的森林是指有序森林,也可将一般的森林视为有序森林来对待。,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,森林转换成二叉树 令F=(T1,T2,Tn)是森林

20、,则F所对应的二叉树B(F)为: (1) 若F为空,则B为空二叉树。 (2)若F非空,则B的根是F中第一棵子树T1的根R1,B的左子树是R1的子树森林(T11,T12,T1m)所对应的二叉树,B的右子树是森林(T2,Tn)所对应的二叉树。,南京邮电大学计算机学院 陈慧南 2006年9月,二叉树转换成森林令B=(R,LB,RB)是二叉树,R是根,LB是左子树,RB是右子树,则B所对应的森林F=(T1,T2,Tn)为:(1) 若B为空,则F为空森林。(2)若B非空,则F的第一棵树T1的根是二叉树的根R,T1的根的子树森林是B的左子树LB所对应的森林,F中的其余树(T2,Tn)是B的右子树RB所对应

21、的森林。,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,5.5.2 树和森林的存储表示,多重链表表示法设度为m的树中有n个结点,总共有n*m个指针域,其中,只有n-1个非空指针域,其余n*m-(n-1)=n(m-1)+1个指针域均为空。,南京邮电大学计算机学院 陈慧南 2006年9月,孩子兄弟表示法,南京邮电大学计算机学院 陈慧南 2006年9月,双亲表示法,南京邮电大学计算机学院 陈慧南 2006年9月,三重链表表示法,南京邮电大学计算机学院 陈慧南 2006年9月,带右链的先序表示法,南京邮电大学计算机学院 陈慧南 2006年9月,5.5.

22、3 树和森林的遍历,按深度方向的遍历由森林和二叉树的转换方法可知,森林中第一棵树的根即二叉树的根,第一棵树的子树组成的森林对应于二叉树的左子树,而除第一棵树外其余树组成的森林是二叉树的右子树,所以,对森林的先序遍历、中序遍历和后序遍历的结果应与对应二叉树的先序、中序和后序遍历的结果完全相同。,南京邮电大学计算机学院 陈慧南 2006年9月,先序遍历若森林为空,则遍历结束,否则 (a) 访问第一棵树的根;(b) 按先序遍历第一棵树的根结点的子树组成的森林;(c) 按先序遍历除第一棵树外其余树组成的森林。,A,B,C,K,D,E,H,F,J,G,南京邮电大学计算机学院 陈慧南 2006年9月,中序

23、遍历若森林为空,则遍历结束,否则 (a) 按中序遍历第一棵树的根结点的子树组成的森林;(b) 访问第一棵树的根;(c) 按中序遍历除第一棵树外其余树组成的森林。,B,K,C,A,H,E,J,F,G,D,南京邮电大学计算机学院 陈慧南 2006年9月,后序遍历若森林为空,则遍历结束,否则 (a) 按后序遍历第一棵树的根结点的子树组成的森林; (b) 按后序遍历除第一棵树外其余树组成的森林 ; (c) 访问第一棵树的根。,K,C,B,H,J,G,F,E,D,A,南京邮电大学计算机学院 陈慧南 2006年9月,按宽度方向的遍历 对森林的层次遍历与对应二叉树的层次遍历之间没有逻辑的对应关系,南京邮电大

24、学计算机学院 陈慧南 2006年9月,5.6 堆和优先权队列,南京邮电大学计算机学院 陈慧南 2006年9月,5.6.1 堆,一个大小为n的堆是一棵包含n个结点的完全二叉树,该树中每个结点的关键字值大于等于其双亲结点的关键字值。完全二叉树的根称为堆顶,它的关键字值是整棵树上最小的。这样定义的堆称为最小堆 。还有最大堆 。,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,堆是n个元素的序列(k0,k1,kn-1),当且仅当满足kik2i+1 且ki k2i+2,(i=0,1,(n-2)/2)时称为堆(最小堆)。 堆顶元素是序列的第一个元素。,南京邮

25、电大学计算机学院 陈慧南 2006年9月,向下调整 void AdjustDown (T heap, int r,int j) 设 (heapr+1,heapj) 这j-r个位置上的元素已满足特性:heapiheap2i+1 且heapi heap2i+2 (i=r+1,2,(j-1)/2)的条件,运行此函数将使得增加一个元素heapr,(heapr, heapr+1,heapj) 这j-r+1个元素也满足堆的特性。,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,template void AdjustDown (T heap, int r,

26、int j) /下标从r+1到j已满足堆的条件int child=2*r+1; /左孩子T temp=heapr; while (childheapchild+1) child+;if (temp=heapchild) break;heap(child-1)/2=heapchild;child=2*child+1;heap(child-1)/2=temp; ,南京邮电大学计算机学院 陈慧南 2006年9月,template void CreateHeap(T heap,int n) for (int i=(n-2)/2;i-1;i-) AdjustDown(heap,i,n-1); n/2-1

27、=3,下标范围:3,n-1 建堆的时间为O(nlog2n)。 更深入分析可知, 建堆时间复杂度为O(n)。,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,5.6.2 优先权队列ADT,ADT PrioQueue 数据:n0个元素的最小堆。 运算:Create():建立一个空队列。Destroy():撤消一个队列。IsEmpty():若队列空,则返回true;否则返回false。IsFull():若队列满,则返回true;否则返回false。,南京邮电大学计算机学院 陈慧南 2006年9月,Append(x):元素值为x的新元素入队列。Serve

28、(x): 在x中返回具有最高优先权的元素值,并从优先权队列中删除该元素。 ,南京邮电大学计算机学院 陈慧南 2006年9月,5.6.3 优先权队列类,template class PrioQueue public:PrioQueue(int mSize=20);PrioQueue()delete q;bool IsEmpty() constreturn n=0;bool IsFull() constreturn n=maxSize;void Append(const T ,南京邮电大学计算机学院 陈慧南 2006年9月,private:void AdjustDown (int r, int j

29、);void AdjustUp (int j);T*q;int n,maxSize; ;,南京邮电大学计算机学院 陈慧南 2006年9月,template PrioQueue:PrioQueue(int mSize) maxSize=mSize;n=0;q=new TmaxSize; ,南京邮电大学计算机学院 陈慧南 2006年9月,5.6.4 实现优先权队列,void AdjustUp (int j) 设(q0,qj-1)这j位置上的元素已满足特性:qiq2i+1 且qiq2i+2 (i=0,1,(j-2)/2),运行此函数将使得增加一个元素qj,(q0,q1,qj) 这j+1个元素也满足堆

30、的特性。,南京邮电大学计算机学院 陈慧南 2006年9月,template void PrioQueue:AdjustUp (int j) int i=j;T temp=qi;while (i0 ,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,template void PrioQueue:Append(const T ,南京邮电大学计算机学院 陈慧南 2006年9月,template void PrioQueue:Serve(T ,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,5.7 哈夫曼树

31、和哈夫曼编码,南京邮电大学计算机学院 陈慧南 2006年9月,5.7.1 树的路径长度,定义5.7 从根到树中任意结点的路径长度是指从根结点到该结点的路径上所包括的边的数目。树的内路径长度定义为除叶子结点外,从根到树中其它所有结点的路径长度之和。树的外路径长度是指从根到树中所有叶子结点的路径长度之和。,南京邮电大学计算机学院 陈慧南 2006年9月,定理5.1 设I和E分别是一棵扩充二叉树的内路径长度和外路径长度,n是树中非叶结点的数目,则 EI2n。,南京邮电大学计算机学院 陈慧南 2006年9月,证明:对非叶结点个数n 作归纳法证明。 初始情况,令n=1,I0,E=2,有E0+22。 归纳

32、假设, 非叶结点数为 n-1 时该等式成立。归纳步骤, 新二叉树的内路径长度为 I-k,外路径长度为 E-2(k+1)+k。根据归纳假设,我们有E-k-2=(I-k)+2(n-1) 因而有, EI2n,南京邮电大学计算机学院 陈慧南 2006年9月,定义5.8 树的加权路径长度为树中所有叶子结点的加权路径长度之和,记作其中,m是叶子结点的个数,wk是第k个叶子结点的权,lk是从根到该叶子结点的路径长度。,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,5.7.2 哈夫曼树和哈夫曼算法,哈夫曼算法哈夫曼给出了构造具有最小加权路径长度的扩充二叉树的算

33、法,称为哈夫曼算法。用哈夫曼算法构造的扩充二叉树称为哈夫曼编码树或哈夫曼树。,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,哈夫曼算法 (1)用给定的一组权值w1,w2 ,wn,生成一个有n棵树组成的森林F=T1,T2,Tn,其中,每棵二叉树Ti只有一个结点,即权值为wi的根结点(也是叶子)。 (2)从F中选择两棵根结点权值最小的树,作为新树根的左、右子树,新树根的权值是左、右子树根结点的权值之和。 (3)从F中删除这两棵树,另将新二叉树加入F中。 (4)重复(2)和(3),直到F中只包含一棵树为止。,南京邮电大学计算机学院 陈慧南 2006年

34、9月,5.7.3 哈夫曼树类,template class HfmTree:public BinaryTree public:operator T()const return weight;T getW()return weight;void putW(const T,南京邮电大学计算机学院 陈慧南 2006年9月,5.7.4 构造哈夫曼树,HfmTree CreateHfmTree (T w,int n)设数组w中保存n个元素类型为T的权值,函数返回一棵构造成功的哈夫曼树。,南京邮电大学计算机学院 陈慧南 2006年9月,函数CreateHfmTree的步骤: 首先构造n棵哈夫曼树对象,每棵

35、树只有一个权值为wi的根结点,且该对象的weight为wi,将它们逐一加入优先权队列。从优先权队列中取出两棵根结点值最小和次最小的哈夫曼树x和y。以它们根的权值之和为根的权值,x和y为左、右子树构造一棵新哈夫曼树,并将新树对象进优先权队列。重复执行n-1次,此时,队列中只剩下合并完成的哈夫曼树。从队列中取出构造完毕的哈夫曼树,函数返回该哈夫曼树。,南京邮电大学计算机学院 陈慧南 2006年9月,template HfmTree CreateHfmTree (T w,int n) PrioQueue pq(n);/ 空优先权队列HfmTree x,y,z,zero; / 空哈夫曼树for (in

36、t i=0;in;i+) /构造n棵一个结点哈树z.MakeTree(wi,x,y); z.putW(wi); pq.Append(z); z.SetNull(); ,南京邮电大学计算机学院 陈慧南 2006年9月,for (i=1;in;i+)pq.Serve(x);pq.Serve(y); z.MakeTree(x.getW()+y.getW(),x,y); z.putW(x.getW()+y.getW();pq.Append(z); z.SetNull(); pq.Serve(z); return z; ,南京邮电大学计算机学院 陈慧南 2006年9月,5.6.5 哈夫曼编码,例如,有字

37、符集S=A,B,C,D,权值W=4,2,1,1, 设有电文ABACABDA,定长编码如:A:00,B:01,C:10,D:11编码后的码文长16位。,南京邮电大学计算机学院 陈慧南 2006年9月,例如,有字符集S=A,B,C,D,权值W=4,2,1,1,用哈夫曼树设计的哈夫曼编码如图725所示。设有电文ABACABDA满足权值W假定的频率特性,则对其经哈夫曼编码后的码文为01001100101110,共14位二进制码位。如果采用定长编码如:A:00,B:01,C:10,D:11,则其编码后的码文长16位。,南京邮电大学计算机学院 陈慧南 2006年9月,01001100101110 A B

38、A C A B D A,南京邮电大学计算机学院 陈慧南 2006年9月,南京邮电大学计算机学院 陈慧南 2006年9月,5.8 并查集和等价关系,南京邮电大学计算机学院 陈慧南 2006年9月,5.8.1 并查集ADT,并查集 是由一组互不相交的集合组成的一个集合结构,并在此集合上定义了运算Union和Find。这就是说,并查集中的元素本身是集合,它们是某个集合的子集,并查集是由这些集合组成的集合结构。,南京邮电大学计算机学院 陈慧南 2006年9月,并查集 设有集合V=0,1,n1,V1,V2,Vm是V的子集,V1V2,Vm=V,且Vi Vj=,当i j,i,j=1,m,集合s V1,V2,

39、Vm是V的一个划分,即并查集UFset。 例如, V=0,1,2,3,4,5,6,s=V1,V2,V3,其中,V1 =0,V2 =1,2,3,4,V3 =5,6,集合s 是一个并查集。,南京邮电大学计算机学院 陈慧南 2006年9月,ADT UFset数据:设V=0,1,n1,一个并查集为包含m(m0)个元素的集合V1,V2,Vm,其中V1,V2,Vm是V的子集,V1V2,Vm=V且Vi Vj=,当i j,i,j=1,m。 运算:Create():构造每个子集合只包含一个元素的并查集.Find(i):返回包含元素i的子集合标识Union(x,y):合并子集x和y。 ,南京邮电大学计算机学院 陈

40、慧南 2006年9月,5.8.2 并查集的存储表示,南京邮电大学计算机学院 陈慧南 2006年9月,5.8.3 并查集类,class UFSet public:UFSet(int mSize); UFSet()deleteparent; int Find(int i)const;void Union(int x, int y); private:int *parent;int size; ;,南京邮电大学计算机学院 陈慧南 2006年9月,UFSet:UFSet(int mSize) size=mSize;parent=new int size;for (int i=0;isize; i+)

41、parenti=-1; ,南京邮电大学计算机学院 陈慧南 2006年9月,5.8.4 函数Union和Find,南京邮电大学计算机学院 陈慧南 2006年9月,int UFSet:Find(int i)const for (;parenti=0;i=parenti) ;return i; void UFSet:Union(int x,int y) parentx=y; ,南京邮电大学计算机学院 陈慧南 2006年9月,5.8.5 改进的函数Union和Find,int UFSet:Find2(int i) int r,t,l;for (r=i;parent r=0; r=parentr);if

42、 (i!=r) for (t=i;parent t!=r; t=l) l=parentt; parentt=r;return r; ,南京邮电大学计算机学院 陈慧南 2006年9月,void UFSet:Union2( int x,int y) int temp=parentx+parenty;if (parentxparenty) /y的结点多,x链至yparentx=y; parenty=temp;else parenty=x;parentx=temp; 对一个有n个元素的并查集,可以证明当采用改进的Union算法后,每棵树的高度将不超过log2n+1。,南京邮电大学计算机学院 陈慧南 2006年9月,5.8.6 按等价关系分组,设有元素集合S=0,1,2,3,4,5,6,它们用序号惟一标识。S上有等价对R=01,23,30,45,65。该等价关系将集合S分成两个等价类:0,1,2,3和4,5,6。,南京邮电大学计算机学院 陈慧南 2006年9月,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报