算法中最基本和常用的是搜索。比赛中,参赛选手基本上都会使用常用的搜索算法,题目的区分度往往就是建立在诸如剪枝之类的优化上了。
什么是搜索算法呢?
搜索算法是利用计算机的高性能来有目的地穷举一个问题的部分或所有的可能情况,从而求出问题的解的一种方法。
搜索过程实际上是根据初始条件和扩展规则构造一棵解答树并寻找符合目标状态的节点的过程。
第一部分:二分查找
- 1.必须采用顺序存储结构。
- 2.必须按关键字大小有序排列。
- 假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
假设给出若干个(可以很多)有序的整数,请查找某个元素是否存在,比如——
2 3 4 5 6 8 12 20 32 45 65 74 86 95 100
请查找以上数列中是否存在某个整数(比如25),若有,请输出其位置,否则请输出NO~
二分查找的前提—— 数据的单调性
时间复杂度:O(logN)
二分查找代码
//整数列表ver.
- int BinSearch(SeqList * R, int n , KeyType K )
- {
- int low=0,high=n-1,mid;
- if(R[low].key==K)
- return low ;
- if(R[high].key==k)
- return high;
- while(low<=high)
- {
- mid=(low + high) / 2 ;
- if(R[mid].key==K)
- return mid;
- if(R[mid].key>K)
- high=mid-1;
- else
- low=mid+1;
- }
- if(low>high)
- return -1;
- }
//浮点数ver.
- inline double Y(double x)
- {
- return SomethingAboutX;
- }
- const double eps = 1e-6;
- double BinSearch(double start, double end, double K )
- {
- double mid;
- if(fabs(Y(start)-K)<eps)
- return start;
- if(fabs(Y(end)-K)<eps)
- return end;
- while(fabs(end-start)>eps)
- {
- mid = (start + end)/2 ;
- if(Y(mid)-K>eps)
- end = mid - eps;
- else
- start = mid + eps;
- }
- return (start+end)/2;
- }