广度第一次迭代?

时间:2013-10-16 08:33:41

标签: algorithm search iteration

如果我们希望覆盖搜索空间,例如所有三元组(x, y, z),其中xyz介于1之间n,我们可以使用嵌套循环来执行此操作:

for (int x = 1; x <= n; x++)
   for (int y = 1; y <= n; y++)
      for (int z = 1; z <= n; z++)

这会生成三元组:(1, 1, 1)(1, 1, 2)(1, 1, 3)(1, 1, 4)等等,并且实际上是“深度优先搜索”或深度优先迭代。

有没有办法以更“宽广的第一”方式进行迭代?这样的迭代将按照类似于以下的顺序生成三元组:

(1, 1, 1)(2, 1, 1)(1, 2, 1)(1, 1, 2)(2, 2, 1)(2, 1, 2)(1, 2, 2)(2, 2, 2)(3, 1, 1)等......

是否还有一个会生成这种模式的算法名称?

2 个答案:

答案 0 :(得分:0)

这个C#代码生成我描述的模式,并且顺序很好,但我觉得有更好的方法可以做到。

void Visit(ISet<Tuple<int, int, int>> pSet, int pX, int pY, int pZ) {
   var value = Tuple.Create(pX, pY, pZ);
   if (pSet == null)
      Console.WriteLine(value);
   else if (!pSet.Contains(value)){
      pSet.Add(value);
      Console.WriteLine(value);
   }
}

void Iterate() {
   const int n = 5;
   for (int x = 1; x <= n; x++) {
      var set = new HashSet<Tuple<int, int, int>>();
      for (int y = 1; y <= x; y++)
         for (int z = 1; z <= y; z++) {
            Visit(set, z, y, x);
            Visit(set, z, x, y);
            Visit(set, y, z, x);
            Visit(set, y, x, z);
            Visit(set, x, z, y);
            Visit(set, x, y, z);
         }
   }
}

此代码生成模式而不维护任何列表或执行任何冲突检查。我已经确认它会生成没有重复项的n³元组(最多n = 500)。唯一的问题是,这仅适用于迭代3元组的特定情况,而不是任何数量的任何类型的集合。

static void Iterate() {
   const int n = 500;
   for (int x = 1; x <= n; x++) {
      for (int y = 1; y <= x; y++)
         for (int z = 1; z <= y; z++) {
            Visit(z, y, x);
            if (x == y && y == z && x == z)
               continue;

            if (x != y)
               Visit(z, x, y);

            if (z != y) {
               Visit(y, z, x);
               Visit(y, x, z);
            }

            if (x != y && x != z) {
               Visit(x, z, y);
               if (z != y)
                  Visit(x, y, z);
            }
         }
   }
}

答案 1 :(得分:-1)

This should work.  
        for (int x = 1; x <= n; x++)
           for (int y = 1; y <= n; y++)
              {
               for (int z = 1; z <= n; z++)
                {  
                  enqueue(the x-y-z triplet);
                }
                  print(till the queue empties);
                }
Sorry for my pseudo-C.