如果我们希望覆盖搜索空间,例如所有三元组(x, y, z)
,其中x
,y
和z
介于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)
等......
是否还有一个会生成这种模式的算法名称?
答案 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.