【问题标题】:Linked List Insertion vs. BST Insertion Time Costs链表插入与 BST 插入时间成本
【发布时间】:2016-12-24 18:18:14
【问题描述】:

在链表中,插入是 O(1),因为我们假设我们已经知道要插入的位置。在二叉搜索树中,插入是 O(logN),因为我们必须在插入之前找到插入的位置(但是,实际的插入过程应该是常数时间)。为什么在 LinkedList 的情况下我们假设我们已经有了位置,而在 BST 中我们假设我们必须遍历节点才能找到插入位置(导致时间复杂度为 O(logN)?

【问题讨论】:

  • 我们在哪里假设它(以及“我们”是谁)?如果我们假设我们知道新元素应该去哪里,我们就知道了。如果我们不这样做,我们就不会。这不是一个真正的编程/计算机科学问题。

标签: algorithm data-structures linked-list binary-search-tree


【解决方案1】:

在考虑插入到链表时,主要假设链表没有在插入过程中应该保持的顺序。 (即列表的元素没有以某种方式排序)因此,插入的成本被认为是可以实现的最便宜的。毕竟,我们,正如你所说,一旦我们完成插入,就不关心元素是如何排序的。本着这种精神,只需将新节点添加到列表的头部即可,并且该操作具有 O(1) 时间复杂度,正如您所说的那样。

然而,在二叉搜索树 (BST) 中,数据结构具有预定义的顺序。因此,当我们谈论插入时,插入的 where 由 BST 本身的定义定义。

请注意,插入 BST 的复杂度取决于树的平衡程度,插入不平衡的 BST 的平均时间复杂度可能与 O(logN) 不同。 (有关解释,请参阅here)但是,就您的问题范围而言,BST 的平衡程度并不重要。关键概念是复杂性的差异是 BST 定义强制执行顺序的结果。

因此,对于具有 N 个节点的 BST,需要超过 O(1) 时间才能找到定义中指定的由树结构指定的特定位置 BST 的。而在通用链表的定义中,没有关于各个元素的内部结构的特定条件。因此,除非我们谈论的是一个以某种方式排序的列表,或者我们被指定必须插入到列表的尾部(并且只有一个指向头部的指针),否则插入新节点的任何位置都被视为在链表中是可以接受的,至少在分析链表数据结构的性能时是这样。

【讨论】:

    【解决方案2】:

    如果树是平衡的,在 BST 中找到一个点只需要 O(log N) 时间,如果我们保持树平衡,那么插入操作 需要 O(log N ) 时间,即使您知道在哪里插入。

    所以...对于一个实际的 BST,如红黑树或 AVL 树,我们可以说插入需要 O(log N) 时间,不管我们是否包括成本寻找插入的地方。

    对于链表,您需要具体 - 在开头或结尾插入 O(1) 时间,或者在您已经有指针的节点之后插入,或者如果您必须扫描则需要 O(N) 时间列表找到一个位置。我们不假设我们已经知道位置,我们确定我们实际感兴趣的操作的复杂性。

    在现实生活中,扫描链表来查找插入位置通常不是一个好主意,因为它需要 O(N) 时间。我们只是不这样做,所以我们不谈论它。链表的适当用例几乎总是涉及常量时间插入。

    【讨论】:

      【解决方案3】:

      你是在比较苹果和橙子。

      链表没有必要的顺序。您可能希望按照自己的标准对列表进行排序。如果您不关心顺序(只插入到前面),或者如果您关心顺序并且已经有一个指向插入位置的指针(这很常见,例如我们有一个文本对象中的行,以及指向当前光标位置的指针。用户按下粘贴,我们插入行)。

      使用 BST,元素按顺序保存,您必须为它们定义排序。插入总是 O(log N),因为您在插入位置进行搜索。由于树是大致平衡的,每个节点的一半叶子是左孩子,一半是右孩子,所以我们很快就到了叶子插入点。

      【讨论】:

        【解决方案4】:

        二叉搜索树背后的基本思想是拥有这样一个存储库,它提供了数据排序、搜索和检索的有效方式。 在 BST 中搜索具有O(h) worst-case run time 复杂性,其中h 是给定树的height。具有 n 个节点的二叉搜索树具有最少的 O(log n) 级别,至少需要 O(log n) 比较才能找到要插入的特定位置。不幸的是,二叉搜索树可以退化为链表,从而将搜索时间减少到O(n)。 在链表中,如果你不关心任何顺序,你可以在O(1) time中插入元素,但是如果你正在遍历一个不是好主意的链表,那么就需要o(n) time

        【讨论】:

        • (反引号更常用于 sn-ps 引用或代码 sn-ps - 我会选择 斜体 使部分文本突出。(当你编辑:retriving 中有一个错字(无论如何,检索可能更合适),并且 _linked lis_t 中的装饰已损坏。)您很可能不打算在最后使用“small o”。)
        • 感谢您的建议。
        猜你喜欢
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        • 1970-01-01
        • 2015-10-20
        • 1970-01-01
        • 2010-12-28
        • 2017-06-14
        • 1970-01-01
        相关资源
        最近更新 更多