暴击位树能否有效地存储一组非无前缀的字符串 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/