我需要实现一个适合作为k -d 树的 B+ 树。作为对此的简短解释,k -d 树就像一棵二叉树,只是在它的节点处它有一个多值键,即具有多个值的键。它也将是 B+ 树,因为内部节点仅用于存储键的 1 个值,而实际数据存储在叶节点处。这是一个简短的图形解释:
我的叶节点有 2 个元素的空间,当我添加前 2 个时一切正常,直到我添加第三个并且我必须进行拆分。为此,由于我选择键的第一个值作为定义顺序的值,因此我取所有三个元素的中值,结果为 27,因此所有小于 27 的元素都向左移动,大于或等于向右走。
当我添加第 4 个元素时,由于 Tom 和 Linda 的年龄小于 27 岁,他们已经完成了一个叶节点,儿子添加 Dom 使节点再次分裂,但是这次我必须切换键的哪个值定义顺序是 Social安全号码。我再次取中间值,结果为 530,因此所有 SS 编号小于 530 的人都向左移动,依此类推。
结果是最终的k -d 树,其中某些键值作为内部节点的索引,而完整的键位于叶节点。
现在我的问题是,在解释了上下文之后,我该如何为键实现解决方案,因为我确实必须在叶节点存储完整的键,但在内部节点我只使用键的值之一.
您可以注意到与数据库的相似之处,其中我们有多个带值的字段,我们可以同时使用不同的字段对信息进行排序,一个比下一个更重要,依此类推。
我想用包含所有值的属性创建一个class
命名Key
或任何其他名称,对于上面的示例,它可以是int
年龄、int
SSNumber 和string
名称。但我的问题是,如果我的客户决定他想增加更多的价值,那么我的班级会越来越大。这是一个好的 OO 决定吗?我可以用另一种方式实现它并且仍然是 OO 吗?我知道我的想象力可能很差,但是由于我可以假设客户想要更多的值,我可以制作某种包含我的值的列表,那么这意味着我必须制作一个可以支持任何类型数据的列表,这不听起来不像是面向对象的方法。有任何想法吗?
另外我想补充一点,因为在我的树算法的某个时刻,我需要将键的 1 个属性用作树中的索引,所以我也必须支持这一点。
我真的很感激如何通过遵循 OO 方法来解决这个问题。