我需要创建一个持久队列类,其中函数enqueue接受一个元素并将其加入当前队列,并返回新队列。但原始队列保持不变。同样,dequeue函数删除前面的元素并返回新队列,但原始队列保持不变。这当然可以在O(队列长度)内完成,但我能否更快地完成?
我需要创建一个持久队列类,其中函数enqueue接受一个元素并将其加入当前队列,并返回新队列。但原始队列保持不变。同样,dequeue函数删除前面的元素并返回新队列,但原始队列保持不变。这当然可以在O(队列长度)内完成,但我能否更快地完成?
O(1)
)。
Queue
是由一对List
实现的,其中一个包含“in”元素,另一个包含“out”元素。
元素添加到“in”列表中并从“out”列表中移除。当“out”列表用尽时, 队列通过将“out”列表替换为“in.reverse”,将“in”替换为“Nil”而进行旋转。
将项目添加到队列中始终具有成本O(1)
。删除项目的成本为O(1)
,除非需要进行旋转,在这种情况下,会产生O(n)
的成本,其中n
是队列中元素的数量。当发生这种情况时,保证有n
个具有O(1)
成本的删除操作。删除项目的平均成本为O(1)
。
static class Node {
final Node next;
final Object o;
Node(Node next, Object o) {...}
}
final Node start, end;
private Queue(Node start, Node end) {...}
public Queue(Object o) {
start = end = new Node(null, o);
}
public Queue add(Object o) {
return new Queue(start, new Node(end, o));
}
public Queue remove() {
return new Queue(start, end.next);
}
add
和remove
方法的复杂度为O(1)。