【问题标题】:All valid combinations of points, in the most (speed) effective way所有有效的点组合,以最(速度)有效的方式
【发布时间】:2010-03-02 21:56:03
【问题描述】:

我知道有很多关于生成元素组合的问题,但我认为这个问题有一定的转折值得提出一个新问题:

对于我的一个宠物项目,我必须预先计算大量状态,以便以后改进应用程序的运行时行为。我挣扎的步骤之一是:

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

规则可能类似于

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

我希望并期望这一事实能够改善选择过程,但我的数学技能在我打字时才刚刚恢复,我无法想出一个优雅的算法。

  • 点集 (N) 开始时很小,但很快就会超过 64 个(对于“使用长作为位掩码”解决方案)
  • 我在 C# 中执行此操作,但任何语言的解决方案都应该可以解释基本思想

谢谢。


响应弗拉德的回答更新:

也许我把这个问题概括的想法很糟糕。我上面的规则是即时发明的,只是占位符。一条现实的规则如下所示:

  • “包含的每个点都排除了三角形中所选点上方的所有其他点”

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

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

所以规则是固定的,不是通用的。不幸的是,它们比我最初给出的 X/Y 样本更复杂。

【问题讨论】:

  • 如果您能列出您计划使用的所有实际规则,将会很有帮助。

标签: c# algorithm combinations


【解决方案1】:

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

我的观点是,所陈述的问题是如此模糊,以至于承认 NP 完全或 NP 难题。约束优化问题非常困难;如果你不能对问题设置非常严格的界限,那么它很快就会变得无法在多项式时间内被机器分析。

【讨论】:

  • 感谢您的回答。我会重新考虑我的问题。我试图剥离细节并要求对“给定一组项目,如果每个选择都消除了剩余集合的一部分,我如何以有效的方式计算所有组合”这个问题的通用解决方案。可能这太笼统了,我会尽力想出更好的,抱歉。
【解决方案2】:

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

对于通用规则,我怀疑是否有可能在没有任何人工智能的情况下构建高效算法。

【讨论】:

  • 好的,我没有通用规则(如:亲爱的用户,请随时发明更多)。到目前为止只有几个固定的。我会用一个更好更现实的例子来更新这篇文章。
  • 对于来自更新的规则,可以使用以下算法。让我们暂时将坐标系旋转 45 度。 (现在我们的三角形的边平行于轴。)显然没有两个点可以在同一条垂直线上。此外,如果点 A 在点 B 的 left 处,它一定比 B。因此我们的规则是(1)选择任意垂直线(在旧坐标将是任意一组平行对角线); (2) 在每条线上按降序选择一个点。 (值可以是任意的,只是降序很重要。)
  • 如您所见,简化规则的算法已经相当复杂。对于更复杂的规则,我想它会更加复杂。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    • 1970-01-01
    • 2016-11-05
    • 1970-01-01
    • 2021-01-25
    • 1970-01-01
    • 2011-10-10
    相关资源
    最近更新 更多