【问题标题】:Running nested for loops without repeating variables?运行嵌套for循环而不重复变量?
【发布时间】:2012-07-12 17:01:44
【问题描述】:

是否有一种有效的方法来运行嵌套的 for 循环,避免任何具有相同值的计数器。显然,我可以运行一些 if 语句,如下所示,但是有没有更有效的方法?

for i = 1 to 20:
    for j = 1 to 20:
        if (i == j):
            continue
        else:            
            for k = 1 to 20:
                if (i == k) or (j == k):
                    continue
                else:
                    do something useful with these different numbers

编辑:变量不可互换,因此 [2, 1, 0] 与 [0, 1, 2] 不同。 “做一些有用的事情”将是对数字进行大约 6 次数字检查,包括对它们进行加法、平方和平方根。

感谢,对于可能不寻常的伪代码(以及不断的编辑)感到抱歉。

【问题讨论】:

  • 您可以通过反转 if 的逻辑(分别为 i!=j(i!-k) and (j!=k))来摆脱 else 部分,但这并不是真正的效率,而是可读性。
  • 循环的嵌套会影响性能(由于对分支预测和内存局部性的影响),但这取决于“用这些不同的数字做一些有用的事情”的内容。

标签: performance for-loop nested-loops


【解决方案1】:

这看起来是最有效的方法。你的方法有什么问题?

我将忽略我想不出任何理由需要这样做的部分......所以如果您有具体案例,请分享?除非您尝试将某个项目与列表中的所有其他项目进行比较,否则我猜?

可以这样做

list = {1,2,3,4,1,2,3,4} \\where list[0] will return 1, and list.size() will return 8
for(int i = 0; i < list.size()-1; i++){
    for(int j = i + 1; j < list.size(); j++){
        System.out.println(list[i] + "," + list[j]);
    }
}

这样你就不会在你已经比较过的东西之间重复比较。

三个巢

list = {1,2,3,4,1,2,3,4} \\where list[0] will return 1, and list.size() will return 8
for(int i = 0; i < list.size()-2; i++){
    for(int j = i + 1; j < list.size()-1; j++){
        for(int k = j + 1; j < list.size(); k++){
            System.out.println(list[i] + "," + list[j] + "," + list[k]);
    }
}

【讨论】:

  • 这是一个数学问题,其中三个变量都不允许相同,我是蛮力的,所以我试图让一切尽可能高效。
  • 我会使用其他优化,但我认为将它们放在原始问题中会混淆问题,我不想对它们提供任何帮助。问题是:unsolvedproblems.org/index_files/MagicSquare.htm,我知道我不会有这样未解决的问题,这更有趣。
  • 好吧,只要 i、j 和 k 都可以互换,那么我的回答比你开始的更有效。将 list.size() 替换为搜索的终点。我的解决方案更好,因为它减少了一半的计算,而不是重复已经尝试过的测试。
  • 在您的魔方案例中,您可能希望在我的程序中创建多个测试用例,或者在您的程序中创建单个测试用例。但从长远来看,它们会平均相同数量的计算
  • i、j 和 k 恐怕不能互换。但是,您的帖子引起了我的注意,如果我自己无法解决问题,我可能会提出一个新问题。所以谢谢。哦,我这样做的方式比使用 9 个 for 循环更成熟,方块中的每个数字一个,以防万一。
【解决方案2】:

在这里你唯一可以节省效率的就是你的循环逻辑。假设你正确地实现它,总会有 20*19*18 的操作要做。

如果您提供的细节有限,您将无法找到解决方案。什么是“有用的东西”?

如果事实证明对于该操作,i、j 和 k 的各个值无关紧要,只需 3 个数字的组合,那么是的,您可以显着节省效率。使用当前设置,您将传入 (i,j,k) 值 (1, 2, 3) (1,3,2) (2,1,3) (2,3,1) 等。 .

因此,如果您正在寻找组合,而不是排列,您可以通过在每个内部循环中开始 j 比 i 大一和 k 比 j 大一来修改它以非常轻松地减少 6 个事实。

p>

【讨论】:

  • 我已经编辑了问题以包含这个,我最初应该这样做。谢谢。
猜你喜欢
  • 2017-10-10
  • 1970-01-01
  • 2022-01-04
  • 1970-01-01
  • 2018-12-25
  • 2016-11-15
  • 1970-01-01
  • 1970-01-01
  • 2017-06-21
相关资源
最近更新 更多