web-dev-qa-db-ja.com

ArrayListのadd()とadd(int index、E)の複雑さが一定の時間で償却されるのはなぜですか?なぜO(1) add()の場合、O(n) add(int index、E)の場合?

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個の要素を持っているわけではありません。

  1. add()-O(1)?
  2. add(int index、E)-O(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)ではないのか?

Amortized O(1) vs O(n)ソートされていない動的配列への挿入? (明確ではない)

異なるルーチンを一緒に追加する場合の大きなO

9
Code Complete

Oracleの用語(暗黙的に暗示されている)およびListについて

  • "add method"(同義語-"append method")は常に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)と同じです。

16
Code Complete