web-dev-qa-db-ja.com

プライオリティキューにより複雑さを解消

JavaのPriority Queueクラスのremove()関数の複雑さ(big-oh)は何ですか?文書化されたものはどこにも見つかりません。要素を削除してからツリーを再シャッフルする前に要素を見つける必要があることを考えると、それはO(n)だと思います。しかし、私は反対し、O(logn)だと思う他の人を見てきました。何か案は?

29
samturner

混乱は実際には「削除」機能が原因です。 Javaには、2つの削除関数があります。

  1. remove()->これはヘッド/ルートを削除するためのもので、O(logN)時間かかります。

  2. remove(Object o)->任意のオブジェクトを削除します。このオブジェクトを見つけるにはO(N)時間かかり、削除するにはO(logN)時間かかります。

29
Chen

削除の複雑度はO(N)です。これは、containsの複雑度がO(N)(Javaの優先度キュークラス)であるため)

これを行う1つの方法O(logN) in your own Priority Queueの実装は、HashMapのような補助データ構造を維持し、優先度キューは、キュー内のその位置にあるので、いつでも-任意の値のインデックス位置がわかります。

この変更は既存の操作の実行時間には影響しないことに注意してください。ヒープの操作中にマッピングを更新するだけで済みます。

25
Hari

Oracleのドキュメントによると、「実装に関する注意:この実装では、O(log(n)) enqueing and dequeing methods(offer、poll、remove()および追加); remove(Object)およびcontains(Object)メソッドの線形時間、および取得メソッド(ピーク、要素、サイズ)の一定時間。

Oracle Docへのリンク

5
Bad Green