使用LIFO实施FIFO

如何解决使用LIFO实施FIFO

你可以分期时间复杂度O(1)每个操作FIFO [队列]使用2个LIFOs [堆栈。

假设你有stack1stack2

insert(e):
   stack1.push(e)

take():
   if (stack2.empty()):
      while (stack1.empty() == false):
            stack2.push(stack1.pop())
   return stack2.pop() //assume stack2.pop() handles empty stack already

push(1)

|1|  | |
|-|  |-|

push(2)
|2|  | |
|1|  | |
|-|  |-|

pop()
push 2 to stack2 and pop it from stack1:
|1|  |2|
|-|  |-|
push 1 to stack2 and pop it from stack2:
| |  |1|
| |  |2|
|-|  |-|
pop1 from stack2 and return it:
| |  |2|
|-|  |-|

要获得真正的O(1)[未摊销],它是更为复杂,需要更多的堆栈,在看一些答案的这个职位

复杂度分析:

  1. 每个insert()都很简单O(1)[只需将其推入stack1]
  2. 请注意,每个元素的push()ed和pop()ed最多两次,一次来自stack1,一次来自stack2。由于没有其他操作,因此对于n元素来说,我们最多具有2n push()s和2n pop()s,这给我们带来了最大的4n * O(1)复杂性[因为are pop()push()are O(1),这是O(n)-并且我们得到了以下的摊销时间:O(1) * 4n / n = O(1)

解决方法

通过网上的一些算法,我发现了一个有趣的例子:

您将如何使用LIFO实现FIFO?

我尝试了一下,但最终只有一个解决方案:每次我们想要FIFO 的 最前面的 元素时,将lifo复制到另一个lifo( 不包括
最后一个元素,即最前面的元素),获取front元素并将其删除,然后复制将第二个LIFO放回第一个LIFO。

但这当然是非常慢的,它产生了一个像这样的简单循环:

for(!myfifo.empty()) {
  myfifo.pop();
}

O(N²) ,而不是 为O(n) 上的标准实现FIFO的。

当然,不是让LIFO做FIFO,通过使用基于LIFO的“本机”
FIFO和假FIFO,我们当然不会具有相同的复杂性,但是我认为肯定有比O做得更好的方法(n²)。有人对此有想法吗?

提前致谢。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?