算法图解之二分查找
簡單查找,如下圖:
?
從圖可知那個眼鏡男從1開始猜,猜到100,大家都知道這種猜法最終都會得到答案,就是時間問題而已。100畢竟是這個列表的最大長度。但是換言之,如果是一萬、百萬、上千億呢?那么這種猜法雖然能夠得到答案,但是時間方面的成本將會非常大。于是二分法應需而生。
二分法,如下圖:
從圖可知這次眼鏡男學聰明了,從中間入手一分為二。以100為例猜大小,假定要猜的數字為65,這時眼鏡男說50,于是小姐姐說小了,眼鏡男再猜70,小姐姐說大了,這時眼鏡男可以肯定的范圍應該在51~69這個范圍內,相比簡單查找,這種方式效率要高的多。最終眼鏡男肯定會猜到正確的數字,花費的時間與簡單查找相比,花費時間肯定是很少的。
二分法也有其局限性,局限性就是必須要確保列表是有序的才行。
以代碼來講解:
簡單查找,以數組為例,索引從0開始
二分法,例子如下:
@Testpublic void testSelect() throws Exception {int[] num = new int[] {1,3,5,7,9,11};int start = 0;int end = num.length - 1;int i = 14;while(true) {int mid = (start+end) / 2;if(i == num[mid]) {System.out.println("index:"+mid);break;}else {if(i < num[mid]) {end = mid - 1;}else {start = mid + 1;}}if(start > end) {System.out.println("no find,will insert in:"+start);break;}}}?
轉載于:https://www.cnblogs.com/youcong/p/10852439.html
總結
- 上一篇: js判断鼠标旋转度数以及顺逆方向详解
- 下一篇: kibana一直弹出来报错?