どっちだっけ?を卒業しよう!順列と組み合わせの公式を「一発」で覚える方法

こんにちは。ゆうせいです。

新人エンジニアのみなさん、アルゴリズムの勉強や、テストケースの数を考えるときに、ふと手が止まることはありませんか。

「えっと、これはPだっけ、Cだっけ?」

高校数学で習ったはずの「順列(Permutation)」と「組み合わせ(Combination)」。この2つの違いに、頭を抱えてしまう人は意外と多いものです。

公式を丸暗記しようとするから、忘れてしまうのです。

今日は、この2つの公式を、エンジニアらしく「機能の違い」として理解し、一生忘れない記憶として定着させる方法を伝授します。

もう、テスト前に教科書をひっくり返す必要はありませんよ。

PとCの決定的な違いは「順番」

まず、細かい数式を見る前に、この2つの記号が持つ「性格」の違いを叩き込みましょう。

これさえ分かれば、9割は解決したも同然です。

順列 P (Permutation)

性格:几帳面で、順番にうるさい。

キーワード:並べる、ランキング、役割分担

組み合わせ C (Combination)

性格:おおらかで、メンバーさえいれば順番はどうでもいい。

キーワード:選ぶ、チーム分け、手札

たったこれだけです。

具体例で見てみましょう。

Aさん、Bさん、Cさんの3人から、2人を選ぶとします。

P の場合

「Aさんがリーダー、Bさんが副リーダー」と「Bさんがリーダー、Aさんが副リーダー」は、別のものとしてカウントします。順番(役割)に意味があるからです。

C の場合

「AさんとBさんのペア」と「BさんとAさんのペア」は、同じものとして1回としかカウントしません。二人が選ばれたという事実が変わらないからです。

順列 P の公式と覚え方

では、それぞれの計算方法を見ていきましょう。

まずは、順番にうるさい P からです。

例題:5人の中から3人を選んで、1位から3位までの順位をつける。

このとき、記号では {}_5 P_3 と書きます。

計算のイメージは「カウントダウンの掛け算」です。

1位になれるのは5人いますね。

2位になれるのは、1位の人を除いた4人です。

3位になれるのは、残りの3人です。

つまり、計算式はこうなります。

5 \times 4 \times 3 = 60 通り

公式っぽく書くとこうです。

{}_n P_r = n からスタートして 1 ずつ減らしながら r 個掛け算する

覚え方のコツ

P は「Position(ポジション)」のPだと覚えましょう。

1位、2位というポジション(順番)が大事だから P です。

計算はシンプルに、大きい数から指定された回数だけ掛け算するだけ。「そのまま掛ける」と覚えましょう。

組み合わせ C の公式と覚え方

次は、エンジニアの実務でもよく使う C です。

例題:5人の中から、掃除当番を3人選ぶ。

このとき、記号では {}_5 C_3 と書きます。

掃除当番に1位も2位もありません。「A、B、C」が選ばれるのと、「C、B、A」が選ばれるのは全く同じです。

つまり、さっきの P の計算だと、重複して数えすぎていることになります。

そこで、「並び順の重複分」を割り算して消してあげる必要があります。

3人の並び順は 3 \times 2 \times 1 通りありますよね。これで割るのです。

計算式はこうなります。

\frac{5 \times 4 \times 3}{3 \times 2 \times 1} = 10 通り

公式の構造はこうです。

{}_n C_r = \frac{n P_r}{r!}P の計算結果 \div 選ぶ人数の階乗)

覚え方のコツ

C は「Choose(チューズ=選ぶ)」のC、または「Cut(カット=重複を削る)」のCだと覚えましょう。

計算手順は「 P を作ってから、下で割る」です。

分数線を引き、上にカウントダウンの掛け算、下に選ぶ数のカウントダウンを書く。このビジュアルで覚えてください。

メリットとデメリット

この計算方法を知っておくことには、エンジニアとして明確なメリットがあります。

メリット

テストケースの漏れがなくなる

システムのテストをするとき、「5つの機能から2つを組み合わせて使う」パターンがいくつあるか即座に計算できれば、テスト項目数を見積もることができます。

セキュリティ意識が高まる

パスワードの組み合わせ数( P の考え方)がどれくらい膨大になるか、あるいは逆にどれくらい簡単に破られるかを数値で理解できます。

デメリット

計算量が爆発する

階乗(!)の計算が含まれるため、数が少し増えるだけで答えが天文学的な数字になります。プログラムで実装する際は、桁あふれ(オーバーフロー)に注意が必要です。

直感とズレることがある

「たった10人から選ぶだけなのに、こんなにパターンがあるの?」と、人間の直感を超えた数字が出ることがあり、見積もりを誤る原因になります。

今後の学習の指針

いかがでしたか。

P は「Position」でそのまま掛ける。

C は「Choose」で選んで割る。

このイメージさえあれば、もう迷うことはありません。

これからの学習の指針として、プログラミング言語(Pythonなど)を使って、実際に順列や組み合わせを出力してみることをおすすめします。Pythonなら itertools というライブラリを使えば、一瞬で全パターンをリストアップできます。

「手計算だと大変なことが、プログラムだと一瞬で終わる」という感動を味わうのも、エンジニアの醍醐味ですよ。

さあ、これでまた一つ、エンジニアとしての基礎体力がつきましたね。

自信を持って業務に取り組んでください!

セイ・コンサルティング・グループでは新人エンジニア研修のアシスタント講師を募集しています。

投稿者プロフィール

山崎講師
山崎講師代表取締役
セイ・コンサルティング・グループ株式会社代表取締役。
岐阜県出身。
2000年創業、2004年会社設立。
IT企業向け人材育成研修歴業界歴20年以上。
すべての無駄を省いた費用対効果の高い「筋肉質」な研修を提供します!
この記事に間違い等ありましたらぜひお知らせください。

学生時代は趣味と実益を兼ねてリゾートバイトにいそしむ。長野県白馬村に始まり、志賀高原でのスキーインストラクター、沖縄石垣島、北海道トマム。高じてオーストラリアのゴールドコーストでツアーガイドなど。現在は野菜作りにはまっている。