いいえ、ハードウェアはアルゴリズムの複雑さに影響しません。
しかし、それはアルゴリズムの選択に影響を及ぼし、複雑性分析の有用性に影響を及ぼし、分析がほとんど意味をなさない(または単に学術的関心の対象となる)こともあります。
(配列要素へのアクセスとして)正しい引き出しを見つけるには、「線形検索」または「バイナリ検索を行う」アルゴリズムではなく、「インデックスによってN番目の要素を直接開く」アルゴリズムを使用します。アルゴリズムは変更されませんが、選択は変更されます。
一方、複雑さの分析自体、またはむしろその意義は、ハードウェアの影響を大きく受けます。
複雑性分析によって恒星である多くのアルゴリズムは、パフォーマンスが低いか、実際には役に立たないことがあります。これは、重要でない定数因子がまったく重要ではなく、支配的だからです。
または、かつては真であった(またはほとんど真であった)仮定はもはや成り立たないためです。たとえば、すべての操作はほとんど同じであるか(重要でない小さな一定の違いのみ)、またはどのメモリ位置にどの順序でアクセスしても違いはありません。複雑さの分析により、あるアルゴリズムは非常に多くの操作しか必要としないため、非常に優れていると結論付けることができます。実際には、各操作が保証されたキャッシュミス(またはさらに悪いことにページフォールト)を引き起こすことがあります。これにより、kは非常に大きくなり、重要ではなくなりますが、すべてを支配します。
アルゴリズムAが特定のサイズのデータセットを処理するために500の操作を行い、アルゴリズムBが5だけであるが、Bがそれぞれ2,000万サイクルを燃やす5つのフォールトを引き起こす場合、分析または常識からわかるように、Aの方が優れています。
これは、例えば数年前のカッコウハッシングのような面白い驚きにつながりました。[利点の長いリスト]のおかげで非常に優れていました。誇大広告が冷めた後、すべてのアクセスで2つのキャッシュミス(より大きなデータセットの場合)が保証されたため、非常に劣っていたことが判明しました。
データのサブセットの識別と処理についても同様のことが起こりました。多くの場合、正しい解決策は次のとおりです。「すべてを実行する」、つまり、必要なことを把握して実行する代わりに、必要なデータセットの半分だけを直線的に処理します。信じられないかもしれませんが、ブランチの予測ミス、キャッシュミス、ページフォールトがないため、高速です。
3MBファイルの最初の8kBと最後の3kBを読む必要がありますか?さて、完全なファイルを読んで、望まないものを捨ててください。なぜなら、その間のシークは完全なものを読むよりも10倍遅くなるからです。
対数の複雑さがあるため、マップを使用しますか?または、アクセス時間が一定のハッシュテーブルですか?絶え間ない音。さて、1000個程度(ハードウェア、データサイズ、アクセスパターンに依存する)未満のものについては、線形検索の方が優れている場合もあります。驚き。
したがって、影響を受けるのはアルゴリズム自体ではなく、その有用性と選択です。