【问题标题】:Intelligent purely functional sets智能纯功能集
【发布时间】:2012-06-13 20:01:57
【问题描述】:

由并集、交集和差组成的集合计算通常可以用许多不同的方式表示。是否有任何理论或具体实现试图最小化达到给定答案所需的计算量?

例如,当我试图在模拟无定形材料中将原子分解为相邻壳时,我首先遇到了这个的实际应用,其中第一个壳是某些给定原始原子的直接邻居,第二个壳是那些原子是第一个 shell 的邻居,不在第一个 shell 中,也不是在它之前的那个:

nth 0 = singleton i
nth 1 = neighbors i
nth n = reduce union (map neighbors (nth(n-1))) - nth(n-1) - nth(n-2)

有很多不同的方法可以解决这个问题。您可以在组成结果的同时逐步测试每个集合中的成员资格,或者您可以计算三个相邻壳的并集并使用交集删除前两个壳,留下最外层的壳。在实践中,需要构建大型中间集的解决方案速度较慢。

据推测,智能集实现可以组合要评估的表达式,然后在评估它之前对其进行优化(例如,减少中间集的大小)以提高性能。存在这样的集合实现吗?

【问题讨论】:

  • 好吧,我猜带有单列表的 SQL 数据库本质上是带有查询语言优化器的集合。我不知道他们中的任何一个是否有适用于这个查询的优化,虽然......或者甚至 SQL 是否是一种足够令人兴奋的语言来表达这个查询。
  • 几年前我看了大概十几个,答案是“不”,除了 SQL 查询优化器之外。
  • 听起来像 C++ 表达式模板...
  • @DanielWagner 好点,但我当然对内存中的集合感兴趣。
  • @ildjarn 你能详细说明一下吗?这是我 10 年前使用 Todd Veldhuizen 的 Blitz++ 库优化数组算法的东西吗?

标签: performance haskell data-structures f# immutability


【解决方案1】:

你的问题立刻让我想起了 this paper 中描述的 Haskell 的流融合。一般原则可以很容易地总结出来:你不是存储一个列表,而是存储一种构建列表的方法。然后列表转换函数直接在列表生成器上操作,这意味着所有操作都融合到一个数据生成中,而无需任何中间结构。然后,当您完成组合操作后,您将运行生成器并生成数据。

所以我认为你的问题的答案是,如果你想要一些类似的智能机制来融合计算并消除中间数据结构,你需要找到一种方法将集合转换为“协同结构”(即论文称之为)生成一个集合并直接对其进行操作,然后在完成后实际生成该集合。

我认为这个概念背后有一个非常深刻的理论,论文暗示但从未阐明,如果这里的其他人知道它是什么,请告诉我,因为这与我正在做的其他事情非常相关,也是!

【讨论】:

  • 嗯,这叫做 codata。不是用构造函数构造数据,而是用“析构函数”来破坏 codata。列表是数据,流是余数据。 (范畴论爱好者:数据是初始代数,余数据是终端代数)。直觉实数(如“柯西序列”N -> Q)是余数。
  • 融合优化是递归协代数属性的编码。不同的代数定律,当实现为对表达式的重写时,会产生复杂性的改进。欣泽等人。涵盖理论cs.ox.ac.uk/ralf.hinze/publications/IFL10.pdf.
  • 感谢你们俩。这非常有帮助。
猜你喜欢
  • 2013-03-28
  • 2011-03-25
  • 1970-01-01
  • 2017-06-03
  • 2014-06-17
  • 1970-01-01
  • 2014-06-08
  • 2020-10-04
  • 1970-01-01
相关资源
最近更新 更多