0

3 つの文字列を比較し、どれが同じかによって異なるアクションを実行したいと考えています。

私には5つの異なる結果があるようです:

  • それらはすべて同じです (A=B=C)
  • それらはすべて異なっています
  • そのうちの 2 つが同じ (A=B、B=C、または C=A)

5 つの異なる結果を得るために効率的な Ruby コードを書くのに苦労しています。文字列の比較は非常に高価な操作のようで、同じ文字列を繰り返し比較したくありません。

このコードはループ内で実行されるため、最適化を行うことをお勧めします。これは私の Comp Sci の宿題ではなく、現実の問題です :-)

[編集] Sergio のコードをさらに最適化すると、さらに良い結果が得られます。if...then次のようなステートメントまで、3 番目の文字列比較を延期できます。

def compare a, b, c
  ab = a == b
  ac = a == c

  if ab && ac
    1
  elsif ab
    2
  elsif ac
    3
  elsif b == c
    4
  else
    5
  end
end

[編集] Sergiosのコードの私のバージョンを含む、今日与えられたソリューションのベンチマーク:

                   user     system      total        real
sawa1:         0.620000   0.000000   0.620000 (  0.625677)
izomorphius:   0.030000   0.000000   0.030000 (  0.025314)
sergio1:       0.020000   0.000000   0.020000 (  0.018039)
sergio2:       0.030000   0.000000   0.030000 (  0.030210)
dominic:       0.010000   0.000000   0.010000 (  0.015450)

1024 文字の文字列をそれぞれ 10,000 回比較し、結果を 1 ~ 5 の範囲の数値に減らして、5 つの考えられる結果のそれぞれに対して異なるアクションを実行するという元の要件を表しました。

[編集] ベンチマーク コードはこちらhttps://gist.github.com/3871698

4

4 に答える 4

4
h = {a: "foo", b: "boo", c: "foo"}

h.group_by(&:last).values.map{|a| a.map(&:first)}
# => [[:a, :c], [:b]]

または、

h.group_by(&:last)
# => {"foo"=>[[:a, "foo"], [:c, "foo"]], "boo"=>[[:b, "boo"]]}
于 2012-10-10T13:06:06.340 に答える
3
ba=false
ca=false
bc=false
if b == a
  ba = true
  if b == c
    bc = true
    ca = true
  end
elsif c == a
  ca = true
elsif c == b
  bc = true
end

これで、可能な限り少ない文字列比較操作を実行しました。ab、bc、ca 変数を取得したら、それらを使用します。それでおしまい。パフォーマンスに関しては、これ以上向上することはできません (もちろん、コード スタイルはそれに悩まされます)。

于 2012-10-10T12:49:30.737 に答える