加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 08:55:31 所属栏目:安全 来源:网络整理
导读:我想维护一个不可变的有界FIFO队列,我可以在一段时间后删除最旧的值.在 Scala中,immutable.Queue适用于大小有限的队列(.size似乎是O(N),因为它在内部基于List,但我可以单独维护大小),但似乎没有便宜的访问方式head元素用比O(N)便宜的东西来测试最旧值的年龄,
我想维护一个不可变的有界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),最坏的情况.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读