2

同じ値を持つカウンターを回避して、ネストされた 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 つの数値チェックです。

ありがとう、そしておそらく異常な疑似コード (および絶え間ない編集) について申し訳ありません。

4

2 に答える 2

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

そうすれば、すでに比較したものの間で比較を繰り返さなくなります。

巣3つ分

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]);
    }
}
于 2012-07-12T17:04:13.617 に答える
0

ここで効率を節約できる唯一のものは、ループロジックです。正しく実装すると仮定すると、実行する操作は常に 20*19*18 になります。

あなたが与えた限られた詳細で解決策を見つけることはできません. 「役に立つもの」とは?

その操作で、i、j、および k の個々の値は問題ではなく、3 つの数値の組み合わせだけであることが判明した場合、はい、大幅な効率の節約を行うことができます。現在の設定では、(i,j,k) 値 (1, 2, 3) (1,3,2) (2,1,3) (2,3,1) などを渡します。 .

したがって、順列ではなく組み合わせを探している場合は、各内部ループで i より 1 大きい j と j より 1 大きい k を開始することで、非常に簡単に 6 分の 1 に労力を削減するように変更できます。

于 2012-07-12T17:22:40.253 に答える