我想要使用btree来实现一些东西来使用可变长度键来索引一些数据,我希望树中的每个节点都看起来像这样,
struct key_block {
block_ptr parent; // link back up the tree to the parent
unsigned numkeys; // number of keys currently used by this block
struct {
block_ptr child; // points to the child immediately preceeding this key.
struct {
unsigned length; // how long this key is
unsigned offset; // where the data for this key is
} key; // support for variable length keys
data_ptr content; // ptr to the data indexed by this key
} entries[]; // as many entries as will fit on a disk block.
}; // the last entry will be followed by another block_ptr which is the right hand child of the last node.
我打算将实际的密钥数据存储在与节点本身相同的磁盘块中,位于最终密钥和节点内的右手子项之后。每个键中的偏移和长度字段将指示当前块的开始距离,每个键的实际数据开始的时间以及运行的时间。
但是,我想为我的存储使用固定大小的磁盘块,并且因为我想将可变长度密钥存储在与节点相同的块内,这意味着可以使用最大数量的密钥在一个节点中取决于该节点中密钥的长度。这种方式与我对btree通常工作方式的理解相矛盾,其中所有节点都有固定的最大条目数,而且我不确定是否可以使用btree来实现这一点,因为我违反了典型的不变量。 / p>
那么我是否应该考虑使用btree结构?如果没有,还有哪些其他替代方案可以进行非常快速的外部搜索,插入和删除?特别是,任何解决方案的关键标准必须是它具有高度可扩展性,可以支持非常大量的条目,并且仍然可以有效地进行搜索,插入和删除(并且btree在此方面表现得非常好)。
如果我仍然可以使用btree,当我不再拥有不变的最大键数时,算法将如何受到影响,而最大值取决于每个节点本身的内容?
答案 0 :(得分:3)
B树中可变数量的最大键没有根本问题。但是,B树确实依赖于每个节点中的一些最小和最大密钥数。如果每个节点有一个固定数量的密钥,那么这很容易(通常是N / 2到N个节点)。因为您允许变量编号,所以需要确定用于平衡树的启发式算法。启发式越好,性能越优化。
幸运的是,问题只是表现。 B树的形状有几个不变量,但它们都不受可变数量的键的影响,所以你仍然可以搜索。如果你选择一个糟糕的启发式,它可能是一个不平衡的结构。