ArrayListのadd()およびadd(int index、E)の複雑さが一定の時間で償却されるのはなぜですか?
なぜO(1)単一のadd()操作の場合、O(n)単一のadd(int index、E)操作の場合、およびO(n)いずれかの(any)addメソッドを使用してn個の要素(n個の追加操作)を追加しますか?add(int index、E)を使用して配列の末尾に追加することはほとんどありませんか?
配列(およびArrayList)の1つの操作の複雑さは、すでにn個の要素を持っているわけではありません。
100万件の挿入を行う場合、1と2の平均をO(1)にすることはできませんか?
オラクルが言う理由
追加操作は、償却された一定時間で実行されます。つまり、n個の要素を追加するにはO(n) time。
複雑さはO(1) for add()およびO(n) for add(int index、 E)。
「n演算の積分複雑度」(複雑度O(1))の各演算は、いわばn * O(1)= O(n)であることを意味します。 ?
Oracleの場合、「追加操作」は常にadd()のみを意味するのでしょうか?そして、add(int、E)は「挿入操作」ですか?それから完全に明確!
推測がありますが、漸近分析と償却分析の違いに関係していますが、最後まで把握することはできません。
なぜ配列挿入の時間の複雑さがO(n)でありO(n + 1)ではないのか?
Oracleの用語(暗黙的に暗示されている)およびListについて
boolean add(E)
を意味するboolean add(int index, E)
を意味しますOracleが書き込むとき
追加操作は償却された一定時間で実行されます。つまり、n個の要素を追加するにはO(n)時間を必要とします。
その意味は:
単一のboolean add(E)
操作の複雑さは償却O(1)です。
配列容量を増やす必要はめったにないので、単にO(1)漸近的(常に)にすることはできません。実際には「新しい大きな配列を作成し、古い配列をその配列にコピーし、最後に1つの要素を追加する」操作であるこの単一の追加操作は、O(n)漸近的な複雑さです。リスト容量の増加はO(n)で、成長と加算の複雑さはO(n) [O(n) + O(1) =として計算されますオン)]。この容量拡張操作がなければ、追加の複雑さはO(1)になり、要素は常に配列の最後(最大インデックス)に追加(追加)されます。配列の最後ではなく「追加」(=挿入)した場合、右端の要素(より大きなインデックス)を移動する必要があり、そのような単一の操作の複雑さはO(n)になります。
単一の追加操作の場合、漸近的な複雑さは、増加容量なしの場合はO(1)であり、増加容量付きの場合はO(n)です非常にまれな)。
単一の追加操作の償却された複雑さはO(1)です。これは、まれなO(n)成長および追加操作が、はるかに多くのO(1)成長なしの追加操作で「希釈」されるという事実を反映しています。平均的な」単一操作はO(1)です。
n個の加算操作の「漸近的な複雑さ」はO(n)です。ただし、ここでは、1つの操作の複雑さではなく、n個の操作の複雑さについて説明します。これを厳密な方法(「漸近的な複雑さ」)にするのは厳密な方法ではありませんが、とにかく。 n個の操作の償却された複雑さは、あまり意味がありません。
最後に、boolean add(int index, E)
単一操作の複雑度は常にO(n)です。トリガーが大きくなると、O(n) + O(n) [grow + insert]になりますが、2 * O(n)はO(n)と同じです。