主要观点:
- 对于长度为(n)的列表,考虑宽度为(w)的窗口,可通过暴力法在(O(nw))时间内计算每个窗口的和,利用滑动窗口技术可在(O(n))时间内完成。
- 求每个窗口的最大值,暴力法(O(nw))仍可行,但在(O(n))时间内较难,引出如何在(O(n))时间内计算单子总结的问题。
- 介绍用函数式编程技巧解决此问题,先通过栈来实现单子注释栈,再用两个栈实现队列,且队列可实现单子注释。
- 利用单子注释队列可解决滑动窗口问题,如求滑动窗口的最大值等,可通过添加特殊的正负无穷元素来处理。
关键信息:
- 用
GroupStack
实现群注释栈,用Stack
实现单子注释栈,包括push
、pop
等操作。 - 用两个栈实现队列,
enqueue
和dequeue
操作在平均(O(1))时间内,dequeue
可能偶尔为(O(n))时间但总体平均为(O(1))。 windows
函数可在(O(n))时间内计算每个宽度为(w)的窗口的单子和。- 给出一些可利用这些技术解决的问题,如[Tired Terry]等,以及一些未解决的类似问题如[Martian DNA]等。
重要细节:
- 在
push
操作中,对于非交换单子,可选择f a <> measure s
或measure s <> f a
,前者更优。 - 实现
reverse
栈时,通过foldl'
将元素依次压入新栈。 - 队列中由于元素在前后栈存储顺序不同,限制为交换单子。
- 对于求最大值和最小值,通过添加正负无穷元素构成半群和单子来处理。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。