微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala – 在O(1)中是否有一个带有Peek()的有界队列的纯函数实现?

我想维护一个不可变的有界FIFO队列,我可以在一段时间后删除最旧的值.在 Scala中,immutable.Queue适用于大小有限的队列(.size似乎是O(N),因为它在内部基于List,但我可以单独维护大小),但似乎没有便宜的访问方式head元素用比O(N)便宜的东西来测试最旧值的年龄,所以我无法测试最老的条目的到期状态.任何指向纯函数(不可变)实现的指针?

解决方法

这篇文章,Haskell: Queues without pointers,
描述了具有O(1)摊销成本的纯函数队列(编辑:用于添加删除元素).我认为数据结构来自Chris Okasaki,更多细节见于 his book.

基本思想是将队列分解为两个列表,一个用于前面,一个用于后面.新元素被添加到“前面”. “Back”以相反的顺序存储,以便于弹出元素.当“后退”的所有元素都消失时,“前面”被反转并重新识别为“后退”.这种数据结构对这些操作具有O(1)摊销成本,但显然有一些工作可以减少到O(1),这是正确的.

编辑:Okasaki’s paper描述了一个优雅,纯粹功能的队列和双端队列(deques)实现. Deques允许从任一端添加删除元素.所有这些操作都是O(1),最坏的情况.

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

相关推荐