Javascript 如何实现具有一次读取4位的节点的二进制trie?
在某种意义上,我试图找到一种内联二进制trie的方法。基本上,二进制trie对于二进制数中的每个插槽都有一个节点,在0上向左分支,在1上向右分支。您如何构造它,以便一次可以读取4位而不是1位?在每个trie节点中有16个插槽似乎是可能的,但我很难想象这会是什么样子;如何使用这种方法一次读取二进制输入,如Javascript 如何实现具有一次读取4位的节点的二进制trie?,javascript,algorithm,data-structures,binary-tree,trie,Javascript,Algorithm,Data Structures,Binary Tree,Trie,在某种意义上,我试图找到一种内联二进制trie的方法。基本上,二进制trie对于二进制数中的每个插槽都有一个节点,在0上向左分支,在1上向右分支。您如何构造它,以便一次可以读取4位而不是1位?在每个trie节点中有16个插槽似乎是可能的,但我很难想象这会是什么样子;如何使用这种方法一次读取二进制输入,如101010104位。它看起来像什么 [ left , right , left, right , left, right ...] (goto2) (g
10101010
4位。它看起来像什么
[ left , right , left, right , left, right ...]
(goto2) (goto5) (goto7) (goto8) (goto9), (goto10)
或者我不知道。什么是一种算法,可以根据阵列中的16个插槽检查4位
似乎4位可以在16个插槽中表示,但我不明白一个算法如何在不手动查看每一步细节的情况下理解如何读取这些数据。一定有个方程式或什么的。你描述的是基数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;
}
struct节点{
节点*子节点[16];
价值观;
};
值*查找(常量字符*键,整数nkey,节点*节点){
int i=0;
while(i<2*nkey&&node){
整数位数=(键[i/2]>>(i%2==0?0:4))&0xf;
节点=节点->子节点[位数];
++一,;
}
返回节点?&节点->值:0;
}
@LancePollard:不,代码很琐碎。我是吗?代码对我来说不是微不足道的:)那么在这种情况下nkey
是4?另外,我的密钥是一个整数,那么我该怎么做?为什么将键[i/2]
除以i
?为什么0:4
换档?另外,我的密钥是一个整数,那么我该怎么办?@LancePollard:看起来不错,只是它是I<2*nkey
。如果是32位整数,则迭代8次并使用(key>>(4*i))&0xf
提取位。只需为插槽索引获取(input>>level*4)&0xf
?