【问题标题】:How searching a million keys organized as B-tree will need 114 comparisons?如何搜索以 B-tree 组织的一百万个键需要 114 次比较?
【发布时间】:2021-10-29 16:55:10
【问题描述】:

请解释如何进行 114 次比较。以下是从我的书中截取的屏幕截图(第 350 页,Data Structures Using C,第 2 版。Reema Thareja,牛津大学出版社)。我的理由是,在最坏的情况下,每个节点只有最少数量的子节点(即 5 个),所以我以 5 为基数取一百万的对数,结果为 9。因此,假设在树的每个级别,我们搜索最小数量的键(即 4 个),大约有 36 个比较,远不及 114。

考虑一种情况,在这种情况下,我们必须搜索未编入索引且 包含 n 个键值的未排序数据库。最坏情况运行 执行此操作的时间将是 O(n)。相反,如果数据 在数据库中用B树索引,同样的查找操作 将在 O(log n) 中运行。例如,在集合上搜索单个键 一百万个密钥最多需要 1,000,000 次比较。但如果 相同的数据用 10 阶的 B 树索引,然后只有 114 在最坏的情况下需要进行比较。

Page 350, Data Structures Using C, 2nd Ed. Reema Thareja, Oxford Univ. Press

【问题讨论】:

  • 我很快就会想出一个解决方案,但对于初学者来说,请尝试使用可视化工具来了解它是如何针对较少数量的键工作的。一旦你理解了它通常是小菜一碟。
  • 感谢Aritro,虽然我已经真诚地完成了所有与它相关的理论,例如每个节点中的最小键数,B树的属性等,但实际上我无法掌握它。期待你的答案。
  • 我假设键也有与之相关的值?

标签: database indexing data-structures tree b-tree


【解决方案1】:

最坏情况树在您正在搜索的路径上除了处的键数最少。

如果每个内部节点的大小在 [5,10) 范围内,那么在最坏的情况下,当大多数节点有 5 个键时,一棵拥有一百万个项目的树的深度约为 10 层。

然而,一个节点的最坏情况路径可能在每个节点中有 10 个键。该语句似乎假设您将在每个节点内进行线性搜索而不是二分搜索(我建议改为进行二分搜索),因此可能会导致大约 10*10 = 100 次比较。

如果仔细考虑细节,实际数字很可能是 114。

【讨论】:

  • 非常感谢马特花时间回答(我没想到会有任何答案,尤其是像你这样的贡献者提供的一个很好的答案)。它进一步激励了像我这样的数学菜鸟:-)
【解决方案2】:

(这不是对所提问题的回答,而是相关讨论。)

听起来像是教科书问题,而不是现实生活中的问题。

计数比较可能是判断内存树的最佳方法,但不适用于基于磁盘的数据集。

即便如此,“平均”比较次数(对于内存中的)或磁盘命中次数(对于基于磁盘的)很可能是要计算的指标。

(当然,计算最大数作为理解结构的有用练习是很好的。)

也许内存中搜索的最佳“树”是二叉树,但具有 3 路扇出。并在每个节点中使用 2 或 3 个元素保持树平衡。

对于基于磁盘的搜索——想想数据库——最佳的可能是一个 BTree,其块的大小取决于从磁盘读取的效率。当涉及到获取一行所花费的总时间时,可以在很短的时间内计算比较。

【讨论】:

    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2017-11-22
    • 2018-05-11
    • 2020-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多