ハッシュと検索のタイプを含むアルゴリズムの議論で、O(1)の非常に奇妙な使用法に気づきました。多くの場合、言語システムによって提供される辞書タイプを使用するか、配列を使用して使用される辞書またはハッシュ配列タイプを使用します。 -インデックス表記。
基本的に、O(1)は、一定の時間と(通常は)固定された空間によって制限されることを意味します。いくつかのかなり基本的な操作はO(1)ですが、中間言語と特別なVMを使用すると、ここで考えるものが歪む傾向があります(たとえば、ガベージコレクターやその他の動的プロセスをO(1)アクティビティよりもどのように償却するか)。
しかし、レイテンシーの償却やガベージコレクションなどを無視すると、非常に特殊な条件下を除いて、ある種の検索を含む特定の手法がO(1)になる可能性があるという仮定への飛躍がどのように行われるのかまだわかりません。
これは以前にも気づきましたが、Pandincusの質問に、「C#.NETでO(1)時間にアイテムを取得するために使用する「適切な」コレクション?」という例が表示されました。。
そこで述べたように、保証された境界としてO(1)アクセスを提供するコレクションは、整数のインデックス値を持つ固定境界配列だけです。配列は、O(1)操作を使用してそのインデックスを持つセルを見つけるランダムアクセスメモリへのマッピングによって実装されていると想定されます。
別の種類のインデックス(または整数インデックスを持つスパース配列)の一致するセルの場所を特定するための何らかの検索を伴うコレクションの場合、人生はそれほど簡単ではありません。特に、衝突があり、混雑が発生する可能性がある場合、アクセスは正確にはO(1)ではありません。また、コレクションに柔軟性がある場合は、輻輳が緩和される(たとえば、衝突の発生率が高い、ツリーの不均衡など)基礎となる構造(ツリーやハッシュテーブルなど)を拡張するコストを認識して償却する必要があります。
私はこれらの柔軟で動的な構造をO(1)として話すことを考えたことはありませんでした。それでも、実際にO(1)アクセスを保証するために維持する必要のある条件を特定せずに、O(1)ソリューションとして提供されていると思います(また、その定数は無視できるほど小さいです)。
質問:この準備はすべて、本当に質問のためのものです。O(1)の周りのカジュアルさは何ですか、そしてなぜそれはそれほど盲目的に受け入れられるのですか?O(1)でさえ、ほぼ一定であっても、望ましくないほど大きくなる可能性があることは認識されていますか?それとも、O(1)は、計算の複雑さの概念を非公式な使用に単純に流用しているのでしょうか。困惑しています。
更新:回答とコメントは、私がO(1)を自分で定義することに何気がなかった場所を指摘しており、それを修復しました。私はまだ良い答えを探しています、そしていくつかのケースでは、コメントスレッドのいくつかは彼らの答えよりもかなり面白いです。