1

私は考えていた。Rubyで配列に別の配列が含まれているかどうかをテストする最速の方法は何ですか? そこで、この小さなベンチマーク スクリプトを作成します。比較方法についてご意見をお聞かせいただければ幸いです。他にもっと良い方法を知っていますか?

require 'benchmark'
require 'set'

a = ('a'..'z').to_a.shuffle
b = ["b","d","f"]

Benchmark.bm do |x|
  x.report do
      10000.times do
          Set[b].subset?(a.to_set)
      end
  end
  x.report do
      10000.times do
          (a & b).count == b.size
      end
  end
    x.report do
      10000.times do
          (a.inject(0) {|s,i| s += b.include?(i)?1:0 } == b.size)
      end
    end
    x.report do
      10000.times do
          (b - a).empty?
      end
    end
    x.report do
      10000.times do
          b.all? { |o| a.include? o }
      end
    end
end

そして結果:

     user     system      total        real
 0.380000   0.010000   0.390000 (  0.404371)
 0.050000   0.010000   0.060000 (  0.075062)
 0.140000   0.000000   0.140000 (  0.140420)
 0.130000   0.000000   0.130000 (  0.136385)
 0.030000   0.000000   0.030000 (  0.034405)
4

2 に答える 2

1

データサイズによって異なります。あなたが持っているような小さなデータセットの場合; b.all? { |o| a.include? o }ほぼ毎回より高速です。

ただし、より大きな配列で試してみると。たとえば、1000 要素の配列(a & b) == b.sizeはかなり高速です。

反対のバージョンも試しました: (a | b) == a.size、これは多かれ少なかれ同じでした。

a要素数が 10000 の場合とb要素数が 5000の場合の (コメント付きの) 結果を次に示します。

    user     system      total        real
0.010000   0.000000   0.010000 (  0.004445) # subset
0.000000   0.000000   0.000000 (  0.003073) # & (intersection)
1.620000   0.000000   1.620000 (  1.625472) # inject
0.000000   0.000000   0.000000 (  0.004485) # difference
0.530000   0.000000   0.530000 (  0.529042) # include
0.010000   0.000000   0.010000 (  0.004416) # | (union)
于 2013-02-08T17:33:38.493 に答える