2

昨日、オーバーラップの範囲を比較することについて質問しましたが、それ以来ずっと頭から離れません。

コンセンサスは、配列の比較はコストがかかるため、配列の交差演算子 (&) を使用することを含む私の好ましい答えは非効率的であるということです。

では、なぜこの機能が言語にあるのだろうか? 言語の作成者は、たとえ費用がかかる場合でも、ソリューションを実現するためのエレガントな方法が必要な場合があると信じていたのでしょうか? 配列の比較は非常にコストがかかるので、可能な限り避けるべきですか? 私にとって Ruby の全体的な魅力は、時期尚早な最適化ではなく、構文の優雅さに重点を置いていることです。

4

4 に答える 4

13

&特に非効率な方法ではありません。受け入れられた回答に対する批判を誤解したと思います。

範囲を配列に変換するため、推奨されるソリューションは非効率的です。

のような範囲1..10000は、メモリ フットプリントが比較的小さく、開始点と終了点のみを格納します。しかし、これを配列に変換すると、10,000 エントリすべてにメモリが割り当てられます。

于 2009-03-31T17:06:10.153 に答える
0

試験的には悪くないようです。マシンは i7(2.0Ghz デュアルコア)

#!/bin/ruby
require 'benchmark'
n = []
1.upto(10_000_000) do |i|
  n << i
end

m = Array.new(1000000){ rand(10_000_000)+1 }

Benchmark.bm(10) do |x|
  x.report('array_intersection'){ n & m }
end

                    user     system      total        real
array_intersection  2.870000   0.040000   2.910000 (  2.895202)
于 2012-07-26T00:13:48.490 に答える