命令型プログラミングのバックグラウンドから、私はやることに慣れています
for (i = 0; i < 1000000; i++) {
for (j = i + 1; j < 1000000; j++) {
doSomething(array[i], array[j])
}
}
100 万要素配列内のすべての一意のペアを調べます。 doSomething
は、対角線上で自明な結果をもたらし、対角線から対称または反対称の結果をもたらす操作です。i == j
(ケースが興味深い場合には、これのマイナーな変形があります。これは簡単に修正できます。)
Scalaでこれをやろうとすると、奇妙なことに立ち往生しています。私は大きなものを持ってList
いて、すべてのペアワイズの組み合わせに何かをしたいのですが、
list.flatMap(x => list.map(y => doSomething(x, y))
すべての冗長または些細なケース (作業量が 2 分の 1) を含み、
(0 until 1000000).flatMap({i =>
(0 until 1000000).map({j =>
doSomething(list(i), list(j))
})
})
リストはランダムアクセスではないため、非常に間違っています(N ^ 2の要素が多すぎます)。に変換できましたLists
がArrays
、それは要点を逃しているように感じます。 Lists
リンクされたリストであるため、私の命令型の例の要素は、現在調べているj + 1
要素から一歩離れたところにあります。i
C / Python /その他で、リンクされたリストに対して効率的な上三角ループを作成できると確信しています。
今のところ、係数 2 を飲み込むことができると思いますが、これは非常に一般的な状況に遭遇するため、適切な解決策があるはずだと感じています。
また、この「上三角ループ」に通称はありますか?適切な検索文字列が見つかりませんでした。
編集:これは悪い解決策の例です:
list.zipWithIndex.flatMap({case (x, i) =>
list.zipWithIndex.map({case (y, j) =>
if (j > i)
doSomething(x, y)
else
Nil
})
})
不要なノードを引き続き訪問するためです。