1

ルビーでは、次のような擬似コードに違いはありますか:

if n > 2:
   do something to A
end

if n > 4:
   do something to B
end

if n >25:
   do something to C
end

if n>2 && n <4:
  do something to A
elif n >4 && n < 25:
  do something to A and do something to B
elif n > 25:
  do something to A and B and C
end

if thenご覧のとおり、これらは同じことを行いますが、ステートメントが多数ある場合は、読み書きが簡単です。ただし、複数のifブロックがより多くの処理能力を占有している場合は、そのように記述する価値はありません。

したがって、2つに違いがあるかどうか疑問に思っていますか?概念的な答えは問題ありません。ベンチマークを行う必要はありません

4

4 に答える 4

2

1/ それらは同等ではありません。

最初のステートメントは次と同等です

if n>2 && n <= 4:
  do something to A
elif n > 4 && n <= 25:
  do something to A
  do something to B
elif n > 25:
  do something to A
  do something to B
  do something to C
end

またはをdo something to A返す場合、2 番目のステートメントは実行されません。nilfalsedo something to B

n = 4また、 や などのコーナー ケースを処理するのを忘れていましたn = 25

2/ 99.9% のケースで、読みやすく、理解しやすく、デバッグしやすいバージョンを選択する必要があります。このコードが毎秒 1000000 回実行されていない限り、これは問題になりません。ご覧のとおり、時期尚早に最適化しようとして、すでに 2 つの潜在的なバグを作成しています :)

3/ パフォーマンスに関しては、短い答えは次のとおりです。それはデータに依存します。

n長い答えは次のとおりです。ほとんどの場合、どの範囲になるかを予測する必要があります。比較の数を数えることができます:

n < 2: ステートメント 1: 3 回の比較 - ステートメント 2: 3 回の比較

2 < n <= 4: ステートメント 1: 3 回の比較 - ステートメント 2: 2 回の比較

4 < n <= 25: ステートメント 1: 3 回の比較 - ステートメント 2: 4 回の比較

25 < n: ステートメント 1: 3 回の比較 - ステートメント 2: 5 回の比較

于 2013-03-27T22:49:13.150 に答える
1

いいえ違いはありません。どちらのプログラムも構文エラーを返し、実行されません。

于 2013-03-27T23:03:56.203 に答える
0

「最も一般的なパス」を予測できないと仮定すると (たとえば、ほとんどの場合、n が 2 から 4 の間であることがわかっている)、2 番目のアプローチがより効率的であるとは思えません。行われる比較の数は同様になります。

于 2013-03-27T22:34:22.397 に答える
0

最初の選択肢は、論理エラーの可能性を減らします。2 番目の選択肢で、または の場合はどうなりますn == 4n == 25? はい、簡単に修正できますが、その可能性を認識する必要があります。

「何かをする」擬似コードブロックは単なるメソッド呼び出しであると想定しているため、テキストをあまり繰り返さないでください。どちらの方法もネストされた if-else 句を含まないため、答えるのは難しい質問です。if 句はコストの差が非常に小さいため、私はそれを考慮しません。「何かをする」ブロックでの繰り返しも同じです。ただし、より明確な方法を想像できます。A、B、C のすべてが A.handle(n)、B.handle(n)、C.handle(n) のようなメソッドを持つことができます。最初のメソッドは n <= 2 の場合は何もせず、2 番目のメソッドは次の場合は何もしません。 n <= 4 で、n <= 25 の場合、3 番目は何もしませんか?

于 2013-03-27T22:40:14.320 に答える