第11章 查找.ppt
《第11章 查找.ppt》由会员分享,可在线阅读,更多相关《第11章 查找.ppt(70页珍藏版)》请在麦多课文档分享上搜索。
1、第11章 查找,查找的基本概念 静态查找表 动态查找表 哈希表,主要知识点,11.1 查找的基本概念,查找:查询某个关键字是否在(数据元素集合)表中的过程。也 称作检索。 主关键字:能够惟一区分各个不同数据元素的关键字 次关键字:通常不能惟一区分各个不同数据元素的关键字 查找成功:在数据元素集合中找到了要查找的数据元素 查找不成功:在数据元素集合中没有找到要查找的数据元素,静态查找:只查找,不改变数据元素集合内的数据元素 动态查找:既查找,又改变(增减)集合内的数据元素 静态查找表:静态查找时构造的存储结构 动态查找表:动态查找时构造的存储结构 平均查找长度:查找过程所需进行的关键字比较次数的
2、平 均值,是衡量查找算法效率的最主要标准,其数学定 义为:,其中,Pi是要查找数据元素出现的概率,Ci是查找相应数据元素的比较次数。,定义要查找数据元素的结构体为: typedef struct KeyType key; DataType;,11.2 静态查找表,静态查找表主要有三种结构:顺序表有序顺序表索引顺序表,1.顺序表,在顺序表上查找的基本思想是:从顺序表的一端开始,用给定数据元素的关键字逐个和顺序表中各数据元素的关键字比较,若在顺序表中查找到要查找的数据元素,则查找成功,函数返回该数据元素在顺序表中的位置;否则查找失败,函数返回-1。,查找函数设计如下: int SeqSearch(
3、DataType a, int n, KeyType key) int i = 0;while(i n ,查找成功时的平均查找长度ASL为:,2.有序顺序表,有序顺序表上的查找算法主要有顺序查找和折半查找两种方法。,一、顺序查找有序顺序表上的顺序查找算法和顺序表上的查找算法方法类同,二、二分查找(又称折半查找),算法的基本思想:先给数据排序(例如按升序排好),形成有序表,然后再将key与正中元素值相比,若key小,则缩小至前半部内查找;再取其中值比较,每次缩小1/2的范围,直到查找成功或失败为止。反之,如果key大,则缩小至后半部内查找。,二分查找算法如下: int BiSearch(Data
4、Type a, int n, KeyType key) int low = 0, high = n - 1; /确定初始查找区间上下界int mid;while(low = high)mid = (low + high)/2;/确定查找区间中心下标if(amid.key = key) return mid; /查找成功else if(amid.key key) low = mid + 1;else high = mid - 1;return -1; /查找失败 ,算法分析,平均查找长度ASL为:,3.索引顺序表,当顺序表中的数据元素个数非常大时,采用在顺序表上建立索引表的办法提高查找速度。把要
5、在其上建立索引表的顺序表称作主表。主表中存放着数据元素的全部信息,索引表中只存放主表中要查找数据元素的主关键字和索引信息。,索引表中的数据元素由两个域构成,key域为被索引的若干个数据元素中关键字的最大值,link域为被索引的若干个数据元素中第一个数据元素的位置编号。,索引表结构图,完全索引表:和主表项完全相同,但只包含索引关键字和该数 据元素在主表中位置信息的索引表 二级索引表:当主表中的数据元素个数非常庞大时,按照建立 索引表的同样方法对索引表再建立的索引表。二级以上 的索引结构称作多级索引结构 等长索引表:索引表中的每个索引项对应主表中的数据元素个 数相等;反之称为不等长索引表。不等长索
6、引表中的索 引长度可随着动态插入和动态删除过程改变,因此不仅 适用于静态查找问题,而且也适用于动态查找问题。,相关术语,假设索引表的长度为m,主表中每个子表的长度为s,并假设在索引表上和在主表上均采用顺序查找算法,则索引顺序表上查找算法的平均查找长度为:,算法分析,11.3 动态查找表,动态查找表主要有二叉树结构和树结构两种类型。二叉树结构有二叉排序树、平衡二叉树等。树结构有B-树、B+树等。,11.3.1 二叉排序树和平衡二叉树,一、基本概念,二叉排序树或是一棵空树;或者是具有如下性质的非空二叉树:(1)左子树的所有结点均小于根的值;(2)右子树的所有结点均大于根的值;(3)它的左右子树也分
7、别为二叉排序树。,二叉排序树中结点的结构体定义如下: typedef struct node DataType data;struct node *leftChild;struct node *rightChild; BiTreeNode;,下图所示就是一棵二叉排序树,二、二叉排序树的查找算法,int Search(BiTreeNode *root, DataType item) BiTreeNode *p;if(root != NULL)p = root;while(p != NULL)if(p-data.key = item.key) return 1;if(item.key p-data
8、.key) p = p-rightChild;else p = p-leftChild;return 0; ,三、插入算法,插入操作要求首先查找数据元素是否在二叉排序树中存在,若存在则返回;若不存在,插入查找失败时结点的左指针或右指针上。所插新结点一定在叶结点上。插入算法设计如下:,int Insert(BiTreeNode *root, DataType item) BiTreeNode *current, *parent = NULL, *p;current = *root;while(current != NULL) if(current-data.key = item.key) ret
9、urn 0;parent = current;if(current-data.key rightChild;else current = current-leftChild;/*生成新结点*/p = (BiTreeNode *)malloc(sizeof(BiTreeNode);p-data = item; p-leftChild = NULL; p-rightChild = NULL;if(parent = NULL) *root = p;else if(item.key data.key) parent-leftChild = p; else parent-rightChild = p;
10、return 1;,下图是调用上述插入函数依次插入数据元素 4,5,7,2,1,9,8,11,3的过程。,五、删除算法,删除操作要求首先查找数据元素是否在二叉排序树中存在,若不存在则结束;存在的情况及相应的删除方法有如下四种: (1)要删除结点无孩子结点,直接删除该结点。 (2)要删除结点只有左孩子结点,删除该结点且使被删除结点的双亲结点指向被删除结点的左孩子结点。 (3)要删除结点只有右孩子结点,删除该结点且使被删除结点的双亲结点指向被删除结点的右孩子结点。 (4)要删除结点有左右孩子结点,分如下三步完成:首先寻找数据元素的关键字值大于要删除结点数据元素关键字的最小值,即寻找要删除结点右子树
11、的最左结点;然后把右子树的最左结点的数据元素值拷贝到要删除的结点上;最后删除右子树的最左结点。,删除过程分别如图所示,例11-2 设计一个测试二叉排序树的主函数。 #include #include #include typedef int KeyType; typedef struct KeyType key; DataType; typedef struct node DataType data;struct node *leftChild;struct node *rightChild; BiTreeNode; #include “BiSortTree.h”,void InTravers
12、e(BiTreeNode *root) /*中序遍历显示二叉排序树结点信息函数*/ if(root = NULL) return;if(root-leftChild != NULL)InTraverse(root-leftChild);printf(“%d “, root-data.key);if(root-rightChild != NULL)InTraverse(root-rightChild); ,void main(void) DataType test = 4,5,7,2,1,9,8,11,3, x = 9;int n = 9, i, s;BiTreeNode *root = NUL
13、L;for(i = 0; i n; i+) Insert(,程序运行建立的二叉排序树如图11-5(i)所示。程序运行结果如下:1 2 3 4 5 7 8 9 11数据元素9存在!,六、二叉排序树的性能分析,一棵二叉排序树的平均查找长度为:,其中:C(i)为查找第i个数据元素时的关键字比较次数,当二叉排序树是一棵完全二叉树时,二叉排序树的平均查找长度为 :,当二叉排序树是一棵单分支退化树时,则平均查找长度就和有序顺序表的平均查找长度相同,即为 :,(a)满二叉排序树时,k = log2(7+1)=3,所以查找成功的平均查找长度为:,(b)左分支退化二叉排序树时,k = n=7,所以查找成功的平均
14、查找长度为:,在最坏情况下,二叉排序树的平均查找长度为O(n)。在一般情况下,二叉排序树的平均查找长度为O(log2n)。,为了防止二叉排序树的最坏情况出现,可以把二叉排序树改造成平衡二叉树。平衡二叉树或者是一棵空树,或者是具有这样性质的二叉排序树:它的左子树和右子树都是二叉排序树,并且左子树和右子树的深度之差的绝对值不超过1。基本方法:就是在构造二叉排序树的基础上,每当如果插入了一个新结点后,使二叉树中某个结点的左子树和右子树的深度之差的绝对值超过1,则调整相应的二叉树,使二叉树中该结点的左子树和右子树的深度之差的绝对值不超过1。特点:平衡二叉树一定不会出现单分支退化二叉排序树那样的情况,因
15、此,平衡二叉树的平均查找长度为O(lbn)。但相对二叉排序树来说,构造平衡二叉树需要花费较多的时间,而且删除平衡二叉树中某个结点时,也要考虑删除某个结点后,平衡二叉树中某个结点的左子树和右子树的深度之差的绝对值不能超过1。,七、平衡二叉树,1 B_树,B_树是一种平衡多叉排序树。平衡是指所有叶结点都在同一层上,从而可避免出现像二叉排序树那样的分支退化现象。因此B_树的动态查找效率更高。,B_树中所有结点的孩子结点的最大值称为B_树的阶,一棵m阶的B_树或者是一棵空树,或者是满足下列要求的m叉树:,11.3.2 B_树和B+树,(1)树中每个结点至多有m个孩子结点。 (2)除根结点外,其他结点至
- 1.请仔细阅读文档,确保文档完整性,对于不预览、不比对内容而直接下载带来的问题本站不予受理。
- 2.下载的文档,不会出现我们的网址水印。
- 3、该文档所得收入(下载+内容+预览)归上传者、原创作者;如果您是本文档原作者,请点此认领!既往收益都归您。
下载文档到电脑,查找使用更方便
2000 积分 0人已下载
下载 | 加入VIP,交流精品资源 |
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 11 查找 PPT
