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

问题描述

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

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

或者我不知道。什么是根据数组中的 16 个插槽检查 4 位的算法?

似乎可以在 16 个插槽中表示 4 位,但我只是不明白算法如何在不手动详细可视化每个步骤的情况下弄清楚如何读取这些。一定有什么等式什么的。

解决方法

您所描述的是 radix 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;
}