web-dev-qa-db-ja.com

セットの時間計算量Java

誰かが以下のコードの時間計算量を教えてもらえますか?

aはintの配列です。

Set<Integer> set = new HashSet<Integer>();
for (int i = 0; i < a.length; i++) {
    if (set.contains(arr[i])) {
        System.out.println("Hello");
    }
    set.add(arr[i]);
}

O(n)だと思いますが、Setを使用していて、メソッドも含まれているのでわかりません。また、addsetメソッドを呼び出しています。

上記のコード全体の時間計算量を誰かが確認して説明できますか?また、どのくらいのスペースが必要ですか?

18
Mike

配列をループするため、そのO(n)であり、containsaddは、hashベースのセット。ハッシュベースではなく、ルックアップを実行するためにセット全体で反復が必要な場合、上限はn ^ 2になります。

整数は不変であるため、スペースの複雑さは2nになります。定数は重要ではないため、これはnだけに単純化されると思います。

配列とセットにオブジェクトがある場合、2n個の参照とn個のオブジェクトがあるため、3nになります。これは、線形(定数倍)のスペース制約です。

編集-うん「このクラスは、ハッシュ関数が要素をバケット間で適切に分散すると仮定して、基本操作(追加、削除、包含、サイズ設定)に対して一定時間のパフォーマンスを提供します。」

ここ を参照してください。

20
hvgotcodes