是否存在以纯数据流样式构成“增量更新”功能的范例?


10

我不知道问这个问题的正确术语,所以我会用很多单词来描述它,请耐心等待。

背景,正好在同一页上:程序通常包含缓存-时间/内存的权衡。程序员的一个常见错误是在更改其上游源/先例之一后忘记更新缓存的值。但是数据流或FRP编程范例可以避免此类错误。如果我们有许多纯函数,并在有向依存关系图中将它们连接在一起,则节点可以缓存并重用其输出值,直到任何函数的输入发生变化。该系统体系结构在《基于数据流的环境中的缓存》一文中进行了描述,并且使用命令式语言或多或少地类似于记忆。

问题:当函数的输入之一确实发生变化时,我们仍然必须整体执行该函数,丢弃其缓存的输出并从头开始重新计算。在许多情况下,这对我来说似乎是浪费。考虑一个简单的示例,该示例生成一个“前5名”列表。输入数据是任何内容的未排序列表。它作为输入传递给输出排序列表的函数。依次输入到仅接受前5个项目的功能。用伪代码:

input = [5, 20, 7, 2, 4, 9, 6, 13, 1, 45]
intermediate = sort(input)
final_output = substring(intermediate, 0, 5)

排序函数的复杂度为O(N log N)。但是请考虑在应用程序中使用此流程,在该应用程序中,输入仅通过添加1个元素而仅稍有变化。与其每次都从头开始重新排序,不如使用O(N)函数,它通过在正确位置插入新元素来更新旧的缓存排序列表,将更快。这只是一个示例-许多“从头开始”功能都具有这种“增量更新”功能。另外,也许新添加的元素甚至不会出现在final_output中,因为它位于第5位之后。

我的直觉表明,有可能以某种方式将这样的“增量更新”功能与现有的“从头开始”功能并排添加到数据流系统中。当然,从头开始重新计算所有内容必须始终具有与进行一系列增量更新相同的结果。系统应具有这样的特性:如果每个单独的原始FromScratch增量对总是给出相同的结果,然后由他们建造的大型复合功能也应该会自动给出相同的结果。

问题:是否可能有一个系统/体系结构/范式/元算法既可以支持FromScratch函数也可以支持它们的增量对等函数,并为提高效率而合作并组成大量流程?如果没有,为什么?如果有人已经研究了该范式并发布了它,那么它被称为什么,我能否简要了解它的工作原理?


O(logn)ķØķ日志ñ

Answers:


7

这个领域已经被发明了很多次,并且有很多名字,例如:

  • 在线算法
  • 流算法,流查询,连续查询。
  • 动态数据结构。
  • 自调整计算(根据Andrej)。

(并且可能更多。)这些不相同,但是相关。

蔡(Cai)等人(1)的解释:一般有两种实现在线算法的核心方式(即,不参考任何特定的算法问题):

  • 静态增量。静态方法在编译时分析程序,并生成一个增量版本,该版本根据更改的输入有效地更新原始程序的输出。静态方法比动态方法更有效率,因为在运行时不需要簿记。而且,通常可以使用标准编译器技术(例如恒定折叠或内联)来优化计算出的增量版本。这是(1)中研究的方法。

  • 动态增量。动态方法会在程序运行时创建动态依赖关系图,并沿这些图传播更改。最知名的方法是Acar的自我调整计算。关键思想很简单:程序在增强的运行时环境中对原始输入执行,该运行时环境跟踪动态依赖图中的值之间的依赖关系。中间结果被缓存。(正如您可能想象的那样,这往往会占用大量内存,并且该领域中的许多研究都涉及如何限制内存使用。)随后,输入的更改通过依赖关系图从更改的输入传播到结果,同时更新了中间和中间。最终结果;此处理通常比重新计算更有效。但是,创建动态相关性图会在运行时带来较大的常数因子开销,在报告的实验中为2到30。

此外,人们总是可以尝试“手工”提出给定算法的在线版本。这可能很困难。


(1)蔡Y(Y. Cai),PG吉拉鲁索(PG Giarrusso),T。伦德尔(T.Rendel),奥斯特曼(K.Ostermann),一种高阶语言的变化理论:通过静态微分递增λ计算


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.