在java中实现patricia trie 我试图用java重写C++帕特丽夏TIE。 C++代码来自
我有点卡住了 我的理解是:在java中实现patricia trie 我试图用java重写C++帕特丽夏TIE。 C++代码来自,java,c++,trie,radix,Java,C++,Trie,Radix,我有点卡住了 我的理解是: #define ZEROTAB_SIZE 256 head->key = (char*)calloc(ZEROTAB_SIZE, 1); 我们为密钥创建了一个256位的数组,这样我们就可以拥有一个最大长度为32个字符的字符串,每个字符用8位表示。我可以用java中的字符数组来实现这一点吗 template <class T> int PatriciaTrie<T>::bit_get(PatriciaTrieKey bit_stream,
#define ZEROTAB_SIZE 256
head->key = (char*)calloc(ZEROTAB_SIZE, 1);
我们为密钥创建了一个256位的数组,这样我们就可以拥有一个最大长度为32个字符的字符串,每个字符用8位表示。我可以用java中的字符数组来实现这一点吗
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;
}
?
模板
int PatriciaTrie::位首先不同(PatriciaTrieKey k1,PatriciaTrieKey k2){
如果(!k1 | |!k2)
返回0;//第一位不同!
int n=0;
int d=0;
而((k1[n]==k2[n])&&
(k1[n]!=0)&&
(k2[n]!=0)
n++;
while(bit_-get(&k1[n],d)==bit_-get(&k2[n],d))
d++;
返回((n)
我可以用java中的字符数组来实现这一点吗
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;
}
我的java有点生疏,但我相信char
是用java签名的,这意味着>
不会做你期望的事情。这是因为移动一个有符号的数字不会移动符号位,所以你真正想要的是>
操作符,或者只使用字节
类型,它是无符号的。我感觉到这s是各种各样的错误,所以请仔细检查
返回(位\u流[n>>3]>>k)&0x1
在C++或C++中,<代码> *(数组+k)< /C>只是编写<代码>数组[k] < /C>的另一种方式,因此您的翻译看起来正确。
基本上获取所需位所在的字节。>k
将所需位移动到最低有效位位置。最后,我们通过使用&0x1
屏蔽掉所有不感兴趣的位。这将根据位是否设置,给我们留下0或1的值
最后一个函数所做的是比较两个位字符串并返回两个字符串第一次不同的位位置。第一个循环本质上是第二个循环的优化版本,它不是逐位比较,而是检查整个字节
换句话说,它首先在每个字节上循环,并找到前2个不同的字节。然后它取下这2个不同的字节并在它们上循环,直到找到前2个不同的位。请注意,
bit\u get
函数在这种情况下永远不会收到大于7的n,因为我们知道字节中的某个地方存在差异。最后的位位置由两个循环的结果构成,如:(字节数*8)+字节数)
我不熟悉这个数据结构,但您对这个代码的理解有一些问题
首先,calloc
分配256个字节,而不是位。新字节[256]
在java中是可比的
其次,n&0x7
获取的是n
的三位,而不是七位。更清晰的编写方法是n/8
和n%8
,而不是n>>3
和n&7
,但如果编译器愚蠢,按位操作可能会稍微快一点
您认为(比特流[n>>3]>>k)&1
是相同的,这是正确的
现在,bit\u first\u different
中的第一个循环在字节上循环,而不是在位上循环。检查0是为了防止从键的末尾跑出来。一旦该循环终止,n
指的是第一个不同的字节。然后第二个循环寻找不同的位
请注意,如果两个关键点没有不同,则第二个循环可能会从关键点的末端运行,从而可能导致分段错误
现在,&正在获取k1[n]
的地址,因为bit\u get
函数需要一个指向字符的指针……这将传入位流的n
第个元素。在循环之后,d
是k[n]
的第一个不同位的偏移量
最后,代码将
n
(哪个字节?)与d
(该字节中的哪个位?)结合起来给出位。为了清晰起见,我再次主张8*n+d
,但这是一个品味问题。calloc(256,1)为256个元素分配内存,每个元素的大小为1字节。字节,而不是位。A是一个trie变量。bit\u first\u different
函数可能用于在插入和查找期间查找键从树上掉落的位置。即使假定两个键不同,我至少会添加一条注释,说明前提条件。
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);
}