時間の複雑さを回避するため、リスト、マップ、およびクラスで使用される標準メソッドの時間の複雑さについて、Oracle Javaクラスライブラリを検索しました。具体的には、ArrayList 、HashSetおよびHashMap)
さて、 HashMap javadoc page を見るとき、彼らは本当にget()
とput()
メソッドについてのみ話します。
私がまだ知る必要がある方法は次のとおりです。
_remove(Object o)
size()
values()
_
remove()
は、get()
、O(1)
と同じ複雑さになると思います。同じhashCodeなどを持つ巨大なHashMapがないと仮定すると...
size()
についても、O(1)
を仮定します。これも、順序を持たないHashSetには、複雑さを持つsize()
メソッドがありますO(1)
。
私が知らないものはvalues()
です-このメソッドがHashMapを何らかの方法で「コピー」し、O(1)
の時間の複雑さを与えるのか、それともHashMapを反復処理する必要があり、複雑さはHashMapに格納されている要素の量と等しくなります。
ありがとう。
ソースはしばしば役に立ちます: http://kickjava.com/src/Java/util/HashMap.Java.htm
remove:
O(1)size:
O(1)values:
O(n)(イテレータを通過するとき)Removeのコード(HashMapのrt.jarのように)は次のとおりです。
/**
* Removes and returns the entry associated with the specified key
* in the HashMap. Returns null if the HashMap contains no mapping
* for this key.
*/
final Entry<K,V> removeEntryForKey(Object key) {
int hash = (key == null) ? 0 : hash(key.hashCode());
int i = indexFor(hash, table.length);
Entry<K,V> prev = table[i];
Entry<K,V> e = prev;
while (e != null) {
Entry<K,V> next = e.next;
Object k;
if (e.hash == hash &&
((k = e.key) == key || (key != null && key.equals(k)))) {
modCount++;
size--;
if (prev == e)
table[i] = next;
else
prev.next = next;
e.recordRemoval(this);
return e;
}
prev = e;
e = next;
}
return e;
}
明らかに、最悪の場合はO(n)です。
検索:O(1 + k/n)
挿入:O(1)
削除:O(1 + k/n)ここで、kはnoです。同じLinkedListに追加された衝突要素の数(k要素は同じhashCodeを持ちました)
LinkedListの先頭に要素を追加するため、挿入はO(1)です。
Amortized Timeの複雑さは、O(1)に近いハッシュ関数が与えられます。ルックアップ時間を気にしすぎる場合は、JavaすなわちLinkedList
いつでもソースコードを見て、自分でチェックできます。
とにかく...私は一度ソースコードをチェックしましたが、覚えているのは、size
の項目の数を常に保持するHashMap
という名前の変数があるので、size()
はO(1)
です。