【发布时间】:2013-12-09 21:56:18
【问题描述】:
您将如何对现实生活中的人排队进行建模?
考虑到这些主要限制: - 先进先出 - 任何时候随机元素都可以离开队列 - pop 应该总是返回一个仍在队列中的元素 - 队列中的任何元素都是唯一可识别的(例如社会安全号码)
我提出的最佳解决方案是同时维护 fifo 约束的队列和管理离开人员的哈希集。当我在队列中推送一个元素时,我也将它推送到哈希集中。当我从队列中弹出一个元素时,我还会检查散列集。如果元素在弹出之前被删除,我将丢弃它并弹出下一个元素。如果元素仍在散列集中,我会处理该元素,然后将其从散列集中删除。 在这种情况下,push-and-add、pop-and-remove、remove-only 操作在时间上都应该是 O(1) 还是我错了?
我很幸运有一个更有效或更优雅的解决方案
【问题讨论】:
-
您可能会问自己,移除 O(1) 时间有多重要。如果删除很少发生(对于“现实生活”队列来说是这样),使用具有 O(n) 删除的传统 FIFO 队列可能不会影响程序的整体运行时间。为了简单起见,有很多话要说。
标签: performance algorithm data-structures queue hashset