查找 算法

查找

查找(search)又称为检索。
  1. 线性表的查找

    线性表上进行查找的方法:顺序查找、折半查找和分块查找。

    • 顺序查找

        从表的一端开始,用给定的值与表中各结点的关键字逐个进行比较,直到找出相等的结点则查找成功;
        
        或者查找所有结点都不相等则查找失败。顺序查找对线性表的结构本身没有特殊的要求,即表可以是顺序存储的,也可以是链接存储的;
        
        对表中的数据也没有排序要求。因此它具有很好的适应性,是一种经常采用的查找方法。
      
    • 折半查找

        折半查找(binary search)又称为二分法查找,它是一种效率较高的查找方法,但它要求被查找的线性表是顺序存储且表是按关键字排序。
        
        折半查找的优点是比较次数少,查找效率高,但它要求表顺序存储且按关键字排序。
      
    • 分块查找

        如果要处理的线性表即希望有较快的查找速度又需要适合于动态变化,则可以采用分块查找的方法。
        
        分块查找(blocking search)又称作索引顺序查找。它是一种性能介于顺序查找和折半查找之间的查找方法。
      

      分块查找的基本方法如下:

      1.建立结构
      (1)分块。

            分块查找要求把线性表均匀地分成若干块,在每一块中结点是任意存放的,但块与块之间必须是有序的。
      

      (2)建立辅助表(索引表)。

        建立一个最大(最小)关键字表,即把块中最大(最小)的关键字值依次填入索引表中,并通过指针指向本块首址。
      
分块查找的优点是:
         
在表中插入或删除一个结点时,只要找到该结点应属于的块,然后在块内进行插入和删除运算。
由于块内结点的存放是任意的,所以插入或删除比较容易,不需要移动大量的结点。

分块查找的缺点是:
    ①分块查找的主要代价是增加了一个辅助数组(索引表)的存储空间和初始线性表分块排序的运算。
    ②当大量的插入、删除运算使块中结点数分布不均匀时,分块查找的速度将会有所下降。
  1. 树形表的查找
    • 二叉排序树
      二叉排序树(binary sort tree)又称二叉查找(搜索)树(binary search tree)。
      二叉排序树是一棵空树或者是具有如下性质的二叉树。

      (1)左子树(若存在)中所有结点的关键字都小于根结点的关键字;
      (2)右子树(若存在)中所有结点的关键字都大于根结点的关键字;
      (3)左子树和右子树也是二叉排序树。
      
    • 最佳二叉排序树
      平均比较次数最小,也就是平均查找长度 ASLn为最小的二叉排序树称作最佳二叉排序树。

      具体方法如下。

       (1)将给定的关键字集合里的关键字排序;  
       (2)用折半查找法依次查找这些关键字,并把在查找过程中遇到的在二叉排序树里还没有的关键字依次插入到二叉排序树中。
      
    • AVL树

      AVL树是所有结点的左子树和右子树高度之差的绝对值不超过1的二叉排序树。

    • B-和B+树

        B-树  
        
        一棵m阶(order)B-树是一棵平衡的m路查找树,它满足如下性质。
        (1)根结点至少有两个子女;
        (2)除根结点之外的所有内部结点至少有⎡m/2⎤个子女。
        (3)所有外部结点(失败结点①[1] )都位于同一层上。
        B+树  
        
            B+树是可以在其叶结点上存储信息的树,它是 B-树的一种变形,在实现文件索引结构方面比B-树应用得更广泛。一棵m阶B+树可以定义为:
            (1)树中每个非叶结点至多有m棵子树。
            (2)根结点至少有2棵子树,除根结点外的每个非叶结点至少有⎡m/2⎤ 棵子树;有j棵子树的非叶结点含有j-1个关键字,且按由小到大的顺序排列。
            (3)所有的叶结点都处于同一层上,包含了全部关键字及指向相应记录的指针,且叶结点本身按关键字由小到大的顺序链接。
            (4)每个叶结点中的子树棵数nj可以多于m,也可以少于m,视关键字字节数及记录地址指针字节数而定。若设叶结点最多可容纳m1个关键字,则指向记录的地址指针也有m1个,因此,结点中的子树棵数nj的取值范围应为:⎡m1/2⎤≤nj≤m1。若根结点同时又是叶结点,则结点格式同叶结点。
            (5)所有的非叶结点可以看成是索引部分,结点中关键字Ki与指向子树的指针pi构成一个对子树(即下一层索引块)的索引项(Ki,pi),其中关键字Ki≤pi指向的子树中最小的关键字。特别地,子树指针p0所指子树中的所有关键字均小于K1。结点格式同B-树。
  1. 散列表查询
    散列表(hash table)又称为哈希表,它是一种重要的存储方式。
    在散列表上进行查找的方法简称为散列法或哈希法(hash method),它也是另一类较为特殊而又常用的查找方法。
    它的基本思想和前面讲述的查找方法完全不同,前面介绍的各种查找方法,无论是线性表上的查找,还是树表上的查找,它们的一个共同的特征是:都要根据给定值K,通过一系列的比较,才能确定是查找成功还是查找失败。
    所以统称为对关键字进行比较的查找方法。然而散列的方法却不同,它是在对关键字做某种运算后直接确定其元素相应的位置(地址)。
    所以,哈希法又称为散列地址编码法。用散列法存储的表叫作散列表。
散列函数
    1.除留余数法
    2.数字分析法
    3.折叠法
    4.平方取中法
    5.随机数法
    
冲突的解决
    冲突的解决(collision resolution)或称冲突的处理,其方法基本上有两类:开地址(open addressing)法和拉链(chaining)法。

猜你喜欢

转载自blog.csdn.net/zjltju1203/article/details/89211715