私はBig O表記について読んでいました。それは述べた、
ループの大きなOは、ループ内のステートメントの数へのループの反復回数です。
これがコードスニペットです。
for (int i=0 ;i<n; i++)
{
cout <<"Hello World"<<endl;
cout <<"Hello SO";
}
定義によれば、Big OはO(n * 2)であるはずですが、O(n)です。誰かがそれがなぜであるかを説明することによって私を助けることができますか?よろしくお願いします。
O()表記のdefinitionをチェックすると、(乗数)定数は重要ではないことがわかります。
ループ内で実行する作業はnot 2です。2つのステートメントがあります。それぞれに2つのマシン命令を実行する必要があります。おそらく、50、78などですが、これはそれらはすべて定数であるため、漸近的な複雑さの計算にはまったく関係ありません。 n
には依存しません。 O(1)だけです。
O(1) = O(2) = O(c) where c is a constant.
O(n) = O(3n) = O(cn)
O(n)は、数学関数(n ^ 2、n ^ m、..など)に対してループを測定するために使用されます。
したがって、このようなループがある場合
for(int i = 0; i < n; i++) {
// sumfin
}
ループが取る最もよく説明する数学関数は、O(n)(nは0 ..無限大の間の数値)で計算されます)
このようなループがある場合
for(int i =0 ; i< n*2; i++) {
}
O(n * 2);がかかることを意味します。数学関数= n * 2
for(int i = 0; i < n; i++) {
for(int j = 0; j < n; j++) {
}
}
このループにはO(n ^ 2)時間がかかります。 math funciton = n ^ nこのようにして、ループに必要なn10または100または1000の長さを計算できます。
このようにして、ループなどのグラフを作成できます。
Big-O表記は、設計上(および定義上)定数乗数を無視するため、O(n)とO(2n))であることはまったく同じです。 。通常、O(n)と書くのは、短くて馴染みがあるからですが、O(2n)も同じ意味です。
まず、それを「ビッグオー」と呼ばないでください。それは間違っていて誤解を招くものです。あなたが本当に見つけようとしているのは漸近的に nの関数として実行される命令の数です。 O(n)について考える正しい方法は、関数としてではなく、関数のセットとしてです。すなわち:
O(n)は、すべての関数f(x)の-setであり、定数Mと数値x_0が存在します。ここで、すべてのx> x_0に対して、f(x) <Mx。
言い換えると、nが非常に大きくなると、ある時点で、関数の増加(たとえば、命令の数)は、一定の係数を持つ線形関数によって制限されます。
命令のカウント方法に応じて、ループは異なる数の命令を実行できますが、何があっても、最大でn回しか反復しません。したがって、命令の数はO(n)になります。 6n、.5n、100000000n回繰り返されるか、一定数の命令しか実行されないかは関係ありません。それはまだO(n)の関数のクラスにあります。
もう少し拡張すると、クラスO(n * 2)= O(0.1 * n)= O(n)であり、クラスO(n)はクラスO(n ^ 2)。その結果、そのループもO(2 * n)にあり(O(2 * n)= O(n)であるため)、O(n ^ 2)に含まれています(ただし、その上限は厳密ではありません)。
O(n)は、ループの時間計算量が要素の数に比例して増加することを意味します。
2 * nはまだ線形であるため、ループの次数はO(n)であると言います。
ただし、投稿したループはO(n)です。これは、ループ内の命令に一定の時間がかかるためです。定数の2倍は、依然として定数です。
通常big O
表記は、関数の主要な操作の数を表します。
このtouではn個の要素を超えています。したがって、複雑さはO(n)です。
確かにそうではありませんO(n ^ 2) 2次は、入力内のすべての要素を他のすべての要素と比較するバブルソートのように、これらのアルゴリズムの複雑さです。
ご存知のように、バブルソートでは、要素を挿入する正しい位置を決定するために、すべての要素をリスト内の他のnと比較します(バブルの動作)。
せいぜい、あなたはアルゴリズムが複雑であると主張することができますO(2n)、それは入力のすべての要素に対して2つのフレーズを出力するので、しかしbig O
表記O(n)はO(2n)と同等です。