どっちだっけ?を卒業しよう!順列と組み合わせの公式を「一発」で覚える方法
こんにちは。ゆうせいです。
新人エンジニアのみなさん、アルゴリズムの勉強や、テストケースの数を考えるときに、ふと手が止まることはありませんか。
「えっと、これはPだっけ、Cだっけ?」
高校数学で習ったはずの「順列(Permutation)」と「組み合わせ(Combination)」。この2つの違いに、頭を抱えてしまう人は意外と多いものです。
公式を丸暗記しようとするから、忘れてしまうのです。
今日は、この2つの公式を、エンジニアらしく「機能の違い」として理解し、一生忘れない記憶として定着させる方法を伝授します。
もう、テスト前に教科書をひっくり返す必要はありませんよ。
PとCの決定的な違いは「順番」
まず、細かい数式を見る前に、この2つの記号が持つ「性格」の違いを叩き込みましょう。
これさえ分かれば、9割は解決したも同然です。
順列 (Permutation)
性格:几帳面で、順番にうるさい。
キーワード:並べる、ランキング、役割分担
組み合わせ (Combination)
性格:おおらかで、メンバーさえいれば順番はどうでもいい。
キーワード:選ぶ、チーム分け、手札
たったこれだけです。
具体例で見てみましょう。
Aさん、Bさん、Cさんの3人から、2人を選ぶとします。
の場合
「Aさんがリーダー、Bさんが副リーダー」と「Bさんがリーダー、Aさんが副リーダー」は、別のものとしてカウントします。順番(役割)に意味があるからです。
の場合
「AさんとBさんのペア」と「BさんとAさんのペア」は、同じものとして1回としかカウントしません。二人が選ばれたという事実が変わらないからです。
順列 P の公式と覚え方
では、それぞれの計算方法を見ていきましょう。
まずは、順番にうるさい からです。
例題:5人の中から3人を選んで、1位から3位までの順位をつける。
このとき、記号では と書きます。
計算のイメージは「カウントダウンの掛け算」です。
1位になれるのは5人いますね。
2位になれるのは、1位の人を除いた4人です。
3位になれるのは、残りの3人です。
つまり、計算式はこうなります。
通り
公式っぽく書くとこうです。
からスタートして
ずつ減らしながら
個掛け算する
覚え方のコツ
は「Position(ポジション)」のPだと覚えましょう。
1位、2位というポジション(順番)が大事だから です。
計算はシンプルに、大きい数から指定された回数だけ掛け算するだけ。「そのまま掛ける」と覚えましょう。
組み合わせ C の公式と覚え方
次は、エンジニアの実務でもよく使う です。
例題:5人の中から、掃除当番を3人選ぶ。
このとき、記号では と書きます。
掃除当番に1位も2位もありません。「A、B、C」が選ばれるのと、「C、B、A」が選ばれるのは全く同じです。
つまり、さっきの の計算だと、重複して数えすぎていることになります。
そこで、「並び順の重複分」を割り算して消してあげる必要があります。
3人の並び順は 通りありますよね。これで割るのです。
計算式はこうなります。
通り
公式の構造はこうです。
(
の計算結果
選ぶ人数の階乗)
覚え方のコツ
は「Choose(チューズ=選ぶ)」のC、または「Cut(カット=重複を削る)」のCだと覚えましょう。
計算手順は「 を作ってから、下で割る」です。
分数線を引き、上にカウントダウンの掛け算、下に選ぶ数のカウントダウンを書く。このビジュアルで覚えてください。
メリットとデメリット
この計算方法を知っておくことには、エンジニアとして明確なメリットがあります。
メリット
テストケースの漏れがなくなる
システムのテストをするとき、「5つの機能から2つを組み合わせて使う」パターンがいくつあるか即座に計算できれば、テスト項目数を見積もることができます。
セキュリティ意識が高まる
パスワードの組み合わせ数( の考え方)がどれくらい膨大になるか、あるいは逆にどれくらい簡単に破られるかを数値で理解できます。
デメリット
計算量が爆発する
階乗(!)の計算が含まれるため、数が少し増えるだけで答えが天文学的な数字になります。プログラムで実装する際は、桁あふれ(オーバーフロー)に注意が必要です。
直感とズレることがある
「たった10人から選ぶだけなのに、こんなにパターンがあるの?」と、人間の直感を超えた数字が出ることがあり、見積もりを誤る原因になります。
今後の学習の指針
いかがでしたか。
は「Position」でそのまま掛ける。
は「Choose」で選んで割る。
このイメージさえあれば、もう迷うことはありません。
これからの学習の指針として、プログラミング言語(Pythonなど)を使って、実際に順列や組み合わせを出力してみることをおすすめします。Pythonなら itertools というライブラリを使えば、一瞬で全パターンをリストアップできます。
「手計算だと大変なことが、プログラムだと一瞬で終わる」という感動を味わうのも、エンジニアの醍醐味ですよ。
さあ、これでまた一つ、エンジニアとしての基礎体力がつきましたね。
自信を持って業務に取り組んでください!