gpt4 book ai didi

algorithm - 广度优先迭代?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:25:38 24 4
gpt4 key购买 nike

如果我们希望覆盖一个搜索空间,比如所有三元组 (x, y, z),其中 x, y , 和 z 介于 1n 之间,我们可以使用嵌套循环来做到这一点:

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) 等...

还有生成这种模式的算法的名称吗?

最佳答案

此 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);
}
}
}
}

关于algorithm - 广度优先迭代?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19398628/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com