これら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)になります。
HashMapの場合、バッキングストアは配列です。 10個の要素を挿入しようとすると、ハッシュを取得し、そのハッシュから特定の配列インデックスを計算します。これは後ろの配列なので、O(1)を注入します。
したがって、HashMapにn個の要素を挿入するための合計時間= n * O(1) = O(n)
この場合、バッキングストアはツリーです。合計k要素を持つツリーの場合、平均して、場所を見つける時間はO(Log k)です。
合計時間= 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))。
挿入時間の複雑さは、通常、インスタンスごとに定義されます。
平均ケース:
最悪ケース:
上記のコードでは、複数のアイテムを挿入しているため、マップ内の要素の数(n)と要素の数を区別する必要がありますマップに追加されました(m)。マップが最初は空の場合、上記のランタイムは適切です。それらにすでにいくつかの要素がある場合、ランタイムは次のようになります。
Avg Worst
Insert m elements into HashMap: O(m) O(mn)
Inset m elements into TreeMap: O(mlogn) O(mlogn)
UsingTreeMapアルゴリズムの時間の複雑さは正しいですか。
基本的なTreeMap
操作の時間の複雑さは、Javadocで正しく指定されています。
私はツリーマップで挿入時間はlog(n)であることを知っています
正しい。
しかし、10要素の配列を反復処理すると、nlog(n)になります。
これが10個の要素を挿入することを意味する場合、時間の複雑さはM*log(N)
です。ここで、M
は配列のサイズ、N
はTreeMap.
のサイズです。という意味ではありません、質問は不明確です。
そうではないかもしれません。 (つまり、10のうち4つの要素が同じキーを持っている場合、Nは7になります)。したがって、重複するキーが多いほど、挿入に時間がかかると思います。