【问题标题】:Why does inserting sequential elements in a tree require more time than inserting random elements into a tree?为什么在树中插入顺序元素比在树中插入随机元素需要更多时间?
【发布时间】:2013-06-06 23:53:23
【问题描述】:

这不是家庭作业 我正在学习数据结构课程,我们最近完成了树。下课时,我的教授展示了这张照片。

ConcreteBTree 是一棵不会自平衡的二叉树。我对完成这些程序所需的时间有几个疑问。

  1. 为什么将 100,000 个顺序元素插入到 ConcreteBTree 中比在其中插入随机元素花费的时间要长得多?我的直觉是,由于元素是连续的,因此它所花费的时间应该少于插入 1,000,000 个随机元素所花费的时间。

  2. 为什么带有随机元素的ConcreteBTree的insert()和find()时间如此接近?是因为两者的时间复杂度相同吗?我认为 insert 是 O(1) 而 find 是 O(n)

我真的很想了解这里发生了什么,任何解释都将不胜感激。谢谢

【问题讨论】:

  • 将顺序项插入非平衡树中几乎是您能做的最糟糕的事情。您最终将创建一个链表,因为您最终将始终仅使用左节点或仅使用右节点。

标签: c++ tree time-complexity


【解决方案1】:

Armin 回答了 Q1。

2.为什么带有随机元素的ConcreteBTree的insert()和find()的时间如此接近?是因为两者的时间复杂度相同吗?我认为 insert 是 O(1) 而 find 是 O(n)

insertfind 必须做同样的工作——它们沿着你放在一起的任何奇怪的树中寻找最后一个节点,在这个节点下,值要么被链接,要么将是(并且将在insert) 的情况下,因此它们执行相同数量的比较和节点遍历,花费相似的时间。

在平衡树中插入随机元素是 O(log2N)。您将随机值插入到不自动重新平衡的树中会有点但不会显着更糟,因为某些分支最终会比其他分支长得多 - 您可能会得到某种分支长度的钟形曲线。 insert 的唯一 O(1) 如果您已经知道要在其下完成插入的树中的节点(即通常需要上述查找步骤)。 find 的唯一 O(n) 如果必须访问树中的每个节点,这仅适用于病态不平衡树,有效地形成链表,正如您已经被告知可以通过插入生成预先排序的元素。

【讨论】:

    【解决方案2】:

    将顺序项(1,2,3,4...)插入二叉树将导致它始终将节点添加到同一侧(例如左侧)。 当您插入随机项目时,您将左右随机添加节点。

    顺序添加将导致列表表现为普通链表(对于顺序项),因为新项必须访问每个先前添加的项,这将花费 O(n) 步骤,当随机添加时它将花费 O (log N) 步平均。

    【讨论】:

    • 好的,谢谢。那么这是否意味着对于随机插入的元素,因为它们是随机的,所以树很有可能变得平衡,因为随机节点大于或小于其父节点的概率是 0.5?
    • 因为它们是随机的,所以树很有可能会变得平衡,是的,直到您开始删除和添加新项目。
    • 知道了,你能看一下图片,看看 ConcreteBTree 的 find() 是否匹配?我不明白如何找到 100,000 个随机元素的速度更快地找到 100 万个随机元素
    • @MauriceAbney 100.000 元素不是随机的。它们是按顺序添加的。他们只是随机搜索。 100 万个元素是随机添加的,随机搜索的速度要快得多。
    猜你喜欢
    • 2016-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2011-12-18
    • 1970-01-01
    相关资源
    最近更新 更多