mysql數據結構與算法(二分查找法及二叉查找樹)

 B+樹索引是最爲常見,也是在數據庫中使用最爲頻繁的一種索引。在瞭解索引以前先介紹與之密切相關的一些算法與數據庫結構,這有助於讀者更好的理解B+樹索引的工做方式。java

二分查找法

    二分查找法也稱爲折半查找法,用來查找一組有序記錄數組中某一項記錄,基本思想是將記錄按有序化排列(遞增遞減),查找過程採用跳躍方式查找,即先以有序數列的重點位置爲對比對象,若是要找的元素小於該中點元素,則將待查找序列縮小爲左半部分,不然右半部分。以下對五、十、1九、2一、3一、3七、4二、4八、50、52這10個數,要從中查找48這條記錄。算法

從上能夠看出3次就找到了48這個數,若是要是按順序查找則須要8次。所以二分查找法的效率(平均來講)比順序查找法要好。以下采用java遞歸方式完成二分查找算法數據庫

/** 
 * 遞歸方法實現二分查找法. 
 * @param Array數組 
 * @param low 數組第一位置 
 * @param high 最高 
 * @param key 要查找的值. 
 * @return 返回值. 
 */  
int BinSearch(int Array[],int low,int high,int key)  
{  
    if (low<=high)  
    {  
        int mid = (low+high)/2;  
        if(key == Array[mid])  
            return mid;  
        else if(key<Array[mid])  
            //移動low和high  
            return BinSearch(Array,low,mid-1,key);  
        else if(key>Array[mid])  
            return BinSearch(Array,mid+1,high,key);  
    }  
    else  
        return -1;  
}

二叉查找樹

定義

    二叉查找樹或者是一棵空樹,或者具備下列性質:數組

  • 若它的左子樹不爲空,則左子樹上全部結點的值均小於根結點的值;
  • 若它的右子樹不爲空,則右子樹上全部結點的值均大於根結點的值;
  • 它的左右子樹均爲二分查找樹。

插入操做

    如s指向待插入的結點,root指向二叉查找樹的根結點,則插入操做的步驟以下:學習

  • 若root爲空,則將s指向的結點做爲跟結點插入,不然執行(2)、(3);
  • 若s->data < root->data,則將s指向的結點插入到根結點的左子樹中;
  • 若s->data > root->data,則將s指向的結點插入到根結點的右子樹中。

    總結:二叉樹的構造就是經過不斷地插入新的元素。spa

查找操做

    在二叉查找樹中查找給定值k的查找過程以下:指針

  • 若root=NULL,則查找失敗;
  • 若root->data=k,則查找成功;
  • 若k <  root->data,則去root的左邊查找;
  • 若k > root->data,則去root的右邊查找。

    總結:若二叉查找樹接近平衡二叉樹,則其時間複雜度爲O(logn),若二叉查找樹是斜的(如插入是有序插入的狀況下),則其實際複雜度爲O(n),即退化爲線性表。code

刪除操做

    設p指向待刪除的結點,pre指向待刪除結點的父親,則刪除操做視以下狀況而定:對象

  • 若待刪除的結點是葉子結點,不妨設pre->right=p(即待刪除的結點爲其父親結點的右孩子),則直接刪除p,對應爲:pre->right=NULL,delete p;
  • 若待刪除的結點只有左子樹或右子樹,則只需將待刪除結點的父親與左孩子(或右孩子)鏈接起來,對應爲,不妨設pre->right=p,以待刪除結點僅有左子樹的狀況爲例(右子樹同理),對應爲:pre->right=p->left,delete p;
  • 若待刪除結點左右子樹則
    • 先找到待刪除結點的右子樹中的最小值(或左子樹中的最大值),對應的指針爲min,並記下min的父親結點爲min_pre;
    • 用min所指結值覆蓋待刪結點的值,對應爲:p->data=min->data;
    • 特殊狀況:若待刪除結點的右孩子無左子樹,也就是說待刪結點的右孩子就是右子樹的最大值,則直接鏈接便可,對應爲:p->right=min->right,delete min;遞歸

    •  

      通常狀況:若待刪除結點的右孩子有左子樹,則將min_pre所指結點的右孩子指向min所只結點的右孩子,對應爲:min_pre->right=min->right,delete min;

    總結:找到右子樹的最小值結點-->鏈接斷開結點-->對最小值結點的上下文作善後工做。

二叉查找樹遠不止這些內容,在這裏之是做爲一個引子,從此會對二叉查找樹進行詳細學習和描述。

相關文章
相關標籤/搜索