查找 算法

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樹的差別在於:

  • 有k個子結點的結點必然有k個關鍵碼;
  • 非葉結點僅具備索引做用,跟記錄有關的信息均存放在葉結點中。
  • 樹的全部葉結點構成一個有序鏈表,能夠按照關鍵碼排序的次序遍歷所有記錄



分塊查找

算法思想:將n個數據元素"按塊有序"劃分爲m塊(m ≤ n)。每一塊中的結點沒必要有序,但塊與塊之間必須"按塊有序";即第1塊中任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字;而第2塊中任一元素又都必須小於第3塊中的任一元素,……
算法流程:
  step1 先選取各塊中的最大關鍵字構成一個索引表;
  step2 查找分兩個部分:先對索引表進行二分查找或順序查找,以肯定待查記錄在哪一塊中;而後,在已肯定的塊中用順序法進行查找。


哈希表查找

總的來講,"直接定址"與"解決衝突"是哈希表的兩大特色。


什麼是哈希函數?

  哈希函數的規則是:經過某種轉換關係,使關鍵字適度的分散到指定大小的的順序結構中,越分散,則之後查找的時間複雜度越小,空間複雜度越高。


哈希表是一個在時間和空間上作出權衡的經典例子。若是沒有內存限制,那麼能夠直接將鍵做爲數組的索引。那麼全部的查找時間複雜度爲O(1);若是沒有時間限制,那麼咱們可使用無序數組並進行順序查找,這樣只須要不多的內存。哈希表使用了適度的時間和空間來在這兩個極端之間找到了平衡。只須要調整哈希函數算法便可在時間和空間上作出取捨。


Hash是一種典型以空間換時間的算法,好比原來一個長度爲100的數組,對其查找,只須要遍歷且匹配相應記錄便可,從空間複雜度上來看,假如數組存儲的是byte類型數據,那麼該數組佔用100byte空間。如今咱們採用Hash算法,咱們前面說的Hash必須有一個規則,約束鍵與存儲位置的關係,那麼就須要一個固定長度的hash表,此時,仍然是100byte的數組,假設咱們須要的100byte用來記錄鍵與位置的關係,那麼總的空間爲200byte,並且用於記錄規則的表大小會根據規則,大小多是不定的。

相關文章
相關標籤/搜索