B-树 B+树定义与简单的操作

B-树 B+树定义与简单的操作


  1. B-树的定义


    节点的孩子节点的最大数称为阶用m表示


    所有的叶子节点在同一层,并且不带信息


    每个节点最多含有m颗子树,最多含有m-1个关键字


    根节点不是终端节点那么根节点至少有两个子树


    除根节点以外其他非叶子节点至少有m/2向上取整个子树


    每个非叶子节点的结构为:n,p0,k1,p1,k2,p2,k3,p3…kn,pn


    其中n为关键字个数 m/2-1 关键字大于等于ki小于ki+1,pn所指的关键字大于kn


/**
 * @Author JH
 * @CreateDate 18-5-31
 * @Description B-树实现
 */
class Node{
    int num;
    int []key;
    Node parent;
    Node []child;

    public Node(int m) {
        this.key = new int[m];
        this.child =new Node[m];
    }

    public Node(int num, int[] key, Node parent, Node[] child) {
        this.num = num;
        this.key = key;
        this.parent = parent;
        this.child = child;
    }
}
class Result{
    Node r;
    int i;
    int tag;
}
public class B_Tree {
    public Result B_TreeSearch(Node root,int k){
        Node p=root;
        Node q=null;
        Result r=new Result();
        int i=0;
        boolean find=false;
        while (p!=null&&!find){//没有找到k或者p不为空
            i=search(root,k);//返回k的位置
            if (k==p.key[i]&&find==false){
                find=true;
            }else{//q记录k应该插入的节点
                q=p;
                p=p.child[i];
            }
        }
        r.i=i;
        if (find){
           r.r=p;//查找成功则返回该节点
           r.tag=1;
        }else{//查找失败就返回k应该插入的节点的信息
            r.r=q;
            r.tag=0;
        }return r;
    }
    public  int search (Node root,int k){
        int i=0;//找到关键字k在root的关键字中的位置 使得key[i]<k<key[i+1]
        for(;i<root.num&&root.key[i+1]<=k;i++);
        return i;
    }
}
  • m阶B+树定义

    每个分支至多有m棵子树

    根节点没有子树或者至少有两颗

    除了根节点其他节点至少有m/2向上取整个子树

    有n棵子树的节点有n个关键字

    叶子节点包含全部关键字,以及只想相应记录的指针,而叶子节点按关键字大小顺序链接( 每个叶子节点可以看成是一个基本索引块,它的指针指向数据文件中的记录)

    所有分支节点(可以看成是索引的索引)中仅仅包含他的各个子节点中最大关键字以及指向子结点的指针

  • 你可能感兴趣的:(算法,每日算法)