在c#中我们有LinkedList库,它有一些有用的方法。其中一个是AddAfter / AddBefore方法。我认为在排序的LinkedList中,如果它使用二进制搜索,则为O(log(n))复杂度;
我是对的还是你能解释得更准确
答案 0 :(得分:3)
AddBefore
和AddAfter
接受第一个参数LinkedListNode<>
,它是添加新节点之前/之后的节点。此操作为O(1)
。
遍历(枚举)LinkedList
是一个O(n)操作,因为要查看第x个节点,您必须遍历x-1个节点。您不能二进制搜索LinkedList
,因为您无法直接访问第x个元素而不会遍历它。
因此,如果要将新节点添加到要保持有序的LinkedList
,首先必须遍历它以找到插入新元素的“正确”位置(O(n)操作),然后你必须使用AddBefore
或AddAfter
(一个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++;
}