web-dev-qa-db-ja.com

O(1)複雑さの配列アクセス

高さの配列があり、ステーションが不規則に広がっています。例:arrH=[100 500 1000 2500 4500]。実行時に、高さhを受け取り、hに最も近い高さを含むセル(インデックス)を特定する必要があります。例:h=720 -> arrH[1]。オフラインモードで前処理、辞書/ハッシュテーブルの作成を行うことができます。実行時にO(1)を達成する可能性はありますか?ありがとうございます!

2
rainbringer

最大値が妥当な場合は、長さNのルックアップテーブルを使用して行うことができます。ここで、Nは配列の最大値です。したがって、たとえば、配列は次のようになります。

[2,5,6,9]

次に、次のような配列を作成します。

[0,0,0,1,2,2,3,3,3]

その配列のルックアップはO(1)です

明らかに、これは、配列の作成はO(N) * O(Log(N))である必要があると思うので、配列を変更せずに多くのルックアップがあることを前提としています。

4
Gort the Robot

一般的な場合(つまり、Steven Burnapの小さい最大高さの仮定が成り立たない場合、または浮動小数点値を入力として受け入れる必要がある場合)、あなたの質問に対する答えはノーだと思います。ヒストグラムに不均一なビンを入力するアルゴリズムのシングルパスについて説明しています。 (ヒストグラム構築におけるさまざまなトレードオフの説明については、 このスタックオーバーフローの質問 を参照してください。)

事前にわかっている不均一なビンを使用したヒストグラム母集団アルゴリズムの単純な実装は、O(log n)で実行され、nはビンの数であり、これはarrHの長さに相当します。これは単なる二分探索です。

ただし、上記のリンクが示すように、補間検索では、O(1)のベストケース時間と、O(log n)未満の平均時間が許可されます。さらに、不均一性に応じてビンの分布は、大部分の時間で最良の結果を達成できるということです。

一方、「一定」は必ずしも「小さい」を意味するわけではないため、arrHが比較的小さい場合、またはビンの分布が特に病的である場合は、単純な二分探索を使用するとうまくいく可能性があります。補間検索がかなり良くなり始める変曲点は、プロファイリングを介して決定する必要があります。

簡単に言うと、バイナリ検索(O(log n))が最善の方法かもしれませんが、補間検索を見てください。どちらが良いかは、データに密接に依存します。

4
G Fetterman