第九章、查找

第九章、查找

一、查找表:

  相同类型的数据组成的集合。查找分为静态查找和动态查找。

  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
",res);
33 } 
View Code

    (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出后所得榆树做哈希地址。

        

原文地址:https://www.cnblogs.com/yangsongwei/p/8966649.html