插入After / Before进入Sorted LinkedList Big O Complexity

时间:2018-05-22 10:32:50

标签: c# algorithm sorting linked-list binary-search-tree

在c#中我们有LinkedList库,它有一些有用的方法。其中一个是AddAfter / AddBefore方法。我认为在排序的LinkedList中,如果它使用二进制搜索,则为O(log(n))复杂度;

我是对的还是你能解释得更准确

2 个答案:

答案 0 :(得分:3)

AddBeforeAddAfter接受第一个参数LinkedListNode<>,它是添加新节点之前/之后的节点。此操作为O(1)

遍历(枚举)LinkedList是一个O(n)操作,因为要查看第x个节点,您必须遍历x-1个节点。您不能二进制搜索LinkedList,因为您无法直接访问第x个元素而不会遍历它。

因此,如果要将新节点添加到要保持有序的LinkedList,首先必须遍历它以找到插入新元素的“正确”位置(O(n)操作),然后你必须使用AddBeforeAddAfter(一个O(1)操作)插入它。复合复杂度显然是O(n)。

答案 1 :(得分:1)

看看实施情况。这两种方法与搜索无关。所以,它是O(1)

public void AddAfter(LinkedListNode<T> node, LinkedListNode<T> newNode) {
    ValidateNode(node);
    ValidateNewNode(newNode);
    InternalInsertNodeBefore(node.next, newNode);
    newNode.list = this;
}  

public void AddBefore(LinkedListNode<T> node, LinkedListNode<T> newNode) {
    ValidateNode(node);    
    ValidateNewNode(newNode);                        
    InternalInsertNodeBefore(node, newNode);
    newNode.list = this;
    if ( node == head) {
        head = newNode;
    }
}

private void InternalInsertNodeBefore(LinkedListNode<T> node, LinkedListNode<T> newNode) {
    newNode.next = node;
    newNode.prev = node.prev;
    node.prev.next = newNode;
    node.prev = newNode;            
    version++;
    count++;
}

https://github.com/Microsoft/referencesource/blob/master/System/compmod/system/collections/generic/linkedlist.cs