誰かが以下のコードの時間計算量を教えてもらえますか?
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
を使用していて、メソッドも含まれているのでわかりません。また、add
のset
メソッドを呼び出しています。
上記のコード全体の時間計算量を誰かが確認して説明できますか?また、どのくらいのスペースが必要ですか?
配列をループするため、そのO(n)であり、contains
とadd
は、hashベースのセット。ハッシュベースではなく、ルックアップを実行するためにセット全体で反復が必要な場合、上限はn ^ 2になります。
整数は不変であるため、スペースの複雑さは2nになります。定数は重要ではないため、これはnだけに単純化されると思います。
配列とセットにオブジェクトがある場合、2n個の参照とn個のオブジェクトがあるため、3nになります。これは、線形(定数倍)のスペース制約です。
編集-うん「このクラスは、ハッシュ関数が要素をバケット間で適切に分散すると仮定して、基本操作(追加、削除、包含、サイズ設定)に対して一定時間のパフォーマンスを提供します。」
ここ を参照してください。