仕事に効くコンピュータサイエンス
頑張りはスケールしない — 計算量読了目安 10分

計算量とは何か — 増え方を測る物差し

「この作業、件数が増えたら大変になりますか」。上司にそう聞かれて、即答できるでしょうか。

多くの場合、実際に件数が増えてから初めて「思ったより重い」と気づきます。見積もりを外した本人は、たいてい「事前に予測できるとは思わなかった」と振り返ります。

このページの問いは、増え方をあらかじめ言葉にする物差しはあるか、です。コンピュータサイエンスでは、この物差しをO記法と呼びます。

O記法という考え方

O記法とは、処理する対象の数(入力の大きさ)を「n」としたとき、必要な作業量がnに対してどんな式で増えるかを表す書き方です。細かい速さの違いは無視して、増え方の「型」だけを取り出します。

なぜ細かい速さを無視するのでしょうか。理由は単純です。作業する人の熟練度やその日の調子といった細かい差は、規模が大きくなるにつれて誤差に埋もれていきます。一方、「増え方の型」の違いは、規模が大きくなるほど効いてきます。長期的に効くほうを先に見る、というのがO記法の発想です。

たとえるなら、天気予報が「今日は何度か」ではなく「今週は暑くなる傾向か、涼しくなる傾向か」を先に伝えるようなものです。細かい日々の変動より、大きな流れをつかむことが、先の見通しには効きます。

代表的な型には、次のようなものがあります。

  • 一定(O(1)): 件数が増えても、作業量は変わらない
  • 線形(O(n)): 件数が2倍になれば、作業量も2倍になる
  • 二次(O(n²)): 件数が2倍になれば、作業量は4倍になる
  • 指数的(O(2ⁿ)): 件数が1件増えるごとに、作業量が2倍になる

数式に見えますが、実際には「これは増員に強い作業か、弱い作業か」を判断するための言葉です。1つずつ、仕事の場面に置き換えて確認していきます。

ここで1つ、よくある勘違いを片づけておきます。「O記法は理系の道具で、自分の仕事には関係ない」という声です。しかし実際にO記法が答えようとしている問いは、誰の仕事にも共通します。「これは何件までなら今のやり方で耐えられるか」という問いです。この問いに数式は要りません。型さえ分かれば十分です。

一定の作業 — テンプレートを1つ取り出す

決まったテンプレートを1つ、手元から取り出して使う。これは件数によらず一定の手間です。取引先が10社になっても100社になっても、テンプレート自体を探す手間は変わりません。

4章で見たキャッシュのように、あらかじめ整えて手元に置いてあるものを使う作業は、規模が増えても重くならないという性質を持ちます。一定の作業は、O記法の中でもっとも扱いやすい部類に入ります。

たとえば、問い合わせ対応の定型文を1つ思い浮かべてください。「お問い合わせありがとうございます」から始まる書き出しは、問い合わせが何件来ようと、コピーして貼り付けるだけです。件数が10倍になっても、この書き出し部分にかかる手間は変わりません。一定の作業を見分けるコツは、「対象を1つ選んだあとの手間が、他の対象の数に左右されないか」を確認することです。

線形の作業 — 全員に個別メールを送る

10人への個別メールは10通書きます。20人になれば20通です。件数と手間が比例して増える。これが線形の作業です。

具体的な手順を思い浮かべてください。宛先を選び、本文を書き、送信する。この一連の動作を、対象の数だけ繰り返します。1件あたりにかかる時間はほぼ一定なので、全体の時間は件数にそのまま比例します。

線形の作業は、増えても「予想どおりに」重くなるという意味で扱いやすい部類です。2倍になったら2倍の時間がかかると分かっていれば、見積もりを立てやすいからです。「今回は50件だから、前回の30件のときの1.7倍くらいの時間を見ておこう」というような予測が、大きく外れません。

線形の作業のもう1つの利点は、人を増やしたときの効果が見込みやすいことです。1人で10通のメールに1時間かかるなら、2人に分ければおおよそ30分で終わります。件数と手間が比例しているからこそ、分担の効果も比例して見込めます。この単純さは、二次や指数的な作業には期待できません。

二次の作業 — 全員のスケジュールを総当たりで突き合わせる

前ページで見た会議調整のように、全員と全員を突き合わせる作業は二次の増え方をします。5人なら10通りの組み合わせ、10人なら45通りの組み合わせです。

手順で考えると、こうなります。Aさんの予定をBさん、Cさん、Dさんと順に突き合わせる。次にBさんの予定をCさん、Dさんと突き合わせる。すでに済んだ組み合わせは飛ばしながらも、確認すべきペアの数は人数が増えるほど急に増えていきます。

厄介なのは、少人数のうちは軽く感じられることです。5人なら10通りは苦になりません。しかし人数が増えるにつれ、体感の重さと実際の作業量の差が急に開いていきます。「あと数人増えるだけだから大丈夫」という感覚が、そのまま裏切られるのが二次の作業の特徴です。

もう1つ、二次の作業の見分け方を挙げます。「新しい対象が1つ増えたとき、確認すべき相手が今いる全員に及ぶかどうか」です。新しいメンバーが1人入っただけで、既存メンバー全員と情報共有し直す必要があるなら、その作業はほぼ確実に二次の増え方をしています。逆に、新しい対象が独立して処理できるなら線形です。

指数的な作業 — 全ての組み合わせを検討する

たとえば、5人のメンバーで「参加する・しない」の全パターンを検討するとします。パターンの数は2の5乗、32通りです。メンバーが10人になると、1024通りに跳ね上がります。

会議室の予約担当者が、5つの候補日程それぞれについて「使う・使わない」を全部書き出して比較しようとしたら、32通りの表を作ることになります。候補日が10に増えれば、表は1024行です。誰もそんな表を最後まで見ません。

指数的な増え方をする作業は、件数がわずかに増えるだけで、現実的な時間では終わらなくなります。全パターンを人力で検討するのは、少人数のうちしか成立しない発想だと知っておく必要があります。

企画案の組み合わせを検討する場面でも同じことが起こります。3つの施策それぞれに「実施する・しない」があるなら8通りで済みますが、施策が8個に増えると256通りです。「全部の組み合わせを比較してから決めよう」という誠実な姿勢が、かえって決定を止めてしまうのが指数的な作業の怖さです。

仕事の言葉に翻訳する

O記法は、次のような問いに答えるための道具として使えます。

  • この作業は、件数が増えても比例的に重くなるだけか(線形)
  • それとも、関係者同士の組み合わせが効いてくる作業か(二次)
  • あるいは、選択肢の掛け合わせで爆発的に増える作業か(指数的)

新しい仕事を任されたとき、「これは何人までなら耐えられる作業か」を先に見積もることができます。線形の作業なら人数を増やせば概ね対応できますが、二次や指数的な作業は、人数を増やすほど確認や調整の負荷が跳ね上がるため、別の対処が必要になります。

判断の手順はシンプルです。まず、その作業が「1件ずつ独立して片付くか」を確認します。独立して片付くなら線形に近いはずです。次に、「関係者同士のやり取りが発生するか」を確認します。発生するなら二次を疑います。最後に、「選択肢を掛け合わせて比較しているか」を確認します。掛け合わせているなら指数的の可能性があります。

実際の場面で試してみましょう。「新製品の説明会を、10の取引先に個別開催する」という仕事は、1件ずつ独立して片付くので線形です。一方「10の取引先の担当者全員を集めて、意見をすり合わせながら1つの合意を作る」という仕事は、関係者同士のやり取りが発生するため二次に近づきます。

同じ「10の取引先」を相手にした仕事でも、進め方によって増え方の型は変わります。個別に済ませられる仕事を、あえて全員参加の合意形成にしてしまうと、線形で済んだはずの作業を二次に変えていることになります。進め方そのものが増え方を左右するという点は、覚えておく価値があります。

落とし穴

O記法の直感を使うときによくある誤解が2つあります。

1つ目は、「今は少人数だから、増え方の型は気にしなくていい」という油断です。二次や指数的な作業は、規模が小さいうちは線形の作業と体感が変わりません。違いが表面化するのは、規模がある程度大きくなってからです。「今のところ問題ない」という報告を鵜呑みにすると、増え方の型を見誤ります。

「規模が小さいうちに手を打つべきでは」と思うかもしれませんが、逆にまだ規模が小さい段階で仕組みを作りすぎると、次の落とし穴になります。見極めが必要なのは、その仕事がどこまで育つ見込みかという規模の予測です。予測がつかないうちは、まず型だけを見極め、対処は規模が育ち始めてから考えても間に合うことが多いのです。

2つ目は、増え方の型を細かい速さの違いと混同することです。O記法が見ているのは「型」であって、「今どれだけ速いか」ではありません。一時的に頑張って速くこなせても、増え方の型そのものは変わらないという点に注意が必要です。

「うちのチームは優秀だから大丈夫」という反論もよく聞きます。しかし優秀さが効くのは、同じ型の中での速さの差です。二次の増え方をする作業を優秀なメンバーが担当しても、増え方の型そのものは二次のままです。規模がある水準を超えれば、優秀さだけでは追いつかなくなります。

もう1つ、「増え方の型を気にしすぎると、身動きが取れなくなるのでは」という懸念もあります。しかし型を見積もることは、作業を止める理由にはなりません。むしろ、二次や指数的な作業だと分かった時点で、次のページ以降で見る「前処理」や「やり方を変える」といった対処に早く着手できます。型を知ることは、慎重になるためではなく、早く手を打つための材料です。

まとめると、O記法は難解な数式ではなく、「この作業はどこまで増えても平気か」を先に見積もるための、実務上の習慣です。次のページでは、線形・二次・指数という3つの型を、さらに具体的な仕事の場面で見比べていきます。

持ち帰り

  • 増え方には一定・線形・二次・指数的という代表的な型がある
  • 少人数のうちは、二次や指数的な作業も線形の作業と体感が変わらない
  • 新しい仕事を任されたら、まず増え方の型を見積もる習慣を持つ

やってみる

今週引き受けた仕事を1つ選び、「一定・線形・二次・指数的」のどれに近いかを、その仕事の手順を思い出しながら理由とともに言葉にしてみてください。