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;

    总结:找到右子树的最小值结点-->链接断开结点-->对最小值结点的上下文作善后工做。

二叉查找树远不止这些内容,在这里之是做为一个引子,从此会对二叉查找树进行详细学习和描述。

相关文章
相关标签/搜索