【问题标题】:B+-Tree in Java [closed]Java中的B +树[关闭]
【发布时间】:2012-12-21 16:52:45
【问题描述】:

我想用 Java 创建一个简单的 B+-Tree 实现,我需要一些帮助。 我希望我的程序实现这些功能:搜索、插入、删除。

我的问题:

  1. 用来表示树的最佳数据结构是什么?我曾是 思考 TreeMap。
  2. 在 B+-Tree 中,数据单独存储在叶子中 节点(K,V)和内部节点而不是每条记录中的数据 有一个指向子节点(K,P)的指针。我想要一个建议 关于如何指向另一个节点,因为我不能在 java 中使用指针。

另外,如果您有任何建议,或者您想到了一个可以用作参考的简单实现,请告诉我。

谢谢

【问题讨论】:

    标签: java b-tree


    【解决方案1】:

    B 树(或任何存在的小变体)的全部意义在于将数据存储在磁盘上,以便可以通过少量磁盘访问来读取数据。如果您要将所有内容都保存在内存中,则应该使用平衡二叉搜索树(可能是红黑树或展开树),甚至是香草 BST,但您的问题似乎都没有考虑到这一事实。

    1. 用来表示树的最佳数据结构是什么?我在想 TreeMap。

    TreeMap 是一种内存数据结构,因此尚不清楚这将如何帮助表示磁盘上的树。此外,这为您实现了一个二叉搜索树,因此如果您使用 TreeMap,您并没有真正实现 B-tree。

    1. 在 B+-Tree 中,数据仅存储在叶节点 (K,V) 中,内部节点而不是每个记录中的数据都有一个指向子节点 (K,P) 的指针。我想要一个关于如何指向另一个节点的建议,因为我不能在 java 中使用指针。

    您不需要实际的指针来表示 B 树,只需要文件偏移量。您需要定义一种表示这些偏移量的方法(从文件开头开始的字节数或块数,具体取决于实现的其余部分的结构)并根据文件偏移量访问所有内容。事实上,您应该使用标准 C 风格的指针来指向 B+-树中的节点之间。如果你这样做了,那么下次程序启动时这些指针将毫无意义,因此你将失去磁盘数据结构的持久性优势。

    为了干净地访问文件内容,我推荐memory mapping。在 Java 中创建内存映射文件对象的一种有用方法是FileChannel.map。该方法返回一个MappedByteBuffer,您可以使用它来读取特定文件偏移量处的一大块字节。

    【讨论】:

    • 首先感谢您的回答!关于我正在考虑使用可序列化的树的存储。另外关于数据结构,因为 TreeMap 不是我想要的,你有什么数据结构可以建议吗?或者你认为如果我创建一个自己的 Node 类会更好?
    • @sijoune 您对性能有多关心?如果您关心,您可能不应该使用Serializable 或创建自己的 Node 类。您应该将每个块视为 N 字节项的数组(您定义 N),并直接操作每个项。如果您序列化一个 Java 对象,很多额外的信息会与对象数据一起保存,并且您无法确定每个对象在磁盘上的大小。如果您甚至不知道每个对象的大小,您就不知道一个页面可以容纳多少个对象,性能就会下降。
    猜你喜欢
    • 2011-07-21
    • 2012-12-12
    • 2015-02-25
    • 2014-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-04
    相关资源
    最近更新 更多