微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何将数组索引整数存储为 B+树中的键?

如何解决如何将数组索引整数存储为 B+树中的键?

我在 GitHub 上查看了 JavaScript 中 B+tree 的每个示例,并尝试了 simplifying one down to semi-readable code 中的 this。但是我还是不明白每个内部节点的keys数组的结构是什么。钥匙是什么样子的?你如何在 get/insert/remove 算法中使用它们?专门针对这个问题,我想把 B+tree 当作一个来自外部的数组,或者一个排序列表。所以我希望“键”是一个整数(数组中项目的索引)。我该怎么做呢?什么是 JSON 演示示例,展示了在这种情况下简单 B+树的外观?

{
  type: 'tree',keys: [?],children: [
    {
      type: 'internal',children: [
        {
          type: 'leaf',value: { foo: '123' }
        },{
          type: 'leaf',value: { foo: '234' }
        }
      ]
    },{
      type: 'internal',value: { foo: '345' }
        },value: { foo: '456' }
        }
      ]
    }
  ]
}

这些钥匙还能做什么?我知道它们用于查找,不知何故,但是如何?

假设有 32 个内部节点,每个节点有 32 个内部节点,每个节点都有一堆叶子。内部节点的key是什么?

我想在 JavaScript 中实现一个健壮的 B+树,目前我很难理解 B+树的基础知识。

解决方法

所以我希望“键”是一个整数(数组中项目的索引)。我该怎么做?

不,你不能使用整个结构中项目的绝对索引作为键。这意味着在数组的前面插入/删除时,整个树中的所有节点都需要更新它们的索引。

相反,您需要存储子树的大小,以便在遍历树时可以将它们累积到相对索引中 - 您已经在 How to return the tree node by index when tree nodes have subtree size? 中完成了此操作。这些大小永远不会改变,除非节点本身(或其子节点之一)发生变化,因此您将始终只需要更新 O(log n) 节点。

在这种情况下,一个简单的 B+树会是什么样子的 JSON 演示示例是什么?

{ type: 'internal',// size: 8,// childSizes: [2,3,3],keys: [2,5],children: [
    { type: 'leaf',// size: 2
      // childSizes: [1,1]
      keys: [1],values: [ {…},{…} ]
    },{ type: 'leaf',// size: 3,// childSizes: [1,1,1],keys: [1,2],{…},{ type: 'internal',// size: 3
      // childSizes: [1,2]
      keys: [1],chilren: [
        { type: 'leaf',// size: 1
          // childSizes: [1]
          keys: [],values: [ {…} ]
        },// size: 2
          // childSizes: [1,1]
          keys: [1],{…} ]
        },]
    },]
}

如果每个节点在一个字段中只有它的 size 就足够了,但这需要将一个节点的所有子节点加载到内存中,仅用于累积大小以找到在查找中选择哪个子节点/插入/删除操作,因此通常不会完成。您可以将节点大小存储在其父节点中(如 childSizes)。或者您可能已经将累积的大小存储在 B+ 树的 keys 数组中,这样您就不需要在搜索过程中计算总和(但如果只有一个条目更改,则必须更新整个数组 -这是一个权衡)。与仅存储 k-1 子节点之间的 k“边界”键的经典 B+ 树不同,在最后一个节点中存储完整的总和(= 节点的大小)可能是一个好主意数组索引。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。