各种缺陷的二分法算法
来源:互联网 发布:淘宝写文案范文 编辑:程序博客网 时间:2024/04/28 15:25
二分法是思想精髓就是如果左下标和右下标得到的中间下标所在的值等于所要查找的值,算法结束;如果中间的值小于目标值,则说明目标值可能在中间值和右下标所在的区间内,就将中间下标当成左下标,继续搜索。如果中间值大于目标值,则把中间下标当成右下标,继续搜索。
这是近期在网上用google搜索“二分法算法”找到的二分法算法。结果发现各种各样的缺陷。
public int erfen()
//二分法查找
{
int iindex=0; //相当于指针的东西
int istart=0; //
int iend=iarray.length-1;
while(true)
{
icount++;
iindex = (istart+iend)/2;
if(iarray[iindex]<iseek)
{
istart = iindex;
}
else if(iarray[iindex]>iseek)
{
iend = iindex;
}
else
{
break;
}
}
return icount;
}
用一个测试用例就能证明的这个算法错误。
0 1 2 3 4 5查找5.结果你会发现死循环。
很多人认为只要起始值的左值和右值相加为n-1就可以了。其实不然,二分法是10年多的时间才找到了一种正确的算法。如果你开始的左值设为0并且右值设为n-1,程序很大的程度上会错。除非你解决了最后的死循环问题。
下面的算法
right = length;
while(left <= right)
...{
mid = (left + right)/2;
if(a[mid] > value)
...{
//中间值比目标值大
right = mid;
}
else if(a[mid] < value )
...{
//中间值比目标值小
left = mid;
}
else
...{
//找到,中间值等于目标值
return left;
}
}
return -1;
可以解决上面的0 1 2 3 4 5 查找5找不到的问题。但是,却在查找不存在的数上出了问题。比如6
下面的代码解决了这个问题:
right = length;
while(left +1 != right)//注意这句话!!!
......{
mid = (left + right)/2;
if(a[mid] > value)
......{
//中间值比目标值大
right = mid;
}
else if(a[mid] < value )
......{
//中间值比目标值小
left = mid;
}
else
......{
//找到,中间值等于目标值
return left;
}
}
return -1;
但是上的这段真的解决了所有的问题?如果left + right 超过了整数范围?
改为下面的代码:
...{
int left = -1;
int right = length;
int mid;
while(left +1!= right)
...{
mid = left +(right-left)/2;//注意这里的写法
if(values[mid] == value)
...{
return mid;
}
else if(values[mid] < value)
...{
left = mid;
}
else
...{
right = mid;
}
}
return -1;
}
这里解决了越界问题。但是这段代码真的没有问题了吗?没有人能保证。除非能用数学证明。
另外还有一种写法:但是必须特判length==0的情况,否则一定会访问越界。
- 各种缺陷的二分法算法
- 二分法查找的算法
- Rete算法的缺陷
- iOS 算法 简单的二分法
- 谈谈 wp7 webbrowser+html5 的各种缺陷
- 二分法(算法)
- 算法---二分法
- 二分法 -算法
- 二分法查找 各种版本。。。
- 二分法查找与冒泡算法的实现
- 二分法快速查找的递归算法
- R语言的二分法和knn算法
- Tangent算法的缺陷及修正办法
- 分布式之取模算法的缺陷
- 思考: 现有图像算法的缺陷
- 分布式算法之取模算法的缺陷
- Vector的各种算法
- 各种算法的改进
- oracle 使用存储过程分割字符串为数组
- 宇宙将走向哪里
- 一个研究生毕业以后的人生规划
- 学JAVA 从哪入手哦!!!!!!!!!!!!!!!!
- 黑客的故事(搞笑)
- 各种缺陷的二分法算法
- 做最好的自己(李开复)
- 页面间传递变量的方法
- 宴请礼仪:餐桌礼仪
- [转]文件复制
- xml文件的建立、添加、查询
- 用中转页显示目标页
- VxWorks全局变量的保护
- JMS简介