admin 发表于 2017-2-23 18:30

乐视2017暑假实习生笔试题二分查找之JAVA实现

试题

对一个含有20个元素的有序数组做二分查找,数组起始下标为1,则查找A的比较序列的下标为()

A. 9,5,4,2
B. 10, 5, 3, 2
C. 9, 6, 2
D. 20, 10, 5, 3, 2
解析

没错,可能懂的人一眼就瞧出来了,选B;不懂的百度也能搜出来。当然网上也有不同的声音,有些童鞋感觉答案不对,在求指教!计算得出的是{10,5,2}。

吓得我赶紧百度了一下百度百科(尽管有时候也挺扯淡的),百度百科给出的demo是:

假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.
1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为mid>x,故应在前半段中查找。
2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>mid,故确定应在后半段中查找。
3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a=x,查找成功。
如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a,按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功。

如果按照案例,这位童鞋貌似算的不差也。然而他可能忽略了整数溢出的问题。

举个例子,比如 int型数据,JAVA里除号是下取整的。二分法,你mid有不断增加的可能,加法就容易溢出,超过int型数据的表达范围。

比如计算2个32位的数字,加法结果为64位,但是制定了数据类型为32位,结果就只能读这个64位数的低32位,这就是溢出。

有可能二分查找到数组的最后两个,如果数组的长度非常大,就有可能溢出。如果你要在数量为十亿级别数据库中查找,就要考虑这个溢出。

所以最好使用公式 int mid= (end- front) / 2 + front,看来百度百科也不大靠谱哈。

http://blog.52itstyle.com/archives/374/

mengxianqian 发表于 2017-3-3 10:20

谢谢楼主的分享!。。。

小白爱旅行 发表于 2017-3-3 18:42

好详细。

admin 发表于 2017-3-3 21:38

小白爱旅行 发表于 2017-3-3 10:42
好详细。

来自苹果客户端????

小白爱旅行 发表于 2017-3-4 10:40

admin 发表于 2017-3-3 21:38 static/image/common/back.gif
来自苹果客户端????

对,我怎么了?

admin 发表于 2017-3-4 10:42

小白爱旅行 发表于 2017-3-4 02:40
对,我怎么了?

苹果APP、 居然可以安装了??

小白爱旅行 发表于 2017-3-4 12:16

admin 发表于 2017-3-4 10:42 static/image/common/back.gif
苹果APP、 居然可以安装了??

可以的,不过要设置一下

admin 发表于 2017-3-4 13:49

小白爱旅行 发表于 2017-3-4 04:16
可以的,不过要设置一下

我居然 不知道:L

wudizxt 发表于 2017-8-11 19:32


谢谢楼主的分享!。。。

lorainbow 发表于 2018-3-18 10:38

这个楼主不简单
页: [1]
查看完整版本: 乐视2017暑假实习生笔试题二分查找之JAVA实现