运行嵌套for循环而不重复变量?

时间:2012-07-12 17:01:44

标签: performance for-loop nested-loops

是否有一种有效的方法来运行嵌套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次数字检查,包括添加,平方和平方根。

谢谢,并对可能不寻常的伪代码(以及不断编辑)表示抱歉。

2 个答案:

答案 0 :(得分: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]);
    }
}

答案 1 :(得分:0)

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

您将无法找到您提供的有限详细信息的解决方案。什么是“有用的东西”?

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

因此,如果你正在寻找组合,而不是排列,你可以修改它以通过6的事实很容易地减少工作量,通过在每个内部循环中开始j大于i,并且k大于j。