我正在解决的代码生成问题需要以下算法。我目前的算法是O(n ^ 2),但我觉得有更好的方法来做到这一点。
假设我有一个谓词函数来计算x<收率
less?: (x:T, y:T) -> True|False
我先验地知道这种关系是可传递的。这样,
less?(a, b) and less?(b, c)
意味着
less?(a, c)
我想计算一组对象(x1,...,xn)的依赖图。它应该看起来像:
x1 => (x2, x4, x5)
x2 => (x3)
x5 => (x7)
x10 => ()
etc...
其中每个节点xi与xj列表相关联,使得较少的?(xj,xi)为真。计算此图表的最简单方法是减少调用?在所有可能的对(xi,xj)上。但是越少?关系是昂贵的,我想尽量减少对较少的呼叫?
感谢您的帮助。
-Patrick
答案 0 :(得分:1)
如果<通过维持一个矩阵来保存关于vs b的当前知识状态,你可能会获得足够昂贵的关系。我们可以有一个< b,!(a
例如a vs b和b vs c只有有限数量的可能性来检查兼容性和不兼容性,以查看扣除可能的位置,但显然a< b和b< c => a< C。因此我们也有一个< b和!(a< c)=> !(b 我倾向于慢慢增长已知值的平方,逐个按随机顺序添加新变量,因此在第i阶段,您知道第一个随机选择的变量的矩阵的全部内容。当你添加每个新变量时,我会将它与已经按随机顺序处理的变量进行比较。你正在进行每一次演绎。如果有一个非常聪明的变量比较顺序,你可能希望通过随机比较顺序,它将足够接近最佳顺序,你不会比它更低效。 在最糟糕的情况下,我对此表示怀疑。如果你找不到< b对于任何a,b,我认为你必须检查每种可能性。