最近诸事缠身,难以静心,拜业界大拿万林兄所赐,决定写点什么,却又不知从何说起,正好最近在回顾算法,遂捡一算法开启是为开山。
-----小记
---------------------------------------------------------------------------------------------------------------------------------
万物皆对象隐含的一个陈述是算法反映的其实是客观存在的场景。
记得在我接受初级教育那会,老师教授学生查字典,刚开始大都从目录开头进行检索直到找到最终的目标单词或拼音。随着时间推移,学生们逐渐开始拿起一本字典从中间的某一页开始查找,这样如果发现检索的词在当前页的前(后)面,就继续在前(后)找,这样来回几次,直到检索成功。
巨人之所以是巨人,除了站在了巨人的肩膀上,更重要的是他们从真实场景中抽象概括出了一种在一定维度里放之四海而皆准的模型,进而反过来更论证了之前经验的正确性。
上述例子,粗略可作为二分查找算法得一个情景。这里可以得出一个结论:二分查找得输入是一个有序得元素列表。
选取一个连续序列,比如1~100的整型数字:
1 2 3 ..... 100
下面先用传统方法简单查找,比如查询的数字是100,如果逐个遍历,需要查询100次,也就是常说的传统简单查找的时间复杂度为n;
再看二分查找(每次都排除一半的数值):还是上面的目标数值,首先从100/2=50开始,50<100,小了,但剔除了一半的数值,现在从51-100中继续选中间数值75,依此往复,折半查找,直至第七次查到目标值100,也就是说用二分查找最多需要log2n(log以2为底n的对数)。
梳理完毕,伪代码如下:
//定义初始最小、最大索引
int start = 0;
int end = srcArray.length - 1;
//确保不会出现重复查找,越界
while (start <= end) {
//计算出中间索引值
int middle = (end + start)>>>1 ;//防止溢出
if (des == srcArray[middle]) {
return middle;
//判断下限
} else if (des < srcArray[middle]) {
end = middle - 1;
//判断上限
} else {
start = middle + 1;
}
}