在链接列表中,插入是O(1),因为我们假设我们已经知道要插入的位置。在二叉搜索树中,插入是O(logN),因为我们必须在插入之前找到插入的位置(但是,实际插入过程应该是恒定时间)。为什么在LinkedList的情况下我们假设我们已经有了位置,而在BST中我们假设我们必须遍历节点以找到插入位置(导致时间复杂度为O(logN)?
答案 0 :(得分:4)
当考虑插入到链表时,主要假设列表没有在插入期间应该维护的顺序。 (即,列表的元素不以某种方式排序)因此,插入的成本被认为是可以实现的最便宜的。毕竟,我们,正如您所说的那样,在完成插入后,不关心元素的排序方式。本着这种精神,只需将新节点添加到列表的头部即可,并且该操作具有 O(1)时间复杂度,正如您所说的那样。
但是,在二叉搜索树(BST)中,数据结构具有预定义的顺序。因此,当我们讨论插入时,要插入的由BST本身的定义定义。
请注意,插入BST的复杂程度取决于树的平衡程度,插入不平衡BST的平均时间复杂度可能与 O(logN)不同。 (有关解释,请参阅here)但是,对于问题的范围,BST的平衡程度并不相关。关键概念是复杂性的差异是BST定义强制执行命令的结果。
因此,对于具有N个节点的BST,需要超过 O(1)时间才能找到定义中指定的特定位置由树结构指定BST。而在通用链表的定义中,没有关于各个元素的内部结构的这种特定条件。因此,除非我们讨论以某种方式排序的列表或者我们指定我们必须插入列表的尾部(并且只有指向头部的指针),否则任何插入新节点的位置都被视为在链表中是可以接受的,至少在分析链表数据结构的性能时是这样。
答案 1 :(得分:3)
如果树是平衡的,在BST中查找一个点只需要O(log N)时间,如果我们保持树平衡,那么插入操作也需要O(log N) )时间,即使你知道在哪里插入。
所以...对于实际的BST,比如红黑树或AVL树,我们可以说插入需要O(log N)时间,并且我们是否包含成本并不重要寻找插入的地方。
对于链接列表,您需要具体 - 在开头或结尾插入O(1)时间,或者在已经有指针的节点之后插入,或者如果必须扫描,则为O(N)时间列表找到一个位置。我们假设我们已经知道了这个位置,我们确定了我们真正感兴趣的操作的复杂性。
在现实生活中,扫描链表以找到要插入的位置通常不是一个好主意,因为它需要O(N)时间。我们不这样做,所以我们不要谈论它。链表的适当用例几乎总是涉及恒定时间插入。
答案 2 :(得分:1)
您将苹果与橙子进行比较。
链接列表没有必要的顺序。您可能希望按照自己的标准订购列表。插入是O(1)如果您不关心订单(只是插入前面),或者如果您关心订单并且已经有一个指向插入位置的指针(这很常见,例如我们有链接文本对象中的行列表,以及指向当前光标位置的指针。用户按下粘贴,我们插入行)。
使用BST,元素按顺序保存,您必须为它们定义顺序。插入始终为O(日志N),因为您在插入位置上搜索。由于树大致平衡,一半的叶子留下了孩子,一半是每个节点的右子,所以我们很快就到了叶子插入点。
答案 3 :(得分:0)
二进制搜索树背后的基本思想是拥有这样一个存储库,它提供了有效的数据排序,搜索和检索方式。
在BST中搜索的复杂度为O(h) worst-case run time
,其中h
是给定树的height
。具有n个节点的二进制搜索树具有最小O(log n)
级别,至少需要O(log n)
次比较才能找到要插入的特定位置。不幸的是,二叉搜索树可以退化为链表,将搜索时间缩短为O(n)
。
在链接列表中,如果您不关心任何订单,可以在O(1) time
中插入元素,但如果您正在遍历链接列表,这不是一个好主意,则需要o(n) time