琐碎的单链表复杂性查询

时间:2012-01-26 04:29:41

标签: c++ linked-list time-complexity singly-linked-list

我们知道单个链表上的查找是给定头指针的O(n)。让我们说我始终在链表的一半保持指针。我会改善任何查找时间吗?

4 个答案:

答案 0 :(得分:1)

是的,如果您有某种方法可以确定是从列表的开头还是中间开始(通常但不一定是要排序的列表),它可以将复杂度降低2倍。然而,这是一个常数因素,因此就大O复杂性而言,它是无关紧要的。

要与big-O复杂性相关,您需要的不仅仅是一个恒定的因子变化。例如,如果你有一个指针将每一半分成两半,再用它的每一半,依此类推,你最终会得到对数复杂度而不是线性 - 你已经将你的“链表”变成了一个(已经众所周知的)线程树。

答案 1 :(得分:0)

很好的想法,但这仍然没有改善搜索操作。无论您在列表的不同部分有多少指针,您仍然需要分析列表中的每个元素。但是,您可以通过两个线程搜索列表的每一半,从而使操作在理论上快两倍。

答案 2 :(得分:0)

仅当您的链接列表的数据已排序时。否则,正如在其他答复中已经说过的那样。

答案 3 :(得分:0)

它会,但渐渐地它仍将是相同的。但是,有一种使用这种想法的数据结构,它被称为跳过列表。跳过列表是一个链接列表,其中一些节点具有更多指针,这些指针在某种意义上指向列表其余部分的中间。这个想法在this image上有很好的说明。此结构通常具有对数插入查找和删除。