この質問をしているのは、大きなO表記に関する1つの側面について混乱しているためです。
Frank Carrano 著の「Data Structures and Abstractions with Java」という本を使用しています。「アルゴリズムの効率」に関する章では、次のアルゴリズムを示しています。
int sum = 0, i = 1, j = 1
for (i = 1 to n) {
for (j = 1 to i)
sum = sum + 1
}
彼は最初、このアルゴリズムを(n 2 + n) / 2の成長率を持つと説明しています。どちらを見るかは直感的に思えます。
ただし、nが大きい場合、(n 2 + n) / 2はn 2のように振る舞うと述べられています。同じ段落では、彼は述べて(N 2 + N) / 2はまた、多くのと同じように動作し、N 2 / 2。彼はこれを使用して、上記のアルゴリズムをO(n 2)として分類します。
私はそれを取得します(N 2 + N) / 2が に似てN 2 / 2パーセント賢明なので、nは少し違いになります。私が得られないのは、nが大きいときに(n 2 + n) / 2とn 2が似ている理由です。
たとえば、n = 1,000,000の場合:
(n^2 + n) / 2 = 500000500000 (5.000005e+11)
(n^2) / 2 = 500000000000 (5e+11)
(n^2) = 1000000000000 (1e+12)
最後の1つはまったく似ていません。実際、明らかに、真ん中の2倍です。それで、フランク・カラーノはどうやってそれらが似ていると言えるのでしょうか?また、アルゴリズムはどのようにO(n 2)として分類されますか。その内側のループを見ると、n 2 + n / 2だったと言えます。
n
成長するにつれて、関数 'n ^ 2`と関数の両方が同様に動作し、成長率が一定の差になるという考えです。複雑な式がある場合、より速く成長する関数が優先されます。