查找算法总结

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

2. 平均查找长度
(n+1)/2, 其中n为表长。

3. 算法实现
省略

4. 优化思想
根据经验,目前被查到越多的元素,将来可能被查到的可能性也越大。所以可以考虑,每次查找到一个元素后,将它和直接前驱交换位置。
如果上述的经验从概率上来讲是成立的,则可以加快顺序查找的速度。


====================
二分查找算法
====================
1. 算法描述
限制:待查表必须是有序的向量(在内存中连续存储)
首先和数组中点比较,如果等于则返回,如果小于中点则在左边区间查找,如果大于中点则在右边区间查找。

2. 平均查找长度
lg(n+1)

3. 算法实现
(1) 非递归方式

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

template<typename T>
int binary_search(T *array, const int size, const T & key)
{
 if(NULL == array || size < 1)
 {
  cout << "illegal input!" << endl;
  return ERROR;
 }
 
 int low = 0, high = size - 1;
 int mid_index = 0;

 while(low <= high)
 {
  mid_index = (low+high)/2;
  
  if(key == array[mid_index])
  {
   return mid_index;
  }  
  else if(key > array[mid_index])
  {
   low = mid_index + 1; 
  }
  else 
  {
   high = mid_index - 1;
  }
 }
 
 return ERROR;
}


(2) 递归方式

  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. int mid_index = (low+high)/2;
  9. if(key == array[mid_index])
  10. {
  11. return mid_index;
  12. }
  13. else if(key > array[mid_index])
  14. {
  15. return binary_search_iter(array, mid_index+1, high, key);
  16. }
  17. else
  18. {
  19. return binary_search_iter(array,low, mid_index-1, key);
  20. }
  21. }
template<typename T>
int binary_search_iter(T *array, const int low, const int high, const T & key)
{
 if(low > high)
 {
  return -1;
 }
 
 int mid_index = (low+high)/2;
 
 if(key == array[mid_index])
 {
  return mid_index;
 }
 else if(key > array[mid_index])
 {
  return binary_search_iter(array, mid_index+1, high, key);
 }
 else 
 {
  return binary_search_iter(array,low, mid_index-1, key);
 }
}


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

2. 算法描述
抽取各块中的最大关键字及其起始位置构成一个索引表ID[l..b],即: ID[i](1≤i≤b)中存放第i块的最大关键字及该块在表R中的起始位置。由于表R是分块有序的,所以索引表是一个递增有序表。
先用二分法查到元素可能所在的块起始位置,而后在块内进行顺序查找。

3. 平均查找长度
平均查找长度在顺序查找和二分查找之间,并且当结点数为元素数量的平方根时,查找长度最小。


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

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

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


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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值