O() はただの O(N²) でしょうか?
はい。
N が大きい場合、N² 項が実行時間を支配するため、他の項はもはや問題になりません。
たとえば、N = 10 の場合、あなたの例では、150⋅N² はすでに 15000 ですが、3⋅N = 30 および 11⋅log₂(N) = 36.5 であるため、非 N² 項は合計数の 0.44% しか占めません。ステップ。
N=100、150⋅N² = 1500000、3⋅N = 300、11⋅log₂(N) = 73.1 の場合、N² 以外の項は総ステップ数の 0.025% しか占めません。
そのため、N が大きくなると、低次項の関連性が低下します。
また、複雑度の低いアルゴリズムを常に使用する必要がありますか?
いいえ。Big-O 表記法は、N が大きくなったときの漸近的な動作のみを記述し、一定係数のオーバーヘッドを含まないため、オーバーヘッドが少ない最適化されていないアルゴリズムを使用する方がよい場合がよくあります。
あなたの例では、あなたが解決しようとしている問題に対してランタイム T'(N) = 10⋅N³ を持つ代替アルゴリズムがある場合、N=10 の場合は 10000 ステップしかかかりませんが、あなたの例では 150067 ステップが必要です。 . 基本的に、N ≤ 15の場合は T'(N) アルゴリズムが高速になり、 N > 15 の場合は T(N) アルゴリズムが高速になります。したがって、N > 15 が発生しないことが事前にわかっている場合は、理論的に効率の低いアルゴリズム T'(N) を選択することをお勧めします。
もちろん、実際には、次のような他の多くの考慮事項もあります。
- ライブラリや Web などで再利用できるアルゴリズムの可用性。
- 自分で実装する場合: 実装の容易さ
- アルゴリズムが複数のコアまたは複数のマシンに簡単に拡張できるかどうか