如何显示队列/出队的复杂性是O(n)?

时间:2017-06-14 22:17:51

标签: algorithm queue

我有算法的作业,并有以下问题:

给出队列Q和方法:

queue(Q, x) //inserts x to the queue from left

dequeue(Q) //returns most right element of Q

multiqueue(Q, k) //runs dequeue(Q) k times

我如何证明n个操作最多需要以空列表开头的O(n)步骤?

2 个答案:

答案 0 :(得分:2)

正如我从你的评论中看到的,你差不多回答了你的问题。

  • 队列是你解释的O(1)
  • 如你所解释的那样,
  • 出队是O(1)

棘手的是,使用k定义的多队列(Q,k)小于队列中的元素数量。

我们假设队列开始为空,这就是为什么你可以假设为了O(n)的复杂性总是调用的多队列,我将解释:

如果你多次调用multidequeue,则意味着你没有使用其他操作包括队列这就是为什么你没有任何元素出队,因此你的k是一个真正的常量。

假设您呼叫队列 n-1次,您只能调用一次多队列,因为您已经花费了所有其他n - 1次操作。

这就是为什么O(num_of_times_calling_multidequeue * multidequeue)= O(n)

答案 1 :(得分:0)

正如@gefen keinan指出我解决了这个问题:

假设我们有一个空的队列Q和n个可用的操作。  我们知道queue()和dequeue()都具有O(1)复杂度。 “最坏情况”是操作队列()的n - 1倍,然后具有参数k为n - 1的多队列(k),因为如果我们更频繁地使用它,它将只返回错误。

有了这些知识,我们可以得出结论:(n-1)* O(1)+(n-1)* O(n)= O(2n)= O(n)。

谢谢大家的答案。