zoukankan      html  css  js  c++  java
  • [转]经典算法之查找(一)

    ====================
    顺序查找算法
    ====================
    1. 算法描述
      顺序比较即可。

    2. 平均查找长度
      (n+1)/2, 其中n为表长。
      
    3. 算法实现
        省略
      
    4. 优化思想
      根据经验,目前被查到越多的元素,将来可能被查到的可能性也越大。所以可以考虑,每次查找到一个元素后,将它和直接前驱交换位置。
    如果上述的经验从概率上来讲是成立的,则可以加快顺序查找的速度。
      
      
    ====================
    二分查找算法
    ====================
    1. 算法描述
      限制:待查表必须是有序的向量(在内存中连续存储)
      首先和数组中点比较,如果等于则返回,如果小于中点则在左边区间查找,如果大于中点则在右边区间查找。
     

    2. 平均查找长度
      lg(n+1)
      
    3. 算法实现
    (1) 非递归方式

    [cpp] view plaincopy
     
    1. static const int ERROR = -1;   
    2.   
    3. template<typename T>  
    4. int binary_search(T *array, const int size, const T & key)  
    5. {  
    6.  if(NULL == array || size < 1)  
    7.  {  
    8.   cout << "illegal input!" << endl;  
    9.   return ERROR;  
    10.  }  
    11.    
    12.  int low = 0, high = size - 1;  
    13.  int mid_index = 0;  
    14.   
    15.  while(low <= high)  
    16.  {  
    17.   mid_index = (low+high)/2;  
    18.     
    19.   if(key == array[mid_index])  
    20.   {  
    21.    return mid_index;  
    22.   }    
    23.   else if(key > array[mid_index])  
    24.   {  
    25.    low = mid_index + 1;   
    26.   }  
    27.   else   
    28.   {  
    29.    high = mid_index - 1;  
    30.   }  
    31.  }  
    32.    
    33.  return ERROR;  
    34. }  


    (2) 递归方式

    [cpp] view plaincopy
     
    1. template<typename T>  
    2. int binary_search_iter(T *array, const int low, const int high, const T & key)  
    3. {  
    4.  if(low > high)  
    5.  {  
    6.   return -1;  
    7.  }  
    8.    
    9.  int mid_index = (low+high)/2;  
    10.    
    11.  if(key == array[mid_index])  
    12.  {  
    13.   return mid_index;  
    14.  }  
    15.  else if(key > array[mid_index])  
    16.  {  
    17.   return binary_search_iter(array, mid_index+1, high, key);  
    18.  }  
    19.  else   
    20.  {  
    21.   return binary_search_iter(array,low, mid_index-1, key);  
    22.  }  
    23. }  


    ====================
    分块查找算法
    ====================
    1. 基本思想
        以增加空间复杂度为代价(存储每块中的最大值已经最大值的位置),为原数组做一个索引(索引本身是递增有序的),这样先查索引,再查块内位置。如果索引的选择科学有效,则可以获得比顺序查找快的速度。

    2. 算法描述
       抽取各块中的最大关键字及其起始位置构成一个索引表ID[l..b],即: ID[i](1≤i≤b)中存放第i块的最大关键字及该块在表R中的起始位置。由于表R是分块有序的,所以索引表是一个递增有序表。
       先用二分法查到元素可能所在的块起始位置,而后在块内进行顺序查找。
      
    3. 平均查找长度
       平均查找长度在顺序查找和二分查找之间,并且当结点数为元素数量的平方根时,查找长度最小。


    =======================
    二叉排序树上的查找
    =======================
    1. 基本思想
       由如何改进二分查找的缺陷(插入和删除操作需要移动大量的数据)而得出的一种算法,用二叉排序树存储数据,由于二叉树的插入和删除操作的时间复杂度相对低,而且也支持二分查找,所以在动态数据查找方面优于二分查找。

    2. 算法描述
       二叉树的特点是中序遍历可以得到递增的序列。很容易可以得出在二叉排序树上进行二分排序的递归代码。

    3. 平均查找长度
        和二叉排序树的形态有关。在极端情况下,二叉树只有单一的左或右分支,则查找长度为(n+1)/2;如果是平衡二叉树,则查找长度为lgn(树的层次)。


    =======================
    散列技术下的查找
    =======================
    1. 基本思想
        将元素的值和其位置直接对应,对应的方法就是散列函数(如平方取中,除余法等等);然而再好的散列函数也会引起冲突,则解决冲突的方法是如拉链法,线性探测法,二次探测法等等。

  • 相关阅读:
    C++ using namespace std详解
    FlexEdit强大的文本编辑器(免费的!)
    串口扩展方案总结
    LED数码引脚图
    串口扩展方案总结
    C++ using namespace std详解
    Digital Mars Compiler简介及使用
    Digital Mars Compiler简介及使用
    poj1018
    poj3536
  • 原文地址:https://www.cnblogs.com/songxinya/p/3162829.html
Copyright © 2011-2022 走看看