1.順序查找(不在討論)node
2.二分查找,插值查找,斐波那契查找算法
3.樹表查找數組
4.分塊查找ide
5.哈希查找函數
public function BinarySearch($a=array(),$val,$n){性能
$low=0;this
$high = $n-1;編碼
$mid = 0;排序
while($low<=$high){索引
$mid = ($low+$high)/2;
if($a[$mid]===$value)
return mid;
if($a[mid] >$value)
$high = $mid – 1;
if($a[mid]<$value)
$low = $mid+1
}
return false;
}
插值查找(基於二分查找,對於查找點能夠改進)
基本思想:基於二分查找算法,將查找點的選擇改進爲自適應選擇,能夠提升查找效率。固然,差值查找也屬於有序查找。
注:對於表長較大,而關鍵字分佈又比較均勻的查找表來講,插值查找算法的平均性能比折半查找要好的多。反之,數組中若是分佈很是不均勻,那麼插值查找未必是很合適的選擇。
複雜度分析:查找成功或者失敗的時間複雜度均爲O(log2(log2n))。
public function InsertSearch($a=array(),$value,$low,$high){
$mid = $low+($value-$a[low])/($a[$high]-$a[low])*($high-$low);
if($a[$mid]===$value)
return mid;
if($a[mid] >$value)
InsertSearch($a,$value,$low,$mid-1);
if($a[mid]<=$value)
InsertSearch($a,$value,$mid+1,$high);
}
基本思想:也是二分查找的一種提高算法,經過運用黃金比例的概念在數列中選擇查找點進行查找,提升查找效率。一樣地,斐波那契查找也屬於一種有序查找算法。
構建斐波那契數組
private $max_size = 20;
private function Fibonacci(){
$F[0] = 1;
$F[1] = 1;
for($i =2;$i<$this->max_size;==i){
$F[$i] = $[$-1]+$F[$i-2];
}
return $F;
}
public function FibonacciSearch($a=array(),$n,$key){
$low = 0;
$high = $n-1;
$F=$this->Fibonacci();
$k = 0;
while(n>F[k]-1)
++k;
//將數組a擴展到F[k]-1的長度
$temp;
for($i = $n;$i<F[k]-1;++i){
$temp[$i] = $a[$n-1];
}
while($low<=$high){
$mid = $low + F[k-1] –1;
if($key<$temp[$mid]){
$high = $mid-1;
$k-=1;
}
else if($key>$temp[$mid]){
$low = $mid+1;
$k-=2;
}else{
if($mid<n)
return $mid;
else
return n-1;
}
}
unset($temp);
}
樹表查找
理解樹表結構便可
二叉查找樹,
基本思想:二叉查找樹是先對待查找的數據進行生成樹,確保樹的左分支的值小於右分支的值,而後在就行和每一個節點的父節點比較大小,查找最適合的範圍。 這個算法的查找效率很高,可是若是使用這種查找方法要首先建立樹。
平衡查找樹之2-3查找樹
紅黑樹
基本思想:紅黑樹的思想就是對2-3查找樹進行編碼,尤爲是對2-3查找樹中的3-nodes節點添加額外的信息。紅黑樹中將節點之間的連接分爲兩種不一樣類型,紅色連接,他用來連接兩個2-nodes節點來表示一個3-nodes節點。黑色連接用來連接普通的2-3節點。特別的,使用紅色連接的兩個2-nodes來表示一個3-nodes節點,而且向左傾斜,即一個2-node是另外一個2-node的左子節點。這種作法的好處是查找的時候不用作任何修改,和普通的二叉查找樹相同。
B樹和B+樹
B樹能夠看做是對2-3查找樹的一種擴展,即他容許每一個節點有M-1個子節點。
B+樹是對B樹的一種變形樹,它與B樹的差別在於:
分塊查找
算法思想:將n個數據元素"按塊有序"劃分爲m塊(m ≤ n)。每一塊中的結點沒必要有序,但塊與塊之間必須"按塊有序";即第1塊中任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字;而第2塊中任一元素又都必須小於第3塊中的任一元素,……
算法流程:
step1 先選取各塊中的最大關鍵字構成一個索引表;
step2 查找分兩個部分:先對索引表進行二分查找或順序查找,以肯定待查記錄在哪一塊中;而後,在已肯定的塊中用順序法進行查找。
哈希表查找
總的來講,"直接定址"與"解決衝突"是哈希表的兩大特色。
什麼是哈希函數?
哈希函數的規則是:經過某種轉換關係,使關鍵字適度的分散到指定大小的的順序結構中,越分散,則之後查找的時間複雜度越小,空間複雜度越高。
哈希表是一個在時間和空間上作出權衡的經典例子。若是沒有內存限制,那麼能夠直接將鍵做爲數組的索引。那麼全部的查找時間複雜度爲O(1);若是沒有時間限制,那麼咱們可使用無序數組並進行順序查找,這樣只須要不多的內存。哈希表使用了適度的時間和空間來在這兩個極端之間找到了平衡。只須要調整哈希函數算法便可在時間和空間上作出取捨。
Hash是一種典型以空間換時間的算法,好比原來一個長度爲100的數組,對其查找,只須要遍歷且匹配相應記錄便可,從空間複雜度上來看,假如數組存儲的是byte類型數據,那麼該數組佔用100byte空間。如今咱們採用Hash算法,咱們前面說的Hash必須有一個規則,約束鍵與存儲位置的關係,那麼就須要一個固定長度的hash表,此時,仍然是100byte的數組,假設咱們須要的100byte用來記錄鍵與位置的關係,那麼總的空間爲200byte,並且用於記錄規則的表大小會根據規則,大小多是不定的。