大家好,我是二分算法,很多人最初接触到算法时候最先认识的就是我。我呢,说难不难,说简单也千万不要大意。
什么,你问我是谁?
说到我为什么而来,昨天我和阿大玩了一个游戏,很好的诠释了这个问题。这个游戏的规则很简单,一个人在心中想一个1到100的数字,另一个人猜。猜的过程中,一方只能告诉另一方是大了还是小了。猜的次数最少的人获胜。
第一局我心里想的数字是57,阿大就这样,从1开始猜到了57,猜了57次。
第二局轮到我了,想想我可是二分查找算法,最擅长的是什么?就是查找啊,阿大这次输定了,看我如何以最快的速度找到他心里想的数字。
第一次,我猜了个数字50,阿大告诉我小了。
第二次,我猜了个数字75,阿大告诉我大了。
第三次,我猜了个数字63,阿大告诉我大了。
第四次,我猜了个数字57,阿达告诉我对了。
他竟然和我想的数字是一个!狡诈。
可是我依然以巨大的差距赢得了阿大。
阿大感到不服气,觉得是我运气好,其实我只是做了一个我最擅长的事情而已——二分算法。
从一开始,我并不知道他心里想的数字是什么,我只猜最中间的数字50,这样无论是大了还是小了,都会有一半的数字被50过滤掉,接下来,我从有效的一半数字中,再找中间的数字,又可以过滤掉一半的数字,直到找到这个数字为止,所以对于100个数字来说,我最多最多也只需要7次而已,
这比阿大的傻找真的少太多了,看看1000次呢,也最多只需要14次。
看了这个游戏,是不是觉得我很好了解?只需要满足两个条件就行了,
第一是一串有序的数。
第二一直找“中间”的数字,直到找到为止。
另外我也知道,在面试中,常常遇到的是给你一个数字,让你把他找出来。这样的代码实现。
阿大说每次算法题,他都是背下来,然后让写什么就写什么。这样是很危险的,我比较单纯简单,但是遇到了我那些复杂的算法兄弟,稍微一变形,就把你考住了。
所以要写算法代码,最重要的就是把你理解算法的思路转换成代码执行算法的思路。
现在我来举个例子,有这样的一串数字,已经排好序了,如何能写一段二分查找代码找到35这个数字呢?