• 查找


    一.查找

        1.顺序查找:

            (1) 算法思想:顺序表的记录都是无序的。从头到尾或者从尾到头沿着一个方向依次将扫描到的

    元素值与给定的关键字 key 相比较。若元素值与 key 相等,则查找成功,若扫描完所有的节点,仍

    未找到,则查找失败。

            (2) 时间复杂度:最好的情况即一次就找到,时间复杂度 O(1);而最坏情况是直到最后一个记录才

    找到,或着根本没找到,时间复杂度是O(n)。顺序查找平均需要查找 (n+1)/2次,时间复杂度是O(n)

            (3) 优点:直观简单。  缺点:当 n 很大是查找效率比较底。

        2.折半查找: 前提条件是线性表有序

            (1) 设被查找的元素的关键字为 key ,首先将查找范围下限设为 left = 0, 上限为 right = n - 1, 中点

    mid = (left + right)/2; 中点元素标记为 a[ mid ]。 用 key 与中点元素 a[ mid ] 比较,若 key = a[ mid ],

    该元素就是要找的元素,查找停止;key > a[ mid ]; 则替换下限 left = mid + 1; 到下半段继续查找,若

    key < mid,则替换上限 right = mid - 1,到上半段继续查找。依次循环,直至找到元素或left > right 为

    止,low > high,说明此元素未找到。

            (2)时间复杂度:查找的总次数就是二叉树的深度,n 个结点的二叉树深度为 log( n ) + 1, 时间复杂

    度是O( log n )。

            (3) 优点 时间复杂度优于顺序查找。 缺点:每次查找从表的中间开始,如果是一个很大的表,表查

    的开始或结束附近的记录就需要经过多次查找。

        3. 分块查找:

            (1) 算法思想:数据( a[ 0 ] ...... a[ n-1] )均分 B 块,每一块中的数据无须有序,但要求“分块有序”,

    思是:前一块中的最大数据必须小于后一块中的最小数据。我们需要构造一块索引表 index ,每个元素

    index[ i ]( 0 <= i <= B - 1 ) 中存放第 i 块的最大关键字 max 、该块的起始位置 start 及结束位置 end。

            (2) 时间复杂度:每次查找先找到元素所在块,再查找块内的数据。设有 n 个元素,平均分成 m 个

    块,每个块有 t 个元素,平均查找次数就是( m + 1)/2 + ( t + 1 )/2 = ( n/t + t )/2 + 1 >= log n + 1,所以分块

    查找的时间复杂度介于 O( n ) 和 log n 之间。

            (3) 优点:分块索引兼顾了有序和无序的需求,平衡了插入、删除和查找的性能,普遍应用于数据库查

    找等方面。

  • 相关阅读:
    bzoj 1858 线段树
    bzoj 1877 最小费用流
    bzoj 1833 数位dp
    Codeforces Round #285 (Div. 1) B
    HDU2028 Lowest Common Multiple Plus
    HDU5706 GirlCat
    HDU2022 海选女主角
    687E: TOF
    687D: Dividing Kingdom II
    687D: Dividing Kingdom II
  • 原文地址:https://www.cnblogs.com/Edviv/p/11625580.html
Copyright © 2020-2023  润新知