为什么æ’入链表O(1)的中间?

时间:2009-05-08 16:21:24

标签: linked-list big-o

æ ¹æ®Wikipedia article on linked lists,在链表中间æ’入被认为是O(1)。我认为这将是O(n)。您是å¦éœ€è¦æ‰¾åˆ°å¯èƒ½æŽ¥è¿‘列表末尾的节点?

此分æžæ˜¯å¦ä¸è€ƒè™‘节点æ“作的å‘现(虽然它是必需的)而åªæ˜¯æ’入本身?

编辑:

  

链接列表与数组相比有几个优点。在列表的特定点æ’入元素是一个æ’定时间æ“作,而在数组中æ’å…¥å¯èƒ½éœ€è¦ç§»åŠ¨ä¸€åŠæˆ–更多元素。

上述陈述对我æ¥è¯´æœ‰ç‚¹è¯¯å¯¼ã€‚如果我错了,请纠正我,但我认为结论应该是:

阵列:

  • 找到æ’å…¥/删除点O(1)
  • 执行æ’å…¥/删除O(n)

å…³è”列表:

  • 找到æ’å…¥/删除点O(n)
  • 执行æ’å…¥/删除O(1)

我认为你唯一一次找ä¸åˆ°ä½ç½®å°±æ˜¯ä½ ä¿ç•™äº†æŸç§æŒ‡é’ˆï¼ˆåœ¨æŸäº›æƒ…况下与头部和尾部一样)。因此,我们ä¸èƒ½æ–­ç„¶è¯´é“¾æŽ¥åˆ—表总是超过æ’å…¥/删除选项的数组。

14 个答案:

答案 0 :(得分:97)

你是对的,文章认为“索引â€æ˜¯ä¸€ä¸ªå•ç‹¬çš„æ“作。因此æ’入本身就是O(1),但是到达那个中间节点是O(n)。

答案 1 :(得分:21)

ä¸ï¼Œå½“您决定è¦æ’入时,å‡è®¾æ‚¨å·²ç»åœ¨è¿­ä»£åˆ—表中间。

链接列表上的æ“作通常以这样的方å¼å®Œæˆï¼Œå³å®ƒä»¬å®žé™…上ä¸è¢«è§†ä¸ºé€šç”¨â€œåˆ—表â€ï¼Œè€Œæ˜¯ä½œä¸ºèŠ‚ç‚¹é›†åˆ - 将节点本身视为主循环的迭代器。因此,当您æµè§ˆåˆ—表时,您会注æ„到作为业务逻辑的一部分,需è¦æ·»åŠ æ–°èŠ‚点(或删除旧节点),然åŽæ‰§è¡Œæ­¤æ“作。您å¯ä»¥åœ¨ä¸€æ¬¡è¿­ä»£ä¸­æ·»åŠ 50个节点,æ¯ä¸ªèŠ‚点åªæœ‰O(1)时间æ¥å–消链接两个相邻节点并æ’入新节点。

编辑:伙计,你输入第二个段è½è€Œä¸æ˜¯ç¬¬ä¸€ä¸ªå“应者,你是第5个和第4个说åŒæ ·çš„事情ï¼

答案 2 :(得分:21)

æ’入本身是O(1)。节点å‘现是O(n)。

答案 3 :(得分:6)

为了与数组进行比较,这是图表所示的数æ®ï¼Œå®ƒæ˜¯O(1),因为您ä¸å¿…在新节点之åŽç§»åŠ¨æ‰€æœ‰é¡¹ç›®ã€‚

所以是的,他们å‡è®¾æ‚¨å·²ç»æ‹¥æœ‰æŒ‡å‘该节点的指针,或者获å–指针是微ä¸è¶³é“的。æ¢å¥è¯è¯´ï¼Œé—®é¢˜æ˜¯ï¼šâ€œç»™å®šèŠ‚点在X ,在此节点之åŽæ’入的代ç æ˜¯ä»€ä¹ˆï¼Ÿâ€ä½ å¯ä»¥ä»Žæ’入点开始。

答案 4 :(得分:5)

æ’入链表ä¸åŒäºŽè¿­ä»£é“¾è¡¨ã€‚您没有找到该项目,您正在é‡ç½®æŒ‡é’ˆä»¥å°†é¡¹ç›®æ”¾åœ¨é‚£é‡Œã€‚如果è¦å°†å…¶æ’å…¥å‰ç«¯é™„近或é è¿‘末端,æ’å…¥ä»ç„¶éœ€è¦é‡æ–°åˆ†é…指针。当然,这å–决于它是如何实现的,但这是列表的优势 - 您å¯ä»¥è½»æ¾æ’入。通过索引访问是数组å‘光的地方。但是,对于列表,找到第n个项目通常是O(n)。至少那是我从学校里记得的。

答案 5 :(得分:3)

因为它ä¸æ¶‰åŠä»»ä½•å¾ªçŽ¯ã€‚

æ’入就åƒï¼š

  • æ’入元素
  • 链接到上一个
  • 链接到下一个
  • 完æˆ

这在任何情况下都是æ’定的时间。

因此,一个接一个地æ’å…¥n个元素是O(n)。

答案 6 :(得分:3)

  

此分æžæ˜¯å¦ä¸è€ƒè™‘节点æ“作的å‘现(虽然它是必需的)而åªæ˜¯æ’入本身?

你明白了。在给定点æ’å…¥å‡å®šæ‚¨å·²ç»æ‹¥æœ‰æŒ‡å‘è¦åœ¨ä¹‹åŽæ’入的项目的指针:

InsertItem(item * newItem, item * afterItem)

答案 7 :(得分:2)

一旦你知é“ä½ è¦æŠŠå®ƒæ”¾åœ¨å“ªé‡Œå°±æ’å…¥O(1)。

答案 8 :(得分:2)

ä¸ï¼Œå®ƒä¸è€ƒè™‘æœç´¢ã€‚但是如果你已ç»æ‹¥æœ‰ä¸€ä¸ªæŒ‡å‘列表中间项目的指针,那么在那一点æ’入就是O(1)。

如果你必须æœç´¢å®ƒï¼Œä½ å¿…须增加æœç´¢æ—¶é—´ï¼Œè¿™åº”该是O(n)。

答案 9 :(得分:0)

这篇文章是关于将数组与列表进行比较。找到数组和列表的æ’å…¥ä½ç½®æ˜¯O(N),因此文章忽略它。

答案 10 :(得分:0)

O(1)å–决于您有一个项目,您将æ’入新项目。 (之å‰æˆ–之åŽï¼‰ã€‚如果你ä¸è¿™æ ·åšï¼Œé‚£å°±æ˜¯O(n)因为你必须找到那个项目。

答案 11 :(得分:0)

我认为这åªæ˜¯ä½ é€‰æ‹©ç”¨O()表示法计算的一个例å­ã€‚在æ’入正常æ“作的情况下,count是å¤åˆ¶æ“作。对于数组,æ’入中间涉åŠå°†ä½ç½®ä¸Šæ–¹çš„所有内容å¤åˆ¶åˆ°å†…存中。使用链表,这将æˆä¸ºè®¾ç½®ä¸¤ä¸ªæŒ‡é’ˆã€‚无论æ’入什么,您都需è¦æ‰¾åˆ°ä½ç½®ã€‚

答案 12 :(得分:0)

如果您对链接列表的æ“作为O(1)åŽæœ‰è¦æ’入的节点的引用 对于一个数组,它ä»ç„¶æ˜¯O(n),因为你必须移动所有连续的节点。

答案 13 :(得分:0)

最常è§çš„情况å¯èƒ½æ˜¯åœ¨åˆ—表的开头或末尾æ’入(列表的末尾å¯èƒ½æ²¡æ—¶é—´æ‰¾åˆ°ï¼‰ã€‚

对比在数组的开头或结尾处æ’入项目(如果数组在最åŽï¼Œåˆ™éœ€è¦è°ƒæ•´æ•°ç»„大å°ï¼Œæˆ–者如果它在开始时调整大å°å¹¶ç§»åŠ¨æ‰€æœ‰å…ƒç´ ï¼‰ã€‚