web-dev-qa-db-ja.com

ツリーマップ挿入とHashMap挿入の複雑さ

これら2つのアルゴリズムの時間の複雑さに戸惑っています。

//time complexity O(nlog(n))
public void usingTreeMap(){
    Map<Integer, Integer> map = new TreeMap<Integer, Integer>();
    for (int i = 0; i < 10; i++) {
        map.put(i, i);
    }
}
//time complexity O(n)
public void usingHashMap(){
    Map<Integer, Integer> map = new HashMap<Integer, Integer>();
    for (int i = 0; i < 10; i++) {
        map.put(i, i);
    }
}

UsingTreeMapアルゴリズムの時間の複雑さは正しいですか?ツリーマップでは挿入時間はlog(n)ですが、10要素の配列を反復処理すると、nlog(n)になります。

14

HashMapの複雑さ

HashMapの場合、バッキングストアは配列です。 10個の要素を挿入しようとすると、ハッシュを取得し、そのハッシュから特定の配列インデックスを計算します。これは後ろの配列なので、O(1)を注入します。

  • 最初の要素の場合、挿入にかかる時間= O(1)
  • 2番目の要素の場合、挿入にかかる時間= O(1)
  • Nの場合番目 要素、挿入にかかる時間= O(1)

したがって、HashMapにn個の要素を挿入するための合計時間= n * O(1) = O(n)


TreeMapの複雑さ

この場合、バッキングストアはツリーです。合計k要素を持つツリーの場合、平均して、場所を見つける時間はO(Log k)です。

  • 最初の要素を挿入する時間= O(1)
  • 2番目の要素を挿入する時間= O(Log 1)= 0 = O(1)
  • 3番目の要素を挿入する時間= O(ログ2)
  • Nを挿入する時間番目 要素= O(ログ(n-1))

合計時間= Log 1 + Log 2 + Log 3 + ... + Log(n-1)

ここで、Log 1 <= Log n、Log 2 <= Log n ... Log(n-1)<= Log n、それぞれがn-1以下の値になるn-1値になります。

これは、ツリーマップに挿入するタイミングの合計が<=(n-1)* Log(n-1)の値になり、O(n Log(n))が複雑になることを意味します。


ログのプロパティの1つはLog a + Log b = Log (ab)です。これを使用すると、TreeMapの場合の挿入時間の合計は、あまり知られていないO(Log(n!))の実行時間の値になります。ただし、 O(Log(n!))はO(n Log(n)) によってバインドされるため、TreeMapへのn個の要素の挿入の時間の複雑さは大まかにO(n Log( N))。

24
displayName

挿入時間の複雑さは、通常、インスタンスごとに定義されます。

平均ケース:

  • HashMap O(1)
  • TreeMap O(logn)-基礎となる構造は赤黒ツリーであるため

最悪ケース:

  • ハッシュマップO(n)-ハッシュ衝突の場合
  • TreeMap O(logn

上記のコードでは、複数のアイテムを挿入しているため、マップ内の要素の数(n)と要素の数を区別する必要がありますマップに追加されました(m)。マップが最初は空の場合、上記のランタイムは適切です。それらにすでにいくつかの要素がある場合、ランタイムは次のようになります。

                                Avg      Worst
Insert m elements into HashMap: O(m)     O(mn)
Inset m elements into TreeMap:  O(mlogn) O(mlogn)
6
Michael Hinds

UsingTreeMapアルゴリズムの時間の複雑さは正しいですか。

基本的なTreeMap操作の時間の複雑さは、Javadocで正しく指定されています。

私はツリーマップで挿入時間はlog(n)であることを知っています

正しい。

しかし、10要素の配列を反復処理すると、nlog(n)になります。

これが10個の要素を挿入することを意味する場合、時間の複雑さはM*log(N)です。ここで、Mは配列のサイズ、NTreeMap.のサイズです。という意味ではありません、質問は不明確です。

5
user207421

そうではないかもしれません。 (つまり、10のうち4つの要素が同じキーを持っている場合、Nは7になります)。したがって、重複するキーが多いほど、挿入に時間がかかると思います。

0
Audible