バイナリヒープの場合、O(log(n)) for insert、O(log(n)) for delete minがあり、ヒープ構築を行うことができますO(n)で。
Djikstraでバイナリヒープを使用する状況では、私の試験論文では、頂点の優先度が変更されるヒープの「更新」が含まれていました。
この更新の時間の複雑さは、O(n) upheapまたはdownheap。これはO(n + log(n))で、これは単にO(n)です。
残念ながら、これは間違った答えにつながると思います。
それでは、バイナリヒープの優先度更新の実際の時間の複雑さは何ですか?
問題を解決する鍵は、要素の挿入時に特別なオブジェクトを返すことです。ヒープ内の実際のオブジェクトを移動すると、このオブジェクトの位置が更新されます。
減少優先度を呼び出すには、このオブジェクトを渡して、ヒープ内の位置に直接移動し、必要に応じて要素をバブルアップします。
このように、それはO(log(n))です。実際、要素の検索はO(1)であり、ヒーププロパティの復元はO(log(n))です。
追伸新しい優先度が実際に下がっているかどうかを確認する必要があります。
Scara95 とは少し異論があります。あなたの答えの文脈がなければ、これはあなたの答えが間違っているかどうかは、おそらく教訓の問題である可能性があるようです。技術的には、はい、そうではありませんO(N) + O(log(N))要素の位置を一定の時間で見つけることができるためです。ただし、これにはバイナリヒープに合わせて完全に異なるデータ構造が必要です。挿入された要素を ハッシュテーブル にマップする必要があります。また、ハッシュテーブルに新しいエントリを挿入する優先度、つまり場所を値として持つ、挿入したばかりの要素の一意のハッシュ。
更新するには、更新する優先キューの要素のIDを使用してハッシュテーブルにクエリを実行し、ハッシュテーブル要素の値を取得して、優先キュー要素を更新する場所を見つけます。
ただし、この時点では、バイナリヒープだけではなく、バイナリヒープとハッシュテーブルがあります。ヒープを更新する実際の関数は2つのデータ構造から分離できないため、間違いなく新しいデータ構造です。実際には、バイナリヒープを実装できますが、ハッシュテーブルを含めない場合、更新の複雑さはO(N)よりも良くなることはありません。新しいアルゴリズムに関する論文を見つけることもよくあります。/data-structuresは実際には同じデータ構造ですが、新しいコンポーネントでは、多くの場合、ハッシュテーブルと同じように他のデータ構造が混合されているため、この全体の作業はさらに混乱します。
結論としては、バイナリヒープの更新の複雑さの可能性について質問があった場合、答えは間違っていて、質問はありませんでしたが、クラスで話し合ったことに関して質問がより具体的である場合、特定の方法で形成されたバイナリヒープについて話すと、状況はさらに複雑になります。