你将如何建模现实生活中的人员队列?
考虑到这些主要限制因素: - 先进先出 - 任何时候随机元素都可以离开队列 - pop应始终返回仍在队列中的元素 - 队列中的任何元素都是单一可识别的(例如,社会安全号码)
我提出的最佳解决方案是维护fifo约束的队列和管理离开的人的哈希集。当我在队列中推送一个元素时,我也会在哈希集中推送它。当我从队列中弹出一个元素时,我也会检查哈希集。如果在弹出之前删除了元素,我将其丢弃并弹出下一个元素。如果元素仍然在哈希集中,我处理该元素,然后将其从哈希集中删除。 在这种情况下,推送和添加,弹出和删除,仅删除操作都应该是O(1)及时或我错了吗?
我很幸运,有更高效或更优雅的解决方案
答案 0 :(得分:1)
我在你的解决方案中看到的一个问题是你似乎永远不会从哈希集中删除元素(除非我遗漏了一些东西),这很糟糕 - 尽管每次操作都需要O(1),内存无论队列中有多少人,用法都会不断增加。
我可能已经把它转过头了:
让队列中所有人的哈希映射(队列中的迭代者)。
对于入队,您也会添加到地图中,对于出列,您也会从地图中删除。
对于remove,由于hash-map包含迭代器,因此在执行remove操作时可以从hash-map和队列中删除person。这假设队列实现为(双)链表,并且仍然是O(1)。
如果您不熟悉迭代器,它基本上只是指向链表中适用节点的引用或指针。
答案 1 :(得分:0)
我建议使用“普通”队列来保存对可以失效的项目的引用。如果尝试获取下一个项目会产生一个已删除的项目,请忽略该项目并继续执行下一项目,直到找到未删除的项目或队列为空。这种方法浪费的内存量将受到进入队列的项目与从前端获取的项目的比率的限制。如果希望避免无限制的内存浪费的可能性,可以计算添加,无效和删除的项目的数量,并且如果队列中的项目数量超过例如五倍仍然有效的项目加上1000,锁定队列,将标记排入队列,然后检索并重新排队项目,直到遇到该标记。