簡體   English   中英

為什么說鏈接列表插入是固定時間?

[英]Why do we say linked list inserts are constant time?

我知道,由於簡單地重新排列了指針,所以鏈表插入的時間是固定的,但這不要求知道您要從中進行插入的元素嗎?

要訪問該元素,需要進行線性搜索。 那么,為什么不說插入仍然首先受到線性搜索瓶頸的約束呢?

編輯:我不是在談論頭部或尾部附加,而是在兩者之間的任何地方插入。

是的,它需要已經有一個要插入的節點。

那么,為什么不說插入仍然首先受到線性搜索瓶頸的約束呢?

因為不一定如此,所以如果您可以安排一些事情,使您實際上知道插入點(不僅是索引,還知道節點)。

顯然,您可以在前端或后端“插入”,這似乎有點作弊,這會使“插入”一詞的含義有所延伸。 但考慮另一種情況:在追加到列表時,有時會記住一個節點。 只需選擇任何節點,即可使用任何條件選擇所需節點。 然后,您可以稍后在該節點之后或之前輕松插入。

這聽起來像是一個非常“結構化”的情況。 對於更實際的情況(例如,並非完全如此),您可以查看“跳舞鏈接”算法。

為什么說鏈接列表插入是固定時間?

因為插入操作是恆定時間。

請注意, 定位插入物的位置不被視為插入操作本身的一部分。 那將是一個不同的操作,它可能是恆定時間,也可能不是恆定時間,例如,如果包括search time ,您將得到:

  • 插入頭部: 恆定
  • 尾部插入: 恆定
  • 在迭代1時插入當前元素之前: 常量
  • 在索引位置插入: 線性

1)假設您正在迭代。

相反, ArrayList插入操作是線性時間。 如果包括搜索時間 ,您將獲得:

  • 插入頭部: 線性
  • 在尾插入: 常量 (攤銷后的金額)
  • 迭代1時在當前元素之前插入: 線性
  • 在索引位置插入: 線性

以下兩個操作是不同的

  • 操作A:在鏈接列表中的任意位置插入

  • 操作B:在鏈接列表中的特定位置插入

可以在O(1)實現操作A。 可以將新元素插入head (如果需要,可以插入tail )。

操作B涉及查找,然后插入。 發現部分是O(n) 插入如上所述,即O(1) 但是,如果將發現的結果作為輸入提供,例如,是否有類似的API

Node * Find(Node * head, int find_property);
Node * InsertAfter(Node * head, Node * existing_node, Node * new_node);

那么該操作的插入部分是O(1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM