すべての桁は定数含み、実際にはそれらのいくつかが含まれます。アイテムの数が十分に大きいため、定数は無関係です。問題は、アイテムの数がその定数を支配できるほど小さいかどうかです。C
これを視覚的に考えてみましょう。
すべてに、Y軸上の開始点を決定する開始定数があります。それぞれには、どれだけ速く増加するかを支配する重要な定数もあります。C
- 以下のために、Cは時間を決定します。O(1)C
- は実際には C × nです。ここで、 Cは角度を決定します。O(n)C×nC
- は実際には(C × n )2です。ここで、 Cは曲線のシャープネスを決定します。O(n2)(C×n)2C
使用するアルゴリズムを決定するには、ランタイムが交差するスポットを推定する必要があります。たとえば、起動時間が長いまたはCが高いソリューションは、かなり多数のアイテムで起動時間が短く、Cが低いO (n )ソリューションに失われます。O(1)CO(n)C
これが実世界の例です。あなたは庭を横切ってたくさんのレンガを移動しなければなりません。手でそれらを一度にいくつか動かすか、巨大で遅いバックホウを手に取り、1回の旅行で持ち上げて運転することができます。レンガが3つある場合の答えは何ですか?3000ある場合、あなたの答えは何ですか?
これがCSの例です。常にソートされたリストが必要だとしましょう。順序で自身を保持するツリーを使用できます。または、ソートされていないリストを使用し、O (n log n)で挿入または削除するたびに再ソートすることもできます。ツリーの操作は複雑(定数が高い)で、ソートは非常に単純(定数が低い)であるため、リストは数百または数千のアイテムに勝つ可能性があります。O(logn)O (n ログn)
この種のことを目で確認できますが、最終的にはベンチマークがそれを行うものです。また、通常持っているアイテムの数を目で確認し、さらに手渡されるリスクを軽減する必要があります。また、「アイテムを超えるとパフォーマンスが急速に低下する」または「Xの最大セットサイズを想定する」などの仮定を文書化することもできます。バツバツ
これらの要件は変更される可能性があるため、これらの種類の決定をインターフェイスの背後に置くことが重要です。上記のツリー/リストの例では、ツリーまたはリストを公開しないでください。そうすれば、仮定が間違っていることが判明した場合、またはより良いアルゴリズムを見つけた場合、考えを変えることができます。アイテムの数が増えると、ハイブリッドを実行してアルゴリズムを動的に切り替えることもできます。