【问题标题】:Enumerating m-tuples of Integers Subject to Implication Constraints枚举受隐含约束的整数的 m 元组
【发布时间】:2010-08-10 23:32:52
【问题描述】:

如何枚举所有非负整数的 m 元组 (a[1],...,a[m]) 受以下约束?

  1. 对于 {1,...,m} 中的每个 i,有一个数 n[i] >= 0 使得 a[i]

    李>
  2. 对于 {1,...,m} 中具有 i,j 的每个有序对 (i,j),有数字 c[i][j], d[i][j] >= 0 使得:

    如果 a[i] > c[i][j],则 a[j]

  3. c[i][j] = c[j][i].

到目前为止,我提出了以下解决方案。有没有更有效的方法来做到这一点?我正在使用 C 或 C++ 编程。

for a[1]=0,...,n[1] do 
{
    for j=2,...,m do
    {
        if a[1] > c[1][j] then n[j]:=min{n[j],d[1][j]}
                          else n[j]:=n[j]
    }
    for a[2]=0,...,n[2] do 
    {
        for j=3,...,m do
        {
            if a[2] > c[2][j] then n[j]:=min{n[j],d[2][j]}
                              else n[j]:=n[j]
        }
        for a[3]=0,...,n[3] do
        {
            .
            .
            .
            for a[m]=0,...,n[m] do
            {
                print (a[1],...,a[m])
            }
        }...}}

我发现此算法存在一个主要的低效率问题。要查看它,为简单起见,取 m=2。对所有 i,j 说 n[1] = n[2] = 2 和 c[i][j] = d[i][j] = 0。现在让我们来看看算法。

从 a[1] = 0 开始:n[2] 不变,因为 a[1]

接下来是a[1] = 1:由于a[1] > c[1][2],所以n[2]在循环中变为min{ n[2],d[1][j] } = 0。我们打印 (1,0)。

最后a[1] = 2:由于a[1] > c[1][2],所以n[2]在循环中变为min{ n[2],d[1][j] } = 0。(我们只是做了和以前一样的事情。这就是效率低下。)我们打印 (2,0)。

备注:对于我的应用,可以假设c[i][j]=d[i][j]。

【问题讨论】:

  • 你想达到什么目的?作业?
  • a[i] 是未知理想的可能素因数的指数。为了确定理想,每个元组都被视为一个案例,并对每个案例进行进一步的计算。不是家庭作业。
  • 我认为详细说明此任务的目的会有所帮助。在没有任何激励因素的情况下,很难提出有用的实施策略。

标签: algorithm integer constraints enumeration tuples


【解决方案1】:

一个有趣的问题。

请注意,时间必然与要枚举的元组数成正比。因此,不可能渐近地改进你所拥有的。

就代码长度而言,这不可能是最佳的,也不是绝对的。您根本不必为每个 i = 1..m

编写单独的 for 循环

稍后我可能会对算法有所了解;但长话短说,运行时间将以 m 为单位呈指数级增长(除了约束等于 1 的琐碎情况。)

【讨论】:

  • 关于代码长度的评论,同样的算法可以更简洁地写成递归。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多