[英]Why do we say linked list inserts are constant time?
我知道,由於簡單地重新排列了指針,所以鏈表插入的時間是固定的,但這不要求知道您要從中進行插入的元素嗎?
要訪問該元素,需要進行線性搜索。 那么,為什么不說插入仍然首先受到線性搜索瓶頸的約束呢?
編輯:我不是在談論頭部或尾部附加,而是在兩者之間的任何地方插入。
是的,它需要已經有一個要插入的節點。
那么,為什么不說插入仍然首先受到線性搜索瓶頸的約束呢?
因為不一定如此,所以如果您可以安排一些事情,使您實際上知道插入點(不僅是索引,還知道節點)。
顯然,您可以在前端或后端“插入”,這似乎有點作弊,這會使“插入”一詞的含義有所延伸。 但考慮另一種情況:在追加到列表時,有時會記住一個節點。 只需選擇任何節點,即可使用任何條件選擇所需節點。 然后,您可以稍后在該節點之后或之前輕松插入。
這聽起來像是一個非常“結構化”的情況。 對於更實際的情況(例如,並非完全如此),您可以查看“跳舞鏈接”算法。
為什么說鏈接列表插入是固定時間?
因為插入操作是恆定時間。
請注意, 定位插入物的位置不被視為插入操作本身的一部分。 那將是一個不同的操作,它可能是恆定時間,也可能不是恆定時間,例如,如果包括search time ,您將得到:
1)假設您正在迭代。
相反, ArrayList
插入操作是線性時間。 如果包括搜索時間 ,您將獲得:
以下兩個操作是不同的 :
操作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.