📜  m-WAY搜索树|设置1(搜索)

📅  最后修改于: 2021-04-29 17:18:57             🧑  作者: Mango

m路搜索树是多路树,是二叉树的通用版本,其中每个节点包含多个元素。在顺序为m的m-way树中,每个节点最多包含m-1个元素和m个子元素。

高度为h的m-Way搜索树的目标要求为O(h)no。插入/删除/检索操作的访问次数。因此,它确保高度h接近log_m(n +1)

高度为h的m-Way搜索树中的元素数范围从最小值h到最大值hm^{h} -1

n个元素的m-Way搜索树的范围从最小log_m(n + 1)到最大n

下图显示了一个5向搜索树的示例。观察每个节点最多有5个子节点,因此最多包含4个键。

m-Way树的节点结构如下:

struct node {
    int count;
    int value[MAX + 1];
    struct node* child[MAX + 1];
};
  • 这里, count表示特定节点具有的子代数
  • 存储在数组值中的节点的
  • 子节点的地址存储在数组中
  • MAX宏表示特定节点可以包含的最大值数

在m-Way搜索树中搜索:

  • 在m-Way搜索树中搜索关键字类似于二叉搜索树
  • 要在五向搜索树中搜索77(如图所示),我们从根开始,并从77> 76> 44> 18开始,移至第四子树
  • 在第四子树的根节点中,77 <80,因此我们移至该节点的第一子树。由于77在此子树的唯一节点中可用,因此我们声称已成功搜索77

// Searches value in the node
struct node* search(int val,
                    struct node* root,
                    int* pos)
{
  
    // if root is Null then return
    if (root == NULL)
        return NULL;
    else {
  
        // if node is found
        if (searchnode(val, root, pos))
            return root;
  
        // if not then search in child nodes
        else
            return search(val,
                          root->child[*pos],
                          pos);
    }
}
  
// Searches the node
int searchnode(int val,
               struct node* n,
               int* pos)
{
    // if val is less than node->value[1]
    if (val < n->value[1]) {
        *pos = 0;
        return 0;
    }
  
    // if the val is greater
    else {
        *pos = n->count;
  
        // check in the child array
        // for correct position
        while ((val < n->value[*pos])
               && *pos > 1)
            (*pos)--;
        if (val == n->value[*pos])
            return 1;
        else
            return 0;
    }
}

搜索():

  • 函数search()接收三个参数
  • 第一个参数是要搜索的值,第二个参数是要从中执行搜索的节点的地址,第三个参数是变量的地址,该变量的地址一旦找到就将用于存储该值的位置
  • 最初,检查条件是否正在搜索的节点的地址为NULL
  • 如果是,则仅返回一个NULL值
  • 否则,将调用一个函数searchnode() ,该函数实际上将搜索给定值
  • 如果搜索成功,则返回在其中找到该值的节点的地址
  • 如果搜索不成功,则对当前节点的子代对search()函数进行递归调用

searchnode():

  • 函数searchnode()接收三个参数
  • 第一个参数是要搜索的值
  • 第二个参数是要在其中执行搜索的节点的地址,第三个参数是一个指针pos ,它保存一个变量的地址,该变量的地址存储在一次找到的值的位置
  • 如果搜索失败,则此函数返回值0;如果搜索成功,则返回1。
  • 首先在此函数中检查要搜索的值是否小于节点的第一个值
  • 如果是,则表明该值在当前节点中不存在。因此,由于搜索失败,因此在pos指向的变量中分配了值0,并返回了0。