zoukankan      html  css  js  c++  java
  • 第九章、查找

    第九章、查找

    一、查找表:

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

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

            

  • 相关阅读:
    Android-Java-构造方法内存图
    redis conf 详解
    redis windows 下安装及使用
    Python 学习笔记(一)
    python 配置
    win 7 下vim的使用
    window下安装Node.js NPM
    HashMap实现原理(转)
    mysql 常用功能
    MySql配置
  • 原文地址:https://www.cnblogs.com/yangsongwei/p/8966649.html
Copyright © 2011-2022 走看看