为什么在树中插入顺序元素比将随机元素插入树需要更多时间?

时间:2013-06-11 07:42:56

标签: c++ tree time-complexity

这不是家庭作业我正在上一个数据结构课,我们最近完成了树。课程结束时,我的教授展示了这张照片。 Tree Times

ConcreteBTree是一个不自平衡的二叉树。关于完成这些程序所花费的时间,我有几个问题。

  1. 为什么要在ConcreteBTree中插入100,000个连续元素所需的时间比插入随机元素要多得多?我的直觉是,因为元素是连续的,所以它应该比插入1,000,000个随机元素花费更少的时间。

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

  3. 我真的很想了解这里发生了什么,任何解释都会非常感激。感谢

2 个答案:

答案 0 :(得分:8)

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

顺序添加将导致列表表现为普通链表(对于顺序项),因为新项必须访问每个先前添加的项并且将采用O(n)步骤,当随机添加时将需要O (记录N)平均步数。

答案 1 :(得分:3)

阿明回答了Q1。

  

2.为什么ConcreteBTree的insert()和find()的时间与随机元素如此接近?是因为两者具有相同的时间复杂度吗?我认为插入是O(1)并且发现是O(n)

insertfind必须做同样的工作 - 它们会通过你放在一起的任何奇怪的树来寻找最后一个节点,在这个节点下,值是链接的,或者是将是insert)的情况,因此他们进行相同数量的比较和节点遍历,花费相似的时间。

在平衡树中插入随机元素是O(log 2 N)。您将随机值插入到不会自我重新平衡的树中会有点但不会显着恶化,因为某些分支最终会比其他分支长得多 - 您可能会获得某种分支长度的钟形曲线。 insert只有O(1),如果你已经知道要在其中完成插入的树中的节点(即通常需要找到上面的步骤)。 find只有O(n),如果必须访问树中的每个节点,这只是病态不平衡树的情况,有效地形成链表,因为你已经告诉过你可以生成通过插入预先排序的元素。