zoukankan      html  css  js  c++  java
  • 算法-搜索(5)m路搜索树


    动态m路搜索树即系统运行时可以动态调整保持较高搜索效率的最多m路的搜索树。
    以3路搜索树为例说明其关键码排序关系:
     
    const int MaxValue=9999;   
    template <class T>
    struct MtreeNode:public Mtree{
        int n;   //关键码个数  
        MtreeNode<T> *parent;
        T key[m+1];      //key[m]为监视哨兼单元,key[0]未使用
        MtreeNode<T> *ptr[m+1];  //子树结点指针数组,ptr[m]在插入溢出时使用
        int *recptr[m+1];  //每个索引项中指向数据区相应记录起始地址的指针
    };
    
    template <class T>
    struct Triple{     //搜索结果三元组定义
        MtreeNode<T> *r;
        int i;   //结点中关键码序号
        int tag;  //tag为0表示搜索成功,为1表示搜索失败
    };
    
    template <class T>
    class Mtree{
    protected:
        MtreeNode<T> *root;
        const int m;  //最大子树个数,等于树的度
    public:
        Triple<T> Search(const T&x);
    };
    
    template <class T>
    Triple<T> Mtree<T>::Search(const T& x){
        Triple result;   //记录搜索结果三元组
        GetNode(root);   //从磁盘上读取位于根root的结点
        MtreeNode<T> *p=root,*q=NULL;   //p是扫描指针,q用来记录p的父结点指针
        int i=0;
        while(p!=NULL){
            p->key[(p->n)+1]=MaxValue;
            while(p->key[i+1]<x) i++; //在结点内顺序搜索
            if(p->key[i+1]==x){
                result.r=p;result.i=i+1;result.tag=0;  //返回结果
                return result;
            }
            q=p;p=p->ptr[i];  //本结点无x,q记录当前结点,p下降到相应子树
            GetNode(p);       //从磁盘读取p结点
        }
        result.r=q;
        result.i=i+1;
        result.tag=1;
        return result;  //搜索失败,返回插入位置
    }
  • 相关阅读:
    模板驱动表单中的自定义表单验证
    kartikgridGridView导出excel变科学计数
    linux下安装vue-element-admin报错
    yii2运行流程
    nginx报错502 Bad Gateway
    linux下安装npm
    登录验证记录
    vue的store、vuex状态管理
    vue-cli3使用路由和循环引入路由
    vue使用问题汇总记录
  • 原文地址:https://www.cnblogs.com/yangyuliufeng/p/9237632.html
Copyright © 2011-2022 走看看