【问题标题】:Time required to list off keys in a B-tree in sorted order?按排序顺序列出 B 树中的键所需的时间?
【发布时间】:2013-06-13 18:29:31
【问题描述】:

我想对一个长列表进行排序,所以我将所有元素放入 B-tree 中(每个元素需要 O(log n) 时间来插入)。

排序后,我需要回读元素。

你知道读取B树中所有对象需要多长时间吗?

谢谢!

【问题讨论】:

  • 您可以在线性时间内将元素放入 B 树中。您不能插入日志时间。无论如何,排序需要 nlog(n) 时间,而有序遍历(这就是你所追求的)需要线性时间。最好的办法是使用list.sort() 并打印结果
  • 单次插入不是 O(log n)) 吗?因此创建整个 b-tree 将是 O(n log n),这与 Python 内置排序的时间复杂度相同。
  • 是的,我在写的时候就想到了这个。

标签: algorithm sorting data-structures big-o b-tree


【解决方案1】:

您可以通过使用中序遍历的修改,在时间 O(n) 中以排序顺序遍历 B 树中的所有元素。您可以按以下方式递归执行此操作:

To list off all elements of tree T in sorted order:
    Let the children of T be C0, C1, C2, ... Cn
    Let the keys of T be K1, K2, ..., Kn

    Output C0
    For i from 1 to n:
       Output Ki
       Recursively list all elements of Ci in order.

这需要时间 O(n),因为每个键只被访问一次。 (作为一个有趣的练习,尝试将其与标准中序遍历的工作原理进行比较!)由于从未排序的数据构建 B 树需要时间 O(n log n),因此该排序算法需要时间 O(n log n)。您可以将其视为对 tree sort 的修改,它使用 B-tree 而不是 BST。

如果 B-tree 存储在磁盘上,这并没有很好的缓存性能。最好使用 B+ tree,它专门用于优化中序遍历和范围搜索。

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-01
    • 2016-03-20
    • 1970-01-01
    相关资源
    最近更新 更多