web-dev-qa-db-ja.com

Java PriorityQueue(ヒープ)n要素の挿入の時間の複雑さ?

n要素の場合のJava PriorityQueue.Add()の時間の複雑さは何かを知りたい。

単一の要素を挿入する潜在的な最悪のケースはO(log(n))であることを理解していますが、n要素のコレクションを挿入するための時間の複雑さは明確ではありませんか?

n要素の優先度キューヒープを構築する時期はO(n)であるという主張(さまざまなソース(証拠なし))からも、O(nlog(n))であるという主張も見ました。挿入がO(log(n))の場合、n倍の乗算は実際にO(nlog(n))と等しくなります。

注:私は悪いケースにのみ興味があり、償却されません。

この質問は、データ構造(ヒープ)にn要素を追加する動作を記述する論理的な方法があることを前提としています。これは、単にn x log(n)挿入を個別に考慮することとは異なります。

私は入力に関して何の仮定もしていません(入力値のセットの境界、または部分的に順序付けられた入力など)。

6
James Wierzba

一般的な場合はO(N log N)です。 O(N)アルゴリズムは、入力が既に順序付けられている特別な場合に存在しますが、これはJava.util.PriorityQueueで提供されていません。

1
user207421

N個の要素の挿入はO(n log n)でなければならないようです

Java PriorityQueueJava Doc

O(log n) time for the enqueing and dequeing methods (offer, poll, remove() and add)

Remove(Object)およびcontains(Object)メソッドのO(n)

O(1) for the retrieval methods (peek, element, and size)

これらの時間の複雑さは、.add()を除き、すべて最悪の場合( wiki )に見えます。 Java Docはこの非バインド構造の拡張についても述べているように、あなたは境界を疑問視する権利があります。

成長ポリシーの詳細は指定されていません

Docにも記載されているように、PriorityQueueは特定の初期容量を持つアレイに基づいています。成長にかかる時間はO(n)時間であると仮定します。この場合、.add()の時間の複雑さも最悪になります。

N要素を追加するための保証されたO(n log n)時間を取得するには、n要素のサイズを指定して、コンテナの拡張を省略できます。

PriorityQueue(int initialCapacity)

EDIT:O(n)建設の時間が正しいという主張に対してコメント)。このプロシージャは、多くの場合 heapify と呼ばれ、O(n) timeでバイナリツリーを構築するために使用される既存の配列に対して機能します。

8
gue