二分查找总结
2014-11-12 12:51
295 查看
今天看了个书,自己说用笔写一个二分发现怎么都是死循环跳不出来,真是太渣了,写一个总结吧。有许多人觉得简单,可是你当别人面写一个的话还是要出很多问题的
我们要二分查找的数组为{1,1,2,2,3,3,5,5,6,6,7,8,15}
首先我们仿写一个lower_bound()
while(l < r){
m = (l + r) >> 1;
if(a[m] >= x){
r = m;
}
else{
l = m + 1;//我们查找值的位置只能出现于[m + 1, r],如果写m的话会死循环,应为你没有剔除不符合条件的区间
}
}再仿写一个upper_bound()
int myupperBound(int x){
int l = 0, r = 5, m;
while(l < r){
m = (l + r) >> 1;
if(a[m] <= x){
l = m + 1;//我们查找值的位置只能出现于[m + 1, r]<span style="font-family: Arial, Helvetica, sans-serif;">如果写m的话会死循环,因为没有剔除不符合条件的值</span>
}
else{
r = m;
}
}
return l;
}所以我们二分查找重要的就是每次都要把不符合条件的区间剔除,然后在符合条件的区间内查找,只要守着这一条规则肯定就没有问题。
我们要二分查找的数组为{1,1,2,2,3,3,5,5,6,6,7,8,15}
首先我们仿写一个lower_bound()
while(l < r){
m = (l + r) >> 1;
if(a[m] >= x){
r = m;
}
else{
l = m + 1;//我们查找值的位置只能出现于[m + 1, r],如果写m的话会死循环,应为你没有剔除不符合条件的区间
}
}再仿写一个upper_bound()
int myupperBound(int x){
int l = 0, r = 5, m;
while(l < r){
m = (l + r) >> 1;
if(a[m] <= x){
l = m + 1;//我们查找值的位置只能出现于[m + 1, r]<span style="font-family: Arial, Helvetica, sans-serif;">如果写m的话会死循环,因为没有剔除不符合条件的值</span>
}
else{
r = m;
}
}
return l;
}所以我们二分查找重要的就是每次都要把不符合条件的区间剔除,然后在符合条件的区间内查找,只要守着这一条规则肯定就没有问题。
相关文章推荐
- 二分查找递归与非递归总结
- 查找(二):二分查找----<学习总结>
- [LeetCode]Search Insert Position (二分查找总结) Java Version
- 二分查找及其变形总结
- binarySearch二分查找总结
- 二分查找总结
- 不光是查找值!"二分搜索"总结
- 对排序的总结&&二分查找
- [leetcode]二分查找总结
- 二分查找总结
- 【二分查找】学习总结
- 二分查找总结
- 二分查找总结
- [LeetCode] Serch Insert Position (总结二分查找) Java version
- java中二分查找的总结
- 查找算法总结之顺序查找、二分查找、静态树查找
- 二分查找小小总结
- 二分查找分类总结
- 二分查找总结
- 由九度1502引出的对二分查找的一点总结v1.0