单链表迭代复杂度

时间:2015-04-10 21:45:16

标签: java algorithm list time-complexity

首先,我对单链表的基本理解是每个节点只指向下一个后续节点,所以我的问题可能源于我对这种列表的定义不正确这一事实。

鉴于列表设置,进入节点 n 将需要迭代前面的 n-1 节点,因此搜索和访问将是O(n)。现在,显然节点插入和删除需要O(1),但除非他们正在谈论第一个项目插入,那么实际上你将在节点 n之间插入项目为O(n)+ O(1) n + 1

现在,索引列表也会有O(n)的复杂性,但显然构建这样的索引是不受欢迎的,我无法理解为什么。我们不能建立一个单链表索引,它允许我们真正的O(1)插入和删除,而不必在列表上执行O(n)迭代来到我们的特定节点?它甚至不需要是所有节点的索引,我们可以让它指向子索引,即对于1000个项目的列表,第一个索引将指向1-100,101-200之间的项目的10个不同索引等等,然后这些索引可以指向更小的索引。这样,到达节点543可能只需要3+(索引遍历)迭代,而不是像典型的单链表那样需要543。

我想,我要问的是为什么通常应该避免这种索引?

2 个答案:

答案 0 :(得分:5)

您正在描述skip-list

跳过列表的搜索,插入,删除时间复杂度为O(logN),因为这个"较小的子索引"你描述 - 你有对数的数字(如果你的列表有100个元素会怎么样?你需要多少这些级别?1,000,000个元素多少?10 ^ 30?)。
请注意,跳过列表通常是按顺序维护的,但如果你愿意的话,你可以将它排序(按索引排序 - 实际上)。

答案 1 :(得分:2)

使用单链表,即使您已经将节点直接引用到删除,复杂性也不是O(1)。这是因为您必须更新之前的节点的下一节点引用,这需要您遍历列表 - 导致O(N)复杂性。要获得O(1)删除的复杂性,您需要一个双向链表。

已经有一个集合类,它将HashMap与双向链表结合起来:LinkedHashMap