第九章、查找
第九章、查找
一、查找表:
相同类型的数据组成的集合。查找分为静态查找和动态查找。
1、静态查找:
在查找时,只对数据元素进行查询或检索,称为静态查找。
2、动态查找:
在实施查找的同时,插入查找表中不存在的记录,或从查找表中删除以存在的某个记录,查找表称为动态查找。
二、查找表的数据结构:
(1)顺序表和链表的查找:
将给定的k值与查找表中记录的关键字逐个进行比较,找到要查找的记录。
(2)散列表的查找:
根据给定的k值,直接访问查找表,从而找到要查找的记录。
(3)索引查找表的查找:
首先根据索引确定待查找记录所在的块,然后再从块中找到要查找的记录。
三、查找方法评价指标:
平均比较次数:
四、静态查找:
1、顺序查找:
(1)从表的一端开始逐个将记录的关键字和给定的k值进行比较,若某个记录的关键字和给定的k值相等,查找成功;否则,若扫描完整个表,仍然没有找到相应的记录,则查找失败。
(2) 算法分析:
查找成功的平均查找长度是:(n+1)/2
查找失败的比较次数是(n+1)
2、折半查找:
(1)又称为二分查找,是一种效率较高的查找方法。
1 #include<stdio.h> 2 #include<algorithm> 3 using namespace std; 4 int a[100]; 5 int res=-1; 6 bool cmp(int i,int j){ 7 if(i<j) return true; 8 else{ 9 return false; 10 } 11 } 12 int search(int key,int low,int hight){ 13 while(low<=hight){ 14 int mid=(low+hight)/2; 15 if(a[mid]==key){ 16 res=mid+1; 17 break; 18 }else if(a[mid]>key){ 19 hight=mid-1; 20 }else{ 21 low=mid+1; 22 } 23 } 24 } 25 int main(){ 26 int i; 27 int key; 28 scanf("%d",&key); 29 while(scanf("%d",&a[i++])==1); 30 sort(a,a+i-1,cmp); 31 search(key,0,i-1); 32 printf("%d\n",res); 33 }
(2)算法分析:
算法的判定形式为一颗二叉树,即为lg(n+1)-1;
3、分块查找:
将查找表分为几块,块间有序,即第i+1块内的所有记录关键字均大于第i块记录关键字;块内无序。
在查找表的基础上附加一个索引表,索引表是按关键字有序的.
(1)查找思想:
先去诶定待查记录所在的块,再在块内查找。
五、动态查找:
若对查找表进行插入、删除或排序操作,就必须移动大量的元素,当记录数很多时,这种移动代价很大,所以可以利用树的形式组织查找表,可以对查找表进行动态高效的查找。
1、二叉排序树(bst):
2、平衡二叉排序树(AVL):
是满足以下性质的二叉树:
(1)左子树和右子树的深度之差的绝对值不大于1;
(2)左子树和右子树也是平衡二叉树。
六、索引查找:
是组织大型数据库的重要技术,索引的结构的基本组成是索引表和数据表两部分。
数据表:存储实际的数据记录。
索引表:存储记录的关键字和记录存储地址之间的对照表,每个元素称为一个索引项。
1、顺序索引表:
将索引项按顺序结构组织的线性索引表,而表中的索引项一般是按关键字排序的。
(1)优点:
可以用折半查找的方法快速的找到关键字,进而找到数据记录的物理地址。
提供了对变长数据记录的便捷访问。
插入或删除数据记录的便捷访问。
插入或删除数据记录时不需要移动记录,但需要对索引进行维护。
(2)缺点:
索引表中索引项的数目与数据表中记录数相同,当索引表很大是,检索记录需要多次访问外存。
对索引表的维护代价较高,设计到大量的索引项的移动,不适合于插入和删除操作。
2、树形索引表:
(1)多路平衡查找树(B_树):
主要用于文件系统中,在B_树中,每个节点的大小为一个磁盘页,节点中所包含的关键字及其孩子的数目取决于页的大小。一颗度为m的B_树称为m阶B_树。
(2)B+树:
B+树的数据都存储在叶子节点中,分支节点均为索引。所以通常B+树用于数据库索引,而B树常用于文件索引。
(3)B-树和B+树的区别:
七、哈希:
1、哈希函数:
在记录的关键字与记录的存储地址之间建立的一种对应关系。
2、哈希函数的构造:
(1)直接定址法:
取关键字或关键字的某个线性函数作哈希地址。
(2)数字分析法:
对关键字进行分析,取关键字的若干位或组合作为哈希地址。
(3)平方取中法:
将关键字平方后取中间几位作为哈希地址。
(4)折叠法:
将关键字分割成尾数相同的几部分,然后取这几部分的叠加和作为哈希地址。
(5)除留余数法:
取关键字被某个不大于哈希表表长m的数p出后所得榆树做哈希地址。