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

C++ 为什么在树中插入顺序元素比在树中插入随机元素需要更多的时间?,c++,tree,time-complexity,C++,Tree,Time Complexity,这不是家庭作业,我正在上数据结构课,我们最近完成了树。在课程结束时,我的教授展示了这张图片。 ConcreteBTree是一种不自平衡的二叉树。我有一些关于完成这些程序所需时间的问题 为什么将100000个连续元素插入ConcreteBTree比将随机元素插入ConcreteBTree要花这么多时间?我的直觉是,由于元素是连续的,所以插入1000000个随机元素所需的时间应该少于插入1000000个随机元素所需的时间 为什么包含随机元素的混凝土树的insert()和find()的时间如此接近?

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

ConcreteBTree是一种不自平衡的二叉树。我有一些关于完成这些程序所需时间的问题

  • 为什么将100000个连续元素插入ConcreteBTree比将随机元素插入ConcreteBTree要花这么多时间?我的直觉是,由于元素是连续的,所以插入1000000个随机元素所需的时间应该少于插入1000000个随机元素所需的时间

  • 为什么包含随机元素的混凝土树的insert()和find()的时间如此接近?是因为两者具有相同的时间复杂性吗?我以为insert是O(1),find是O(n)

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

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

    按顺序添加将使列表表现为普通的链表(对于按顺序添加的项目),因为新项目必须访问以前添加的每个项目,这将需要O(n)个步骤,而随机添加时,平均需要O(logn)个步骤。

    Armin的回答Q1

    2.为什么包含随机元素的混凝土树的insert()和find()的时间如此接近?是因为两者具有相同的时间复杂性吗?我以为insert是O(1),find是O(n)

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


    平衡树中随机元素的插入为O(log2N)。你将随机值插入到一个没有自我再平衡的树中会有点糟糕,但不会太糟糕,因为有些分支最终会比其他分支长很多——你可能会得到某种分支长度的钟形曲线<如果您已经知道树中要在其下进行插入的节点(即通常需要上面的查找步骤),则代码>插入仅为O(1)<如果必须访问树中的每个节点,代码>查找是唯一的O(n),这只是病态不平衡树的情况,有效地形成了一个链表,正如你已经被告知的那样,你可以通过插入预排序的元素来生成链表。

    将顺序项插入到非平衡树中几乎是你能做的最糟糕的事情。实际上,您最终将创建一个链表,因为您将始终只使用左侧节点或右侧节点。好的,谢谢。那么这是否意味着对于随机插入的元素,由于它们是随机的,所以树很有可能变得平衡,因为随机节点大于或小于其父节点的概率是。5?因为它们是随机的,所以树很有可能变得平衡,是的,在你开始删除和添加新项目之前。明白了,你能看看图片,看看ConcreteBTree的find()是否匹配吗?我不明白你怎么能找到一百万个随机元素,比找到100000个随机元素快得多elements@MauriceAbney100000个元素不是随机的。它们是按顺序添加的。他们只是随机搜查的。100万个元素被随机添加,并且被随机搜索的速度要快得多。