[算法]搜索相关

算法中最基本和常用的是搜索。比赛中,参赛选手基本上都会使用常用的搜索算法,题目的区分度往往就是建立在诸如剪枝之类的优化上了。 

 什么是搜索算法呢?

搜索算法是利用计算机的高性能来有目的地穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。

搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。


第一部分:二分查找

  • 1.必须采用顺序存储结构。
  •  2.必须按关键字大小有序排列。
  • 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

假设给出若干个(可以很多)有序的整数,请查找某个元素是否存在,比如——

2   3   4   5   6   8   12  20  32  45  65  74  86  95  100

请查找以上数列中是否存在某个整数(比如25),若有,请输出其位置,否则请输出NO~

二分查找的前提—— 数据的单调性

时间复杂度:O(logN)

二分查找代码

//整数列表ver.
  1. int BinSearch(SeqList * R, int n , KeyType K )  
  2. {   
  3.     int low=0,high=n-1,mid;  
  4.     if(R[low].key==K)  
  5.         return low ;  
  6.     if(R[high].key==k)  
  7.         return high;  
  8.     while(low<=high)  
  9.     {  
  10.         mid=(low + high) / 2 ;  
  11.         if(R[mid].key==K)  
  12.             return mid;  
  13.         if(R[mid].key>K)  
  14.             high=mid-1;  
  15.         else  
  16.             low=mid+1;  
  17.     }  
  18.     if(low>high)  
  19.         return -1;   
  20. }  


//浮点数ver.

  1. inline double Y(double x)  
  2. {  
  3.     return SomethingAboutX;  
  4. }  
  5. const double eps = 1e-6;  
  6. double BinSearch(double start, double end, double K )  
  7. {  
  8.     double mid;  
  9.     if(fabs(Y(start)-K)<eps)    
  10.         return start;  
  11.     if(fabs(Y(end)-K)<eps)  
  12.         return end;  
  13.     while(fabs(end-start)>eps)  
  14.     {  
  15.         mid = (start + end)/2 ;  
  16.         if(Y(mid)-K>eps)    
  17.             end = mid - eps;   
  18.         else  
  19.             start = mid + eps;  
  20.     }  
  21.     return (start+end)/2;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值