用php實現(xiàn)二分查找

這兩天一路超神從青銅升級到了黃金(鐘無艷、魯班全圖猥瑣偷人,歡迎一起開黑),本著勞逸結(jié)合的精神(zhuangbi)看了一會兒技術(shù)論壇,胡看亂看時瞄到了二分查找,反正也無聊,就決定動動腦子動動手,用php實現(xiàn)一下。


懂的人就不用看了,本篇純屬扯淡。。。

首先介紹一下神馬叫二分查找,為什么要介紹呢?因為我相信看到這片文章的肯定有人不知道,知道也不知道啥原理,知道原理也不知道咋實現(xiàn),別笑了,說的就是你!

嗯。。。 還是自己百度吧,懶得解釋名詞。

別打我,說一下思路才是關(guān)鍵:

首先,二分查找法需要數(shù)組是一個有序的數(shù)組。

一、要知道中間位置就需要知道起始位置和結(jié)束位置,然后取出中間位置的值來和我們的值做對比。

二、如果中間位置的值等于我們的給定值,那恭喜你人品蠻好的。

二。如果中間值大于我們的給定值,說明我們的值在中間位置之前,此時需要再次二分,因為在中間之前,所以我們需要變的值是結(jié)束位置的值。

三。反之,如果中間值小于我們給定的值,那么說明給定值在中間位置之后,此時需要再次將后一部分的值進(jìn)行二分,因為在中間值之后,所以我們需要改變的值是開始位置的值。

思路很簡單,下面貼代碼:

erfen.php

先別急著吐槽我的命名,也不要急著夸我代碼寫的漂亮,先看下執(zhí)行結(jié)果:


是不是666?好開心呀?? 然后我又試了一下1,也順利的打印了結(jié)果,內(nèi)心更加澎湃了,再試試10。



開心了喝了口水回來一看,納尼?死循環(huán)了?!趕緊殺掉



接下來就是我糾結(jié)的心路歷程了,這也是為什么我決定寫這篇文章的原因(腦子銹脫完后可以嘲諷一下自己)。

起初分析原因時以為是向上取整和向下取整的問題,馬上把floor改成ceil,試了一下果然好了,然后試了一下查找1結(jié)果1死循環(huán)了,瞬間糾結(jié)到取整向上還是向下上。在小本本上算了半天。

后來經(jīng)過反復(fù)實驗和思考才發(fā)現(xiàn),問題出在最核心的點上,二分查找是找到數(shù)組中間的值與值進(jìn)行對比,我在實現(xiàn)過程中混淆了平常使用排序算法時的思路,忘記了已經(jīng)對比過的值是不需要再放到等待對比的隊列中去的,比如array(0,1),第一次取到的不論向上還是向下,肯定是0或者1,如果對比完我還用這個值作為start或者end,那肯定會陷入死循環(huán)中(可向上移步看最初代碼)。

下面貼上修改后的代碼:

妥妥的好使

一個簡單的算法,因為一時疏忽出了錯誤,也引發(fā)出一個小小的思考,以后寫的代碼一定要好好測試一下,如果剛剛錯誤的代碼跑到線上,那又是一個給系統(tǒng)埋下炸彈的死循環(huán),切記切記,好好測試(本篇核心價值觀)。

本篇謝幕。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容