暴击位树能否有效地存储一组非无前缀的字符串 space?
Can a crit-bit tree store a non-prefix-free set of strings space-efficiently?
The standard description of a crit-bit tree 展示了如何实现一个只使用每个节点三个机器字:长度、左指针、右指针。但是,这种编码只对存储一组无前缀的字符串有效;它无法编码像 {"a", "aa", "aaa"}
这样的集合。是否有一种变体可以在保持节点较小的同时存储任意一组字符串?
显然,任何一组字符串都可以通过将它们填充到相同的长度来使其无前缀,但这会浪费 space 除非它可以隐式完成,并且最长字符串的长度可能不是提前知道。
可以在此处找到对暴击位树的更好描述:http://code.google.com/p/radixtree/。 IMO 暴击位树不限于一组无前缀的字符串。你可以试试这个功能
unsigned int bit(size_t pos, unsigned char const* k, size_t klen) {
if (pos/(CHAR_BIT+1)>=klen) return 0;
if (pos%(CHAR_BIT+1)==0) return 1;
return (((unsigned int)k[pos/(CHAR_BIT+1)])>>(CHAR_BIT-pos%(CHAR_BIT+1)))&(unsigned int)1;
}
来自卡丁车树:http://code.dogmap.org/kart/
The standard description of a crit-bit tree 展示了如何实现一个只使用每个节点三个机器字:长度、左指针、右指针。但是,这种编码只对存储一组无前缀的字符串有效;它无法编码像 {"a", "aa", "aaa"}
这样的集合。是否有一种变体可以在保持节点较小的同时存储任意一组字符串?
显然,任何一组字符串都可以通过将它们填充到相同的长度来使其无前缀,但这会浪费 space 除非它可以隐式完成,并且最长字符串的长度可能不是提前知道。
可以在此处找到对暴击位树的更好描述:http://code.google.com/p/radixtree/。 IMO 暴击位树不限于一组无前缀的字符串。你可以试试这个功能
unsigned int bit(size_t pos, unsigned char const* k, size_t klen) {
if (pos/(CHAR_BIT+1)>=klen) return 0;
if (pos%(CHAR_BIT+1)==0) return 1;
return (((unsigned int)k[pos/(CHAR_BIT+1)])>>(CHAR_BIT-pos%(CHAR_BIT+1)))&(unsigned int)1;
}
来自卡丁车树:http://code.dogmap.org/kart/