Data structures crit位树能否高效地存储一组无前缀的字符串空间?

Data structures crit位树能否高效地存储一组无前缀的字符串空间?,data-structures,trie,Data Structures,Trie,演示如何在每个节点上仅使用三个机器字实现一个:长度、左指针、右指针。但是,此编码仅对存储一组无前缀字符串有效;它不能对像{“a”、“aa”、“aaa”}这样的集合进行编码。是否有一种变体允许存储任何字符串集,同时保持节点较小 显然,任何字符串集都可以通过将其填充到相同的长度来释放前缀,但这会浪费空间,除非可以隐式完成,而且最长字符串的长度可能事先不知道。这里可以找到更好的crit位树描述:。在我看来,crit位树不限于一组没有前缀的字符串。你可以试试这个功能 unsigned int bit(s

演示如何在每个节点上仅使用三个机器字实现一个:长度、左指针、右指针。但是,此编码仅对存储一组无前缀字符串有效;它不能对像
{“a”、“aa”、“aaa”}
这样的集合进行编码。是否有一种变体允许存储任何字符串集,同时保持节点较小


显然,任何字符串集都可以通过将其填充到相同的长度来释放前缀,但这会浪费空间,除非可以隐式完成,而且最长字符串的长度可能事先不知道。

这里可以找到更好的crit位树描述:。在我看来,crit位树不限于一组没有前缀的字符串。你可以试试这个功能

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;
}

它来自卡丁车树:

这里可以找到更好的爆击比特树描述:。在我看来,crit位树不限于一组没有前缀的字符串。你可以试试这个功能

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;
}

它来自卡丁车树:

我知道临界位树不限于一组没有前缀的字符串。但我不知道的是如何表示一组无前缀的字符串,每个节点有3个单词。这个链接解释了吗?如果是这样的话,你能在你的答案中加入相关的部分吗?@TavianBarnes:也许你是说一棵卡丁车树?啊,看起来它会起作用的。实际上,我计划以稍微不同的方式进行隐式填充(通过添加10000…),但我缺少的是这个策略。谢谢我知道crit位树并不局限于一组没有前缀的字符串。但我不知道的是如何表示一组无前缀的字符串,每个节点有3个单词。这个链接解释了吗?如果是这样的话,你能在你的答案中加入相关的部分吗?@TavianBarnes:也许你是说一棵卡丁车树?啊,看起来它会起作用的。实际上,我计划以稍微不同的方式进行隐式填充(通过添加10000…),但我缺少的是这个策略。谢谢