【发布时间】: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