Algorithm 链表插入与BST插入时间成本

Algorithm 链表插入与BST插入时间成本,algorithm,data-structures,linked-list,binary-search-tree,Algorithm,Data Structures,Linked List,Binary Search Tree,在链表中,插入是O(1),因为我们假设已经知道要插入的位置。在二叉搜索树中,插入是O(logN),因为我们必须在插入之前找到插入的位置(然而,实际的插入过程应该是恒定的时间)。为什么在LinkedList的情况下,我们假设已经有了位置,而在BST中,我们假设必须遍历节点才能找到插入位置(导致时间复杂度为O(logN)?当考虑插入到链接列表时,主要假设列表没有在插入过程中应保持的顺序。(即列表的元素没有以某种方式排序)因此,插入的成本被认为是可以实现的最便宜的成本。毕竟,正如您所说,我们不在乎一旦

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

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

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

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


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

您在比较苹果和桔子

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


使用BST时,元素保持顺序,并且必须为它们定义顺序。插入始终为O(log N)因为您对插入位置进行搜索。由于树大致平衡,一半的叶子是每个节点的左子节点,一半是右子节点,因此我们很快就到达了叶子插入点。

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

所以…对于一个实际的BST,比如红黑树或AVL树,我们可以说插入需要O(logn)时间,不管我们是否包括找到插入位置的成本

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


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

二进制搜索树背后的基本思想是拥有这样一个存储库,它提供了数据排序、搜索和检索的有效方法。 BST中的搜索具有
O(h)最坏情况下运行时的复杂性,其中
h
是给定树的
高度。具有n个节点的二元搜索树具有
O(logn)
级别的最小值,它至少需要
O(logn)
比较以找到要插入的特定位置。不幸的是,二叉搜索树可能退化为链表,从而将搜索时间缩短到
O(n)

在链表中,如果您不关心任何顺序,您可以在
O(1)时间
中插入元素,但如果您正在遍历一个不好的链表,则需要
O(n)时间

我们在哪里假定它(以及“我们”是谁)?如果我们假设我们知道新元素应该去哪里,我们就知道。如果我们不知道,我们就不知道。这不是一个真正的编程/计算机科学问题。(反勾号更常用于引用的片段或代码片段-我会选择斜体字使部分文本突出。)。(编辑时:
检索
(无论如何,检索可能更适合)中有一个输入错误,_linkedlis__t中的装饰已损坏。)您很可能不打算在结尾使用“small o”。)谢谢您的建议。