如何找到二分查找中目标元素第一次出现和最后一次出现的位置
来源:互联网 发布:中金数据系统年终奖 编辑:程序博客网 时间:2024/05/16 09:46
http://blog.chinaunix.net/uid-27103408-id-3761907.html
关于二分查找有些想不清楚的边界条件问题,在这篇博文里讲得很清楚了。如果能深刻理解那么将会十分受用。
大家对于二分查找并不陌生,一般意义上的二分查找,往往返回给我们的是目标元素在排序数组中出现的一个随机的位置,但是在很多时候,我们却是需要目标元素的第一个和最后一个位置,才有意义。举个例子来说,我们要求得目标元素在排序数组中出现的次数,假如利用一般的方法,逐个比较目标元素和数组元素,时间复杂度O(n),不能够令我们满意,既然数组是排序的我们很容易想到二分查找,在这里我们能不能使用二分查找的算法呢,答案是肯定的。只要我们能够利用二分查找找到目标元素出现的第一个和最后一个位置,就能够求得它出现的次数。我们如何来求得目标元素出现的第一个和最后一个位置呢,其实很简单,我们只需要对于二分查找的退出条件,做一个简单的设定就能得到我们理想的结果哦!
下面我们来看一下代码:
int GetFirstK(int *a, int _left, int _right, int dest){ if(_left > _right || a == NULL) { return 0; } int temp = 0; int left = _left; int right = _right; while(left < right) { temp = (left + right) >> 1; if(a[temp] < dest) { left = temp + 1; } else { right = temp; } } return left;}
在这里跟一般的二分查找的代码相比,仅仅是判断语句上做了一点细微的变化,序列是递增排列的,当中间值小于目标元素的时候,目标元素在序列的右边:left = temp + 1;
其余的情况目标值在序列的左边:right = temp;我们要查找的第一个目标元素的位置,一般的情况就是目标元素存在多个情况,由上述的两个判断条件,我们可以知道,如果查找到了目标元素,并且该目标元素不是第一个的时候,此时left<right,判断继续进行。我们这里设置的判断条件保证了,当中间值小于目标元素的时候,left一定会向右移动,同时如果中间值恰好等于目标元素的时候,right能够不动,最终序列结束的时候,left=right=目标元素的第一次出现的位置!整个过程大家可以设定一个例子在纸上模拟一下:
去最后一次出现的位置,道理也是类似的:
int GetUpK(int *a, int _left, int _right, int dest){ if(_left > _right || a == NULL) { return 0; } int temp = 0; int left = _left; int right = _right; while(left < right) { temp = (left + right + 1) >> 1; //保证取到中间靠后的位置 if(a[temp] > dest) { right = temp - 1; } else { left = temp; } } return right;}
大家可以看出,跟我们取第一个元素时候的判断条件恰好相反,而两种情况处理的方式我们可以归结为以下两句话:
1、当我们要找到目标元素出现的第一个位置时候:当中间值大于等于目标元素的时候,我们要保留当前中间值的位置,并且在左边继续查找。
这句话用条件语句表述就是:
if (a[mid] >= dest)
right = mid;
2、当我们要找目标元素出现的最后一个位置的时候:当中间值小于等于目标元素的时候,我们要保留中间值的位置,并且在右边继续查找。
if(a[mid] <= dest)
left = mid;
0 0
- 如何找到二分查找中目标元素第一次出现和最后一次出现的位置
- 二分元素第一次出现的位置和最后一次出现的位置
- 二分 第一次出现的位置,最后一次出现的位置
- Java 查找某个数字在数组中第一次和最后一次出现的位置
- 统计一个字符串中某个字符第一次出现的位置和最后一次出现的位置
- 查找顺序数组中元素第一次出现的位置(二分查找)
- Java查找指定字符串第一次或最后一次出现的位置
- 在排序的数组中二分查找一个元素,返回在数组中它第一次出现的位置
- C语言 编写字符串操作函数strrchr,在字符串中查找目标字符最后一次出现的位置,返回指向这次位置的指针。
- 查找字符串中要查找的字符串最后一次出现的位置
- 在字符串中寻找目标最后一次出现的位置(python)
- 每天一道LeetCode-----某个数在递增序列第一次和最后一次出现的位置
- Java-基础 查找字符串最后一次出现的位置
- 从源字符串中查找最后一次出现的目标字符串
- 在指定字符串中查找第一次找到所查找的字符和最后一次查找的到的字符
- 查找指定字符串在字符串中第一次或最后一词出现的位置
- 查找字符串中出现一次且第一次出现的字符
- 二分查找拓展,查找指定数字第一次出现和最后出现
- 一个简单的游戏服务器框架
- Hadoop+Hbase安装配置实录
- 社交APP界面设计分析对比(第一季)【草稿】
- Windows下安装Hadoop
- cygwin1.dll丢失,无法启动此程序
- 如何找到二分查找中目标元素第一次出现和最后一次出现的位置
- 致浮躁的程序猿们
- 云计算(二十一)- HDFS API详解
- [Hercules z/OS customize step by step] – S2 Prepare to customize
- 小小语录
- 黄金或扩大..
- .Net IOC 容器性能测试
- Linux ls详细解释
- 字符编码笔记:ASCII,Unicode和UTF-8