设n个不同的整数排好序后存于T[1..n]中,若存在一个下标i(1≤ i ≤ n),使得T[i]=i。试设计一个有效算法找到这个下标,要求算法在最坏情形下的计算时间为O(log n)
转自http://zmp1123.blog.163.com/blog/static/1193291592013314581911/
设n 个不同整数排好序后存于T[0:n-1]中,若存在一个下标i,0≤i<n,是的T[i]=i,设计一个有效地算法找到这个下标。要求算法在
最坏情况下的计算时间为O(logn)。
算法描述如下:
由于n 个整数是不同的,因此对任意0≤i<n-1 有T[i]≤T[i+1]-1。
1 对于0<i<n,当T[i]>i 时,对任意的i≤j≤n-2 有T[j]≥T[i]+j-i>i+j-i=j。
2 对于0<i<n,当T[i]<i 时,对任意的0≤j≤i 有T[j]≤T[i] -i+j <i-i +j =j。
由①和②可知,用二分搜索法可以在O(logn)时间内找到所要的下标。
算法如下:
非递归二分搜索:
Template<class T>
int binarySearch(T a[],int left,int right)
{
int middle;
while(left<=right){
middle=(left+right)/2;//middle=(left+right)>>1;
if(middle==a[middle]) return middle;
if(middle>a[middle]) left=middle+1;
else right=middle-1;
}
return 0;
}
递归二分搜索:
Template<class T>
int FindFixedPoint(T a[],int left,int right)
{
int middle;
middle=(left+right)/2;//middle=(left+right)>>1;
if(left<=right){
if(middle==a[middle]) return middle;
else if(middle>a[middle]) FindFixedPoint(a,middle+1,right);
else FindFixedPoint(a,left,middle-1);
}
return 0;
}
设n个不同的整数排好序后存于T[1..n]中,若存在一个下标i(1≤ i ≤ n),使得T[i]=i。试设计一个有效算法找到这个下标,要求算法在最坏情形下的计算时间为O(log n)相关推荐
- 数据结构:试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来
题目 试设计一个算法,改造一个带表头结点的双向链表,所有结点的原有次序保持在各个结点的右链域rLink中,并利用左链域ILink把所有结点按照其值从小到大的顺序连接起来 分析 Template < ...
- 问题描述 给定一个由n行数字组成的数字三角形如下图所示。试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大。 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底
问题描述 给定一个由n行数字组成的数字三角形如下图所示.试设计一个算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大. 对于给定的由n行数字组成的数字三角形,计算从三角形的顶至底的路径 ...
- 问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n堆石子
问题描述: 在一个圆形操场的四周摆放着n 堆石子.现要将石子有次序地合并成一堆. 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分. 试设计一个算法,计算出将n堆石子 ...
- 设单链表中存放n个字符,试设计一个算法,使用栈推断该字符串是否中心对称...
版权声明:本文为博主原创文章.未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/28281631 转载请注明出 ...
- 数据结构例16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序。
/* 16.试设计一个算法, 使得在一个有序的单链表中插入一个元素后仍然有序. */ # include <iostream> # include <stdlib.h> # i ...
- 有一个顺序表L,其元素为整形数据,设计一个算法,将L中的所有小于表头元素的整数放在前半部分,大于表头元素的整数放在后半部分
题目 有一个顺序表L,其元素为整形数据,设计一个算法,将L中的所有小于表头元素的整数放在前半部分,大于表头元素的整数放在后半部分 解答(天勤) /*************************** ...
- 离散数学试设计一个算法,对给定的集合A和集合A上的一个二元关 系R,判断R是否具有对称性
题解: 通过标记来判断集合A上的元素,如果输入的数组内的数不存在于集合A,则会被标记不是集合内(ff[]或fff[]=-1,如果存在于集合A中则ff[]或fff[]=0)当ff和fff数组内元素均为0 ...
- AcWing 算法基础课第一节基础算法1排序、二分
1.该系列为ACWing中算法基础课,已购买正版,课程作者为yxc 2.y总培训真的是业界良心,大家有时间可以报一下 3.为啥写在这儿,问就是oneNote的内存不够了QAQ ACwing C++ 算 ...
- Leapfrog Triejoin:最坏情况下的最优连接算法
介绍 leapfrog triejoin是商业数据记录系统 LogicBlox® 采用的一种新颖的连接算法,在不同的基准测试中表现出色.leapfrog triejoin论文的写作者认为这个算法,即使 ...
最新文章
- 中国式姥姥上热搜感动无数人:有妈妈在,我才敢生娃
- ASP.NET Button控件的UseSubmitBehavior属性引发的血案
- php网页论坛制作教程,PHP开发 小型论坛教程之登录HTML页面
- python shell下载很慢_Python踩坑之旅其一杀不死的Shell子进程
- python汉诺塔问题_Python汉诺塔问题
- 相机添加多张图片css布局
- JupyterNotebook设置并切换不同Python启动环境
- [FFmpeg] CMake 单独编译 ffplay 之基础篇
- 什么情况下使用 if()后面的else可以省略不写
- JavaScript高级编程之树节点搜索过滤的设计和实现
- 银行如何构建反欺诈模型
- 支付宝支付时提示“长时间没操作,请重新发起请求”的错误处理
- [专利与论文-12]:高级职称评定的面试和答辩注意事项
- oracle分析函数用途,深入探讨:oracle中row_number() over()分析函数用法
- 2019版云计算大数据学习路线图(含大纲+视频+工具+书籍+面试)
- 去雾模块dehaze.py(可直接调用)
- 第三阶段---python基础---抽签点名案例
- 图像缩放--双线性内插法及其python实现(图文代码)
- CPU的频率、外频、倍频与超频
- Jetson Xavier NX相关安装