我正在尝试用 java 重写一个 c++ patricia trie。C++ 代码来自这里
我有点卡住了。
所以这是我的理解:
#define ZEROTAB_SIZE 256
head->key = (char*)calloc(ZEROTAB_SIZE, 1);
我们为密钥创建了一个 256 位的数组,因此我们可以有一个最大长度为 32 个字符的字符串,每个字符用 8 位表示。我可以用java中的char数组来实现它吗?
template <class T>
int PatriciaTrie<T>::bit_get(PatriciaTrieKey bit_stream, int n) {
if (n < 0) return 2; // "pseudo-bit" with a value of 2.
int k = (n & 0x7);
return ( (*(bit_stream + (n >> 3))) >> k) & 0x1;
}
k 获取 n 的最后 7 位,我们移动到字符串的 n/8 字符(不完全是 n/8,因为向右移动会将任何低于 8 的内容删除为零)然后我们移动 bit_stream[n> 的值>3] 由 k 然后我们得到最后一位。如果我在 java 中使用数组,我可以将其重写为
return (bit_stream[n>>3] >> k) & 0x1;
?
template <class T>
int PatriciaTrie<T>::bit_first_different(PatriciaTrieKey k1, PatriciaTrieKey k2) {
if (!k1 || !k2)
return 0; // First bit is different!
int n = 0;
int d = 0;
while ( (k1[n] == k2[n]) &&
(k1[n] != 0) &&
(k2[n] != 0) )
n++;
while (bit_get(&k1[n], d) == bit_get(&k2[n], d))
d++;
return ((n << 3) + d);
}
现在这是令人困惑的地方,直到第二个while循环的第一部分看起来足够清晰,循环并检查有多少位相等且非零,但是我不确定第二个循环在做什么,我们获取地址两个键中的第一个位是否相等,如果它们相等,我们再次检查直到我们发现不相等的位?
主要是我不确定这里如何使用密钥的地址,但我也可能对 bit_get 类中的位移感到困惑。
我想对我的 java 类的 c++ 和 java 中的 trie 进行比较,并且我希望使实现尽可能相似。