web-dev-qa-db-ja.com

HashMapメソッドの時間の複雑さ

時間の複雑さを回避するため、リスト、マップ、およびクラスで使用される標準メソッドの時間の複雑さについて、Oracle Javaクラスライブラリを検索しました。具体的には、ArrayList 、HashSetおよびHashMap)

さて、 HashMap javadoc page を見るとき、彼らは本当にget()put()メソッドについてのみ話します。

私がまだ知る必要がある方法は次のとおりです。

_remove(Object o)
size()
values()
_

remove()は、get()O(1)と同じ複雑さになると思います。同じhashCodeなどを持つ巨大なH​​ashMapがないと仮定すると...

size()についても、O(1)を仮定します。これも、順序を持たないHashSetには、複雑さを持つsize()メソッドがありますO(1)

私が知らないものはvalues()です-このメソッドがHashMapを何らかの方法で「コピー」し、O(1)の時間の複雑さを与えるのか、それともHashMapを反復処理する必要があり、複雑さはHashMapに格納されている要素の量と等しくなります。

ありがとう。

20
Koeneuze

ソースはしばしば役に立ちます: http://kickjava.com/src/Java/util/HashMap.Java.htm

  • remove: O(1)
  • size: O(1)
  • values: O(n)(イテレータを通過するとき)
21
b_erb

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)です。

5
JavaGuy

検索:O(1 + k/n)
挿入:O(1)
削除:O(1 + k/n)ここで、kはnoです。同じLinkedListに追加された衝突要素の数(k要素は同じhashCodeを持ちました)

LinkedListの先頭に要素を追加するため、挿入はO(1)です。

Amortized Timeの複雑さは、O(1)に近いハッシュ関数が与えられます。ルックアップ時間を気にしすぎる場合は、JavaすなわちLinkedList

1

いつでもソースコードを見て、自分でチェックできます。
とにかく...私は一度ソースコードをチェックしましたが、覚えているのは、sizeの項目の数を常に保持するHashMapという名前の変数があるので、size()O(1)です。

1
Itay Karo