ルート以外のオブジェクトを削除(または優先度を変更)する必要がある場合、dヒープは必ずしも理想的なデータ構造ではありません。ノードはその位置を変えず、さまざまな動きを追跡する必要があります。しかし、それは可能です。このようなヒープを使用するには、新規に挿入されたオブジェクトへのハンドルを返します。このハンドルは、置かれている何らかのノードを識別します。 dヒープアルゴリズムはツリーが完璧にバランスの取れたツリーであるため、実際には配列を使用してツリーを実装する必要があります。これらの2つの要件(配列を使用し、ノードを置いたままにする)は相互排他的なので、両方を実行し、ノードから配列へのインデックスを持たなければなりません(配列内のオブジェクトの位置を見つけることができます)ノードへの配列(位置が変わったときにノードを更新できるように)ほとんどの場合、ノードを多く動かすことは望ましくありません。つまり、複数のノードを検索することによってノードを移動する正しい方向を見つけることができます。つまり、広告> 2を使用します。
本質的にノードベースのヒープです。特に、特定の使用パターンに対して得られるフィボナッチヒープは、通常のO(ln(n))の複雑さよりもより償却された複雑さを有する。ただし、ノードの優先度を頻繁に変更する必要がある場合や、データセットがかなり大きい場合は、実装するのがいくらか難しく、実際の効率はほんのわずかです。
はい、ヒープ内の要素を削除したいと思います。最大値または最小値ではありません。任意の要素を削除するには、const時にそれを見つけて、heapify()プロシージャを実行する必要があります(ヒープで順序を保持する)。しかし、問題はconst timeでその要素を見つけることです。 – JosephConrad
あなたはそれを言ったことはありません、あなたは要素を取り除くことができないこと、そしてベクトルを使うことについて何か言いました。ヒープ内で一定の時間内に任意の要素を見つける方法はありません。あなたはlog(n)時間でも見つからない。 –
優先度キューを維持するために念頭に置いておくべきアルゴリズムは、ツリーがバイナリツリーである必要はありません。このアルゴリズムは、2以上のdの値についても同様の複雑さを伴うdヒープに対して機能します。事実、場合によっては、2より大きいdは、オブジェクトを動かすことに比べて比較がしばしば安いため、より効果的です。 –