所有有效的点组合,以最快(速度)有效的方式

时间:2010-03-02 21:56:03

标签: c# algorithm combinations

我知道在生成元素组合方面存在很多问题,但我认为这个元素有一定的转折值得一个新问题:

对于我的宠物项目,我需要预先计算很多状态,以便以后改进应用程序的运行时行为。我挣扎的其中一个步骤是:

给定两个整数的N个元组(让我们从这里称它们为点,虽然它们不在我的用例中。但它们大致与X / Y相关)我需要计算给定规则的所有有效组合。

规则可能类似于

  • “包含的每个点都会排除具有相同X坐标的所有其他点”
  • “包含的每个点都排除了具有奇数X坐标的所有其他点”

我希望并希望这一事实能够改善选拔过程,但我的数学技能只是在我打字时复活,我无法想出一个优雅的算法。

  • 点数(N)开始很小,但很快就会超过64(对于“长期用作位掩码”的解决方案)
  • 我在C#中这样做,但如果解释了基本想法,任何语言的解决方案都应该没问题

感谢。


响应弗拉德的回答更新:

也许我想要概括这个问题的想法很糟糕。我上面的规则是在飞行中发明的,只是占位符。一个现实的规则看起来像这样:

  • “包含的每一点都排除了所选点之上的三角形中的每一个点”

根据该规则并选择(2,1)我将排除

  • (2,2) - 正上方
  • (1,3)(2,3)(3,3) - 下一行

所以规则是固定的,而不是一般的。不幸的是,它们比我最初提供的X / Y样品更复杂。

3 个答案:

答案 0 :(得分:3)

“包含的每个点的x坐标是其他包含点的y坐标的某个子集的精确和”怎么样?如果你能为这个简单陈述的约束问题提出一个快速算法,那么你将会变得非常有名。

我的观点是,所述的问题是如此模糊,以至于承认NP完全或NP难问题。约束优化问题难以置信;如果你不能对问题施加极其严格的限制,那么在多项式时间内机器很快就无法对其进行分析。

答案 1 :(得分:0)

对于某些特殊规则类型,您的任务似乎很简单。例如,对于示例规则#1,您需要选择X的所有可能值的子集,而不是从子集中的每个值分配任意Y.

对于泛型规则,我怀疑在没有任何AI的情况下构建高效算法是可能的。

答案 2 :(得分:0)

我对问题的理解是:给定方法bool property( Point x ) const,找到属性()为true的集合的所有点。那是合理的吗?

蛮力方法是通过property()运行所有点,并存储返回true的点。时间复杂度为O( N ),其中(a)N是点的总数,(b)property()方法是O( 1 )。我想你正在寻找O( N )的改进。是吗?

对于某些类型的属性,可以从O( N )改进所提供的合适的数据结构用于存储点并且完成合适的预计算(例如排序)。但是,对于任何属性都可能不是这样。