收藏 分享(赏)

数据结构课件第7章 图.ppt

上传人:魏子好的一塌糊涂的文献 文档编号:2679038 上传时间:2020-08-18 格式:PPT 页数:134 大小:3.47MB
下载 相关 举报
数据结构课件第7章 图.ppt_第1页
第1页 / 共134页
数据结构课件第7章 图.ppt_第2页
第2页 / 共134页
亲,该文档总共134页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

1、 Monday, December 19, 2011 nysfxy 1 第8章 查找表 8.1 静态查找表 8.1.1 顺序查找 8.1.2 折半查找 8.1.3 分块查找 8.2 动态查找树表 8.2.1 二叉查找树 8.2.2 键树 8.3 哈希表及其查找 8.3.1 什么是哈希表? 8.3.2 构造哈希函数的几种方法 8.3.3 处理冲突的方法和建表示例 8.3.4 哈希表的查找及其性能分析 8.3.5 哈希表的的应用举例 Monday, December 19, 2011 nysfxy 2 何谓查找表 ? 查找表是由同一类型的数据元素(或记录)构成的集合。 由于“集合”中的数据元素之间

2、存在着松散的关系,因 此查找表是一种应用灵便的结构。 对查找表经常进行的操作: 1)查询某个“特定的”数据元素是否在查找表中; 2)检索某个“特定的”数据元素的各种属性; 3)在查找表中插入一个数据元素; 4)从查找表中删去某个数据元素。 Monday, December 19, 2011 nysfxy 3 查找表可分为两类: 静态查找表(static search table):仅作查询和检索操 作的查找表。 动态查找表(dynamic search table):有时在查询之 后,还需要将“查询”结果为“不在查找表中”的数据元素 插入到查找表中;或从查找表中删除其“查询”结果为“在 查找表

3、中”的数据元素。 关键字:是数据元素(或记录)中某个数据项的值,用 以标识(识别)一个数据元素(或记录)。 若此关键字 可以识别唯一的一个记录,则称之谓“主关键字”。若此 关键字能识别若干记录,则称之谓“次关键字”。 Monday, December 19, 2011 nysfxy 4 查找:根据给定的某个值,在查找表中确定一个其关 键字等于给定值的数据元素或(记录)。若查找表中 存在这样一个记录,则称“查找成功”。查找结果给出 整个记录的信息,或指示该记录在查找表中的位置; 否 则称“查找不成功” , 查找结果给出“空记录”或“空指 针”。 如何进行查找?查找的方法取决于查找表的结构。 由于

4、查找表中的数据元素之间不存在明显的组织 规律,因此不便于查找。 为了提高查找的效率,需要在查找表中的元素之 间人为地 附加某种确定的关系,换句话说,用另外一种结 构来表示查找表。 Monday, December 19, 2011 nysfxy 5 8.1 静态查找表 静态查找表的基本操作: n Create( /数据元素存储空间基址,建表时按 实际长度分配,0号单元留空 int length; /表的长度 SSTable; 数据元素类型的定义为: typedef struct KeyType key; /关键字域 /其它属性域 ElemType; Monday, December 19, 2

5、011 nysfxy 7 8.1.1 顺序查找 以顺序表或线性链表表示的静态查找表 查找过程: (1)从第一个元素的关键字起,依次向后和给定值相比 较直至相等或不存在。 (2)从最后一个元素的关键字起,依次向前和给定值相 比较直至相等或不存在。 Monday, December 19, 2011 nysfxy 8 ST.elem 回顾顺序表的查找过程: 假设给定值 e=64, 要求 ST.elemk = e, 问: k = ? kkkk 7 Monday, December 19, 2011 nysfxy 9 ST.elem i ST.elem i 60 i key=64 key=60 i 6

6、4 Monday, December 19, 2011 nysfxy 10 int Search_Seq(SSTable ST, KeyType kval) / 在顺序表ST中顺序查找其关键字等于kval的数 /据元素。若找到,则函数值为该元素在表中的 /位置,否则为0。 ST.elem0.key = kval; / “哨兵” for (i=ST.length; ST.elemi.key!=kval; -i ) ; / 从后往前找 return i; / 找不到时,i为0 / Search_Seq 算法8.1: Monday, December 19, 2011 nysfxy 11 顺序查找的

7、时间性能: 即查找算法的平均查找长度(Average Search Length) 为确定记录在查找表中的位置,需和给定值进行 比较的关键字个数的期望值: ASL=(n+1)/2 其中:n 为表长 Monday, December 19, 2011 nysfxy 12 8.1.2 折半查找 当以顺序有序表表示静态查找表时,查找过程可按 “折半”进行。 折半查找(又称二分查找):查找过程是,先确定待 查记录所在范围,然后拿给定值与范围的中间位置记录 的关键字比较,若相等,表示成功;否则缩小范围。重 复操作,直至找到该记录,或者当查找区间缩小到 0也 没有找到关键字等于给定值的记录为止。 Mond

8、ay, December 19, 2011 nysfxy 13 ST.elem ST.length 例如: key=64 的查找过程如下: lowhigh mid low mid high mid low 指示查找区间的下界 high 指示查找区间的上界 mid = (low+high)/2 Monday, December 19, 2011 nysfxy 14 int Search_Bin(SSTable ST, KeyType kval) low=1; high=ST.length; while (low=high) mid=(low+high)/2; if (kval=ST.elemmi

9、d.key) return mid; else if (kvalID.elemhigh.key) return 0; / 给定值kval大于查找表中所有关键字 while ( low lchild , key) ); /在左子树中继续查找 else return ( SearchBST( T-rchild , key) ); /在有子树中继续查找 /SearchBST Monday, December 19, 2011 nysfxy 29 查找算法8.4: bool Search_BST (BiTree T, KeyType kval, BiTree / p 指向树中某个结点,f指向其双亲结点

10、 while (p) if ( kval = p-data.key) return TRUE; / 查找成功 else if ( kval data.key) f = p ; p = p-lchild; /在左子树中继续查找 else f = p; p = p-rchild; /在右子树中继续查找 return FALSE; / 查找不成功 / SearchBST 假设 kval = 48 f p 30 20 10 40 3525 23 52 48 43 Tf p f p f p kval=24 f f p p f p f pf p f p return TRUE return FALSE M

11、onday, December 19, 2011 nysfxy 31 3二叉排序树的插入算法 n 根据动态查找表的定义,“插入”操作在查找不成 功时才进行; n 若二叉排序树为空树,则新插入的结点为新的根结 点;否则, 新插入的结点必是一个新的叶子结点,并 且是查找路径上访问的最后一个结点的左孩子或右孩 子。 n 举例:从空树出发,插入下列关键字,构造一棵二叉排 序树(40,88,55,96,18,09,20,13,19) Monday, December 19, 2011 nysfxy 32 插入算法8.5: bool Insert_BST(BiTree if (Search_BST ( T

12、, e.key, p, f ) return FALSE; / 树中已有关键字相同的结点,不再插入 else / 查找不成功,插入结点 s = new BiTNode; s-data = e; s-lchild = s-rchild = NULL; if ( !f ) T = s; / T为空树,插入的s 结点为新的根结点 else if ( e.key data.key) f-lchild = s; /插入 s 结点为左孩子 else f-rchild = s; / 插入 s 结点为右孩子 return TRUE; /else / Insert_BST Monday, December 19

13、, 2011 nysfxy 33 T=NULL kval=50, T 50 30, 30 40, 40 80, 80 20, 20 36, 36 90, 90 40, 38 38 Monday, December 19, 2011 nysfxy 34 4.二叉排序树的删除算法 和插入相反,删除在查找成功之后进行。对于二叉 排序树,删去树上一个结点相当于删去有序序列中的一 个元素,只要在删除某个结点之后,仍然保持二叉排序 树的特性即可。 可分三种情况讨论: 被删除的结点是叶子结点,直接删除; 被删除的结点只有左子树或者只有右子树,则将其孩子 直接挂到其双亲上; 被删除的结点既有左子树,也有右子树

14、,找左孩子中最 大的一个元素,代替被删除结点,最大元素最多只有一 个左子树,按处理删除最大元素。 Monday, December 19, 2011 nysfxy 35 50 3080 2090 85 40 35 8832 (1)被删除的结点是叶子结点 例如: 被删关键字 = 2088 其双亲结点中相应指针域的值改为“空” Monday, December 19, 2011 nysfxy 36 50 3080 2090 85 40 35 8832 (2)被删除的结点只有左子树或者只有右子树 其双亲结点的相应指针域的值改为“指向被删除结 点的左子树或右子树”。 被删关键字 = 4080 Mond

15、ay, December 19, 2011 nysfxy 37 50 3080 2090 85 40 35 8832 (3)被删除的结点既有左子树,也有右子树 40 40 以其前驱替代之,然 后再删除该前驱结点 被删结点前驱结点 被删关键字 = 50 Monday, December 19, 2011 nysfxy 38 二叉查找树删除算法8.6 void Delete_BST (BiTree if (Search_BST(T,kval,p,f) / 找到其关键字等于kval的数据元素 if (p-lchild s = p-lchild; while (s-rchild) q = s; s =

16、 s-rchild; p-data = s-data; / s指向左子树中关键字最大的结点 if (q != p ) q-rchild = s-lchild; else q-lchild = s-lchild; /s结点即为p结点的左子树根 delete s; / if Monday, December 19, 2011 nysfxy 39 else if (!p-rchild) / 右子树空则只需挂接它的左子树 q = p; p = p-lchild; /if else / 左子树空,只需挂接它的右子树 q = p; p = p-rchild; / 将指针p所指子树挂接到被删结点的双亲(指针

17、f所指的)结点上 if (!f) T = p; / 被删结点为根结点 else if (q = f-lchild) f-lchild = p; else f-rchild = p; / 完成子树的挂接 delete q; / 释放被删结点空间 /else /if /Delete_BST Monday, December 19, 2011 nysfxy 40 n 二叉排序树的查找分析 在二叉查找树上查找关键字等于给定值的过程,与给定值 比较的关键字的个数和结点所在的层次相等,最多不会超过二 叉查找树的深度。可以证明,二叉查找树的平均查找长度: P(n)2(n1)/n *logn+C 同样的n个关

18、键字,若先后插入的顺序不同, 构造出的二叉排 序树的形态不同。如关键字序列(1,2,3,4,5),若输入序 列为:1,2,3,4,5,则 ASL=3,而输入序列为:3,1,4,2,5,则 ASL=2.2。 2 1 5 4 3 5 4 3 1 2 Monday, December 19, 2011 nysfxy 41 最好的二叉排序树形态是n个关键字的折半查找对应的判定 树O(log2n)。 最坏的二叉排序树形态是链表形态O(n)。 二叉排序树的平均查找长度和折半查找是同一数量级log2n, 但不如折半查找好。 5.平衡二叉树(Balanced Binary Tree) (1)定义:或是空树,或

19、是具有如下性质的二叉树,它的左右 子树也都是平衡二叉树,且左子树和右子树的深度之差的绝对 值不大于1。 Monday, December 19, 2011 nysfxy 42 (2)平衡二叉树的深度:log2n (n为结点个数) (3)结点的平衡因子(Balance Factor):是左子树深度减 去右子树深度,它只可能是:-1、0、1。 例如: 5 48 2 平衡树 5 48 2 1 不是平衡树 Monday, December 19, 2011 nysfxy 43 小结: 查找表:静态查找表、动态查找表、关键字、查找 静态查找表 n 顺序查找:ASLs=(n+1)/2、ASLus=n+1

20、n 折半查找:判定树、ASLs=(n+1)/n*log2(n+1)-1log2(n+1)-1 n 分块查找:索引表、ASLs=ASL(b)+ASL(n/b) 动态查找表:二叉查找树、查找、插入、删除算法 P(n)=2(n+1)/n*log2n+C 平衡二叉树:|hL-hR|1 Monday, December 19, 2011 nysfxy 44 (4)如何构造平衡二叉树(平衡旋转技术) 在平衡的二叉排序树中插入一个结点,当出现不平衡 时,根据不平衡情况分四种调整方法 假设最低不平衡结点为A,根据新插入结点与A的 位置关系来命名调整方法: LL型:新插入结点在A的左孩子(L)的左子树(L)中;

21、 LR型:新插入结点在A的左孩子(L)的右子树(R)中; RL型:新插入结点在A的右孩子(R)的左子树(L)中; RR型:新插入结点在A的右孩子(R)的右子树(R)中。 AVL树:根据Adelson-Velskii和Landis提出的 File3.dat”进 行写操作了。 2BinaryWriter类的常用方法 (1)Seek方法 格式:Public Overridable Function Seek( offset As _ Integer,origin As SeekOrigin )As Long 其中参数origin为参照点,参数offset为相对于参照点的位 移量。 SeekOrigi

22、n为System.IO命名空间中的枚举类型,它的成 员及其含义如表8-3所示。 成 员 名 称说 明 Begin 流的开头 Current流的当前位置 End流的结尾 功能:以参数origin为参照点,以参数offset为相对于参 照点的位移量,设置流的当前位置。 (2)Write方法 使用Write方法可以把各种基本数据类型数据写到二进 制文件。 格式:Public Overridable Sub Write( value As ) 其中,可以为各种基本类型,包括Integer、 Single、Double、String和Boolean等类型。 功能:将指定value值写入流的当前位置,并使

23、流的当 前位置移动指定数据类型所占的字节数。 例如,语句: Dim a As Integer = 100 BW.Write(a) 把整数100写到与BinaryWriter类对象BW关联的文件 “D:File3.dat”的当前位置,并使流的当前位置移动4B。 例8-5 BinaryWriter类Write方法的测试。 Imports System.IO Public Class Form1 Private Sub Form1_Click(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles Me.Click Dim FS

24、As New FileStream(D:File3.dat, FileMode.Create, _ FileAccess.Write) Dim BW As New BinaryWriter(FS) Dim a As Integer =100, b As Single =3.14159, c As String=CHINA BW.Write(a) BW.Write(b) BW.Write(c) MsgBox(文件已建立!) BW.Close() FS.Close() End Sub End Class 二进制文件不能使用字处理 工具(例如,记事本、Word等) 打开! 8.5.2 BinaryR

25、eader类 BinaryReader类用于从二进制文件中读取数据。 1BinaryReader类的构造函数 格式1:Public Sub New( input As Stream ) 功能:把指定的输入流input,用UTF-8编码方式初始 化为BinaryReader类的新实例。 格式2:Public Sub New( input As Stream, encoding As Encoding ) 功能:把指定的输入流input,用指定的encoding编 码方式初始化为BinaryReader类新实例。 要想从二进制文件读取数据,必须先用FileStream类 对象打开该二进制文件,然后

26、创建BinaryReader类对象, 使之与文件流对象相关联。 而创建BinaryReader类对象,需要调用BinaryReader 类的构造函数。 语法格式: Dim As New BinaryReader(,) 例如,要打开文件“D:File3.dat”,准备进行读操 作,需使用下面两个语句: Dim FS As New FileStream(“D:File3.dat”, _ FileMode.Open, FileAccess.Read) Dim BR As New BinaryWriter(FS) 2BinaryReader类的常用方法 要从二进制文件中读取数据需使用Read方法。 若

27、要正确读出由BinaryWrite类的Write方法写入文 件的数据,读取文件时对应的参数顺序和类型必须一一 对应。 不同类型的数据用不同的Read方法读取。 常用的Read方法和功能如表8-4所示。 名 称说 明 Read从基础流中读取字符,并根据所使用的 Encoding 和从流中 读取的特定字符,提升流的当前位置 ReadBoolean从当前流中读取 Boolean 值,并使该流的当前位置提升1 B ReadChar从当前流中读取下一个字符,并根据所使用的 Encoding 和 从流中读取的特定字符,提升流的当前位置 ReadChars从当前流中读取指定的字符数,并以字符数组的形式返回

28、数据,然后根据所使用的 Encoding 和从流中读取的特定字 符,将当前位置前移 ReadDecimal从当前流中读取十进制数值,并将该流当前位置提升16 B ReadDouble从当前流中读取8 B浮点值,并使流的当前位置提升8 B ReadInt从当前流中读取n/8个字节带符号整数,并使流的当前位置 提升n/8个字节,其中n为16或32或64 ReadSingle从当前流中读取4 B浮点值,并使流的当前位置提升4 B ReadString从当前流中读取一个字符串,并使流的当前位置提升Len (字符串长度)个字节 例8-6 BinaryReader类Read方法的测试。 Imports S

29、ystem.IO Public Class Form1 Private Sub Form1_Click(ByVal sender As Object, ByVal e As _ System.EventArgs) Handles Me.Click Dim FS As New FileStream(D:File3.dat, FileMode.Open, _ FileAccess.Read) Dim BR As New BinaryReader(FS) Dim a As Integer, b As Single, c As String a = BR.ReadInt32() TextBox1.Te

30、xt = CStr(a) b = BR.ReadSingle() TextBox2.Text = CStr(b) c = BR.ReadString() TextBox3.Text = c BR.Close() FS.Close() End Sub End Class 例8-7 用随机函数产生30个两位整数并存放到二进制 文件“D:File4.dat”中。从“D:File4.dat”中读 出数据并在文本框TextBox1中显示,求这组数的平均 值和最大值,分别在文本框TextBox2和TextBox3中显 示。 Imports System.IO Public Class Form1 Priv

31、ate Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim FS As New FileStream(D:File4.dat, FileMode.Create, _ FileAccess.Write) Dim BW As New BinaryWriter(FS) Dim a, i As Integer 犰椀搀栀琀洀氀/Mg前台访问/d-2360408.html106.11.158.340勈缼犰最搀栀琀洀氀/Mg前台访问/d-134066

32、3.html42.120.161.240勈缼犰椀瀀栀琀洀氀鐕嵲/Mg前台访问/d-2416604.html42.120.161.790膔欀搀栀琀洀氀鐕/Mg前台访问/p-1368406.html106.11.152.790勈苀犰愀紀漀漀欀刀攀愀搀愀猀瀀砀椀搀/Mi前台访问/p-2481964.html123.183.224.740勈苀犰最搀栀琀洀氀夂退5Sqwap前台访问/p-2678549.html220.181.108.1200菬礀輀挀栀琀洀氀/Kg前台访问/p-139431.html122.234.41.1260勈蔘犰愀笀漀漀欀刀攀愀搀愀猀瀀砀椀搀毃/Mi前台访问/p-2263837.h

33、tml46.229.168.1460虄%瞩椀瀀栀琀洀氀怂5gwap前台访问/BookRead.aspx?id=2678549111.206.198.1160虄%杫最瀀栀琀洀氀鹒/Mg前台访问/d-2317468.html42.120.160.780蝰铰覣挀瀀栀琀洀氀瀀5Smwap前台访问/p-2678544.html116.179.32.400蝰夀鰀毃/_前台访问/BookRead.aspx?id=946166106.11.156.1000勈袜劰醞椀瀀栀琀洀氀鰀毃/Mi前台访问/d-2400026.html106.11.153.1200览最蔀眀愀瀀漀漀欀刀攀愀搀愀猀瀀砀椀搀嵲/Mg前台访问/d

34、-2267967.html42.156.138.280勈览劰醞椀搀栀琀洀氀鹒/Ki前台访问/p-186079.html123.183.224.1720諴匀焀眀愀瀀搀栀琀洀氀/Mg前台访问/d-2338282.html42.156.138.780勈諴椀搀栀琀洀氀毃/u前台访问/c-00001-1-34142-0-0-0-0-9-0-0.html59.58.249.1180諴最瀀栀琀洀氀/a前台访问/BookRead.aspx?id=248380042.156.136.1070谠匀漀眀愀瀀瀀栀琀洀氀嵲/Mg前台访问/p-1982545.html42.120.160.640勈赌椀搀栀琀洀氀/a前台访

35、问/BookRead.aspx?id=259115942.120.160.520蹸笀錀挀栀琀洀氀一砕/Mi前台访问/d-2492744.html106.11.157.1260蹸%欀瀀栀琀洀氀倀砀/Ke前台访问/p-494998.html106.11.153.360勈辤繡紀餀挀栀琀洀氀刀賲/Mg前台访问/d-2237636.html59.60.182.2430勈辤蔀鼀挀栀琀洀氀吀毃/Mg前台访问/p-2008006.html40.77.167.1160勈辤愀笀漀漀欀刀攀愀搀愀猀瀀砀椀搀嘀怀5AY充值审核-拒绝43256527.38.236.890勈辤最瀀栀琀洀氀堀斲/u前台访问/c-00011-7-39336-0-0-0-0-9-0-1.html218.91.1.20勈郐愀笀漀漀欀刀攀愀搀愀猀瀀砀椀搀娀夀/Me前台访问/d-2317467.html42.156.139.90

展开阅读全文
相关资源
相关搜索
资源标签

当前位置:首页 > 网络技术 > 热门技术

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


客服QQ:2549714901微博号:文库网官方知乎号:文库网

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

文库网官网©版权所有2025营业执照举报