当前位置: 首页 > 知识库问答 >
问题:

如何实现一个具有一次读取4位的节点的二进制trie?

姬捷
2023-03-14

我试图找到一种方法,在某种意义上内联一个二进制trie。基本上,二进制trie为二进制数字中的每个插槽都有一个节点,在0上向左分支,在1上向右分支。你将如何构造这样你可以一次读取4位而不是1位?在每个trie节点中有16个插槽似乎是可能的,但我很难想象这将是什么样子;如何使用这种方法一次读取二进制输入,比如101010104位。会是什么样子?

[  left    , right   ,    left,  right  ,  left,   right   ...]
  (goto2)    (goto5)   (goto7)  (goto8)   (goto9), (goto10)

或者我不知道。什么是一个算法,将检查4位与16个插槽在一个数组?

似乎4位可以在16个槽中表示,但我只是不明白一个算法如何在没有手动详细可视化每一步的情况下找出如何读取这些数据。一定有什么方程式什么的。

共有1个答案

拓拔麒
2023-03-14

你描述的是一个基数trie基数16。通过从密钥中提取4位,您将得到一个0到15(含)之间的数字。您可以使用该数字索引到节点:

struct Node {
    Node *children[16];
    Value value;
};

Value *find(const char *key, int nkey, Node *node) {
    int i = 0;
    while(i < 2*nkey && node) {
        int digit = (key[i/2] >> (i%2==0 ? 0 : 4)) & 0xf;
        node = node->children[digit];
        ++i;
    }
    return node ? &node->value : 0;
}
 类似资料:
  • 我正在研究一种方法,使用二叉搜索树获取前一个节点。现在我想我明白了,但是我正在努力处理我的if语句。 说明如下:getPrevNode(BSTNode)方法应该在树中找到参数前面的节点。这是我正在使用的算法。 如果节点有左子节点,向下移动左子树以获得最大节点 •否则,如果节点有父节点,我们需要按如下方式向上移动树: •如果节点是正确的子节点,则返回其父节点 •如果节点是左边的子节点,则向上移动树,

  • 我想找到最有效的方法来检查二进制搜索树中最小值的节点。我现在不想用某种编程语言来做,我只想考虑最有效的算法。 对此你怎么看: 我的问题是我应该如何深入挖掘,直到我得到最后一个左节点。我也试着解释这些步骤。你认为那是做这件事的最好方法吗?

  • 您好,我正在尝试以的格式打印二进制搜索树的级别顺序。我目前正在使用队列来获取级别顺序,但很难获取父节点。可以处理队列吗?如果是这样的话,我该怎么做呢?如果不是的话,什么是更理想的方法?非常感谢。 例如,使用以下树: 级别0:(6,空) 一级:(5,6)(7,6)

  • 我们得到了一个有序线程的二叉树。这意味着,如果一个节点没有左子节点(右子节点),左线程(右线程)将从该节点链接到其索引前一个节点(索引后一个节点)。 你能帮我找到一个节点的父节点的伪代码或算法吗?例如(见下图),给定的节点是Q,父节点必须是I。(我们应该利用给定的想法,即二进制是有序线程) TMI:我实际上需要这个伪代码/算法来创建另一个算法,它将获得二叉树的后序继承者。

  • TypeScript 如何约束一个 interface ,其中的两个值为2选一, (不能都存在,也不能都不存在) 如下: 这个 interface 目前并不符合我的需求,我的需求是 name 或者 nickName 二选一,该如何改造?或者如何实现呢?