PHP二分法查找,MYSQL索引即为用了此查找
生活随笔
收集整理的這篇文章主要介紹了
PHP二分法查找,MYSQL索引即为用了此查找
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
算法:當(dāng)數(shù)據(jù)量很大適宜采用該方法。采用二分法查找時,數(shù)據(jù)需是排好序的。主要思想是:(設(shè)查找的數(shù)組區(qū)間為array[low, high])
(1)確定該區(qū)間的中間位置K
(2)將查找的值T與array[k]比較。若相等,查找成功返回此位置;否則確定新的查找區(qū)域,繼續(xù)二分查找。區(qū)域確定如下:a.array[k]>T 由數(shù)組的有序性可知array[k,k+1,……,high]>T;故新的區(qū)間為array[low,……,K-1]b.array[k]<T 類似上面查找區(qū)間為array[k+1,……,high]。每一次查找與中間值比較,可以確定是否查找成功,不成功當(dāng)前查找區(qū)間縮小一半,遞歸找,即可。時間復(fù)雜度:O(log2n)。
比如說我有排序好的數(shù)組$arr = [1,5,7,8,10,34,35,70,90],我想找里面的$key70
判斷取所有值的長度,對半/2這里有9個數(shù)字/2這里是4.5,當(dāng)然數(shù)組里也沒有4.5的下標(biāo),我們可以強(qiáng)制轉(zhuǎn)為intval這里得到的是4為基數(shù)
我們拿$arr[4]也就是這里的10再和$key70進(jìn)行對比,發(fā)現(xiàn)10是比70小的,所以我們再把下標(biāo)剛剛的4再加1再查找,這樣的話,又縮小了一半的查詢,但如果你想找的$key小于10,只要把4減1可以查找
PHP寫法
/**
? ? ? * 二分查找
? ? ? * @param Array $arr 待查找的數(shù)組
? ? ? * @param Int $key 要查找的關(guān)鍵字
? ? ? * @return Int
? ? ? */
? ? function bin_search(Array $arr,$key)
? ? {
? ? ? ? $high = count($arr);
? ? ? ? if($high <= 0)
? ? ? ? ? ? return 0;
? ? ? ? $low = 0;
? ? ? ? while($low <= $high)
? ? ? ? {? ? ?
? ? ? ? ? ? //當(dāng)前查找區(qū)間arr[low..high]非空
? ? ? ? ? ? ? $mid=intval(($low + $high) / 2);
? ? ? ? ? ? if($arr[$mid] == $key)?
? ? ? ? ? ? ? ? return $mid; //查找成功返回
? ? ? ? ? ? if($arr[$mid] > $key)
? ? ? ? ? ? ? ? $high = $mid - 1; //繼續(xù)在arr[low..mid-1]中查找
? ? ? ? ? ? else
? ? ? ? ? ? ? ? $low = $mid + 1; //繼續(xù)在arr[mid+1..high]中查找
? ? ? ? }
? ? ? ? return 0; //當(dāng)low>high時表示查找區(qū)間為空,查找失敗
? ? }
? ? $arr = array(1,2,4,6,10,40,50,80,100,110);
? ? echo bin_search($arr,80);
? ? ? * 二分查找
? ? ? * @param Array $arr 待查找的數(shù)組
? ? ? * @param Int $key 要查找的關(guān)鍵字
? ? ? * @return Int
? ? ? */
? ? function bin_search(Array $arr,$key)
? ? {
? ? ? ? $high = count($arr);
? ? ? ? if($high <= 0)
? ? ? ? ? ? return 0;
? ? ? ? $low = 0;
? ? ? ? while($low <= $high)
? ? ? ? {? ? ?
? ? ? ? ? ? //當(dāng)前查找區(qū)間arr[low..high]非空
? ? ? ? ? ? ? $mid=intval(($low + $high) / 2);
? ? ? ? ? ? if($arr[$mid] == $key)?
? ? ? ? ? ? ? ? return $mid; //查找成功返回
? ? ? ? ? ? if($arr[$mid] > $key)
? ? ? ? ? ? ? ? $high = $mid - 1; //繼續(xù)在arr[low..mid-1]中查找
? ? ? ? ? ? else
? ? ? ? ? ? ? ? $low = $mid + 1; //繼續(xù)在arr[mid+1..high]中查找
? ? ? ? }
? ? ? ? return 0; //當(dāng)low>high時表示查找區(qū)間為空,查找失敗
? ? }
? ? $arr = array(1,2,4,6,10,40,50,80,100,110);
? ? echo bin_search($arr,80);
總結(jié)
以上是生活随笔為你收集整理的PHP二分法查找,MYSQL索引即为用了此查找的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Vidda&nbsp;海信&am
- 下一篇: 。。。。找不到题目