web-dev-qa-db-ja.com

ヒープ内の要素を検索する

O(logN)時間の複雑さで、要素が含まれているかどうかを検索するためにヒープを使用できることを思い出しました。しかし、突然詳細を取得できません。getmindeleteしか見つけることができません。追加など。

誰かがヒントを与えることはできますか?

29
skydoor

要素が内部にあるかどうかを判断するには、ヒープ内のすべての要素を検索する必要があります。

ただし、1つの最適化が可能です(ここでは最大ヒープを想定しています)。検索している要素よりも値が小さいノードに到達した場合、そのノードからさらに検索する必要はありません。ただし、この最適化を使用しても、検索は依然としてO(N)(平均でN/2ノードをチェックする必要があります)です。

47
Anonym Mus

手遅れですが、ここでつまずくかもしれない人のためにこれを追加します。

ヒープをそのまま検索すると、O(N))時間が必要になります。ただし、1回のヒットで、配列内のすべての要素を順番にポップする前処理を実行できる場合は、 O(N.logN)で並べ替えられた配列を取得します。実質的にはヒープの並べ替えです。新しい並べ替えられた配列は、O(logN)時間で検索できます。

1
Ankur

私が探しているのはBST(二分探索木)だと思います。

0
zarkon

ヒープの値にインデックスを追加すると、この問題を解決できます。 pythonでは、辞書を使用して行うことができます。最小ヒープで操作を実行するたびに、辞書内のノードのインデックスを更新します。

これは、最小ヒープの長さが非常に長く、最小ヒープを何度も検索する場合にのみ実装する必要があります。インデックスを追跡するためのコーディングにはオーバーヘッドが必要ですが、これによりプログラムの速度が少なくとも50〜60%向上します。

0
user3829269