许多b +树示例是使用整数键实现的,但是我已经看到了使用整数键和字符串键的其他一些示例,我学习了b +树基础,但我不明白字符串键是如何工作的?
答案 0 :(得分:2)
我也使用多级B树。有一个字符串让我们说test可以看作是[t,e,s,t]的数组。现在想想一棵树。每个节点只能为某个位置保留一个字符。您还需要考虑某个键/值数组实现,如不断增长的数组,树或其他链接列表。它还可以使节点大小动态(字母数量有限)。
如果所有键都适合叶子,则将其存储在叶子中。如果叶子变大,您可以添加新节点。
现在,由于每个节点都知道它的字母和位置,您可以从叶子中的键中剥离这些字符,并在搜索时重新构建它们,或者如果您知道叶子+叶子中的位置。
如果您现在,在创建树之后,以特定格式编写树,您最终会进行字符串压缩,只存储每个字母组合(前缀)一次,即使它由1000个字符串共享。
简单压缩通常会导致正常文本(使用任何语言!)压缩1:10,内存压缩为1:4。此外,您还可以搜索任何给定的单词(您使用B + Tree的字典中的字符串。
这是一个可以使用多级的extrem。
数据库通常使用某个前缀树(前x个字符并将其余的存储在叶子中并在叶子中使用二进制搜索)。还有一些实现使用基于实际密度的变量前缀长度。所以最后它是特定于实现的,并且存在很多选项。
如果树应该有助于找到确切的字符串。通常添加长度并使用每个字符的低位散列都可以解决问题。例如,您可以生成长度不足的哈希值(8位)+ 4位* 6个字符= 32位 - >它是你的哈希码。或者您可以使用第一个,最后一个和中间字符。由于长度是最具选择性的长度之一,因此在搜索字符串时不会发现很多碰撞。
此解决方案非常适合查找特定字符串但会破坏字符串的自然顺序,因此您无法回答范围查询等。但是,对于搜索特定用户名/电子邮件或地址的时间,这些树将是超级的(但问题是为什么不使用散列图)。
答案 1 :(得分:0)
字符串键可以是指向字符串的指针(很可能)。
或者可以调整键的大小以适应大多数字符串。 64位保存8个字节的字符串,甚至16个字节的键都不太荒谬。
选择密钥实际上取决于您打算如何使用它。