オファーが届きました。友達を掘って受け取りましょう!私は2022年の春の採用チェックインイベントに参加しています。クリックしてイベントの詳細を表示します。
1なぜ複雑さの分析が必要なのですか?
- テスト結果は、さまざまなハードウェア環境のテスト環境に大きく依存し、同じコードをテストした場合の効果は異なります。次に、複雑さの分析には、低コストと高効率の特性があります。
- テスト結果は、データのサイズに大きく影響されます。たとえば、並べ替えアルゴリズム、並べ替えの順序、並べ替えの実行時間は大きく異なります。テストデータのサイズが小さい場合、テスト結果はアルゴリズムのパフォーマンスを正確に反映できません。たとえば、小規模なデータソートの場合、挿入ソートはクイックソートよりも高速な場合があります。
2.ビッグ0の複雑さの表記
アルゴリズムの実行効率は、通常、アルゴリズムコードの実行にかかる時間です。では、コードの実行時間を取得するにはどうすればよいですか?最初にコードをリストすることは、コードの各行の実行に同じ時間がかかることを前提としています。
int calc(int n)
{
int sum=0;//执行一个time
int i=1;//执行一个time
int j=1;//执行一个time
//循环了n遍 所以是2n*time
//从此整个时间T(n) = (2n2+2n+3)*time
for(;i<=n;++i)
{
j=1;
for(;j<=n;j++)
{
sum=sum+i*j
}
}
}
复制代码
ここから浮かび上がる重要なルールは、すべてのコードの実行時間T(n)とコードの各行の実行は、この時間Tn = O(f(n))でnに比例するということです。T(n)= 2n 2 + 2n + 3が上に表示されているので、最大の大きさを記録するだけで済みます。たとえば、T(n)= O(n 2)。
3.時間計算量分析の3つの方法
- 変化する傾向を表す、ループが最も多いBigO表記のコードにのみ焦点を当てます。最大次数の大きさだけを気にする必要があります。たとえば、次のコード
int calc(int n)
{
int sum=0;
int i=0;
for(;i<=n;++i)
{
sum=sum+i;
}
return sum;
}
复制代码
ここでコードの一部を直接確認してください。これらの2行のコードはn回実行されるため、合計時間計算量はO(n)です。
- 加算ルールの全体的な複雑さは、最大の大きさのコードに等しくなります
int calc(int n)
{
int sum=0;//执行一个time
int i=1;//执行一个time
int j=1;//执行一个time
int p = 0;
for(int p=0;p<n;p++)
{
sum=sum+p;
}
sum=0;
//循环了n遍 所以是2n*time
//从此整个时间T(n) = (2n2+2n+3)*time
for(;i<=n;++i)
{
j=1;
for(;j<=n;j++)
{
sum=sum+i*j
}
}
}
复制代码
このコードの最初のループpは、n回ループします。このnが100、1000などであるかどうかに関係なく、本番レベルの時間です。同様に、2番目の2番目のループコードはO(n 2)であるため、最終結果はO(n 2)になります。
- 確率の法定ネストされたコードの複雑さは、ネストの内側と外側のコードの複雑さの積に等しくなります。T1(n)= O(n)、T2(n)= O(n)、T(n)と仮定します。 = T1(n)* T2(n)= O(n 2)
4つの一般的な時間計算量分析
- 一般的な複雑さは何ですか
- 0(1)
int i=2;
int j=3;
int sum=i+j;
复制代码
一般に、コードの実行時間がnとともに増加しない場合、それはO(1)です。秘訣は、プログラムにループや再帰などがないことです。
- O(logn)和O(nlogn)
int i=1;
while(i<=n)
{
i=i*2;
}
复制代码
ここで、iは1から始まり、iがn未満になって終了するまで、毎回2を掛けます。つまり、2 0、2 1 ..... 2 x、次に2 x = n、x = log2nです。このとき、i = i * 4、つまりx = log 4 nの場合、log4nは実際にはlog42 * log 2 nに等しいので、O(log 4 n)= O(C * log 2 n)とは何ですか。C定数については前に説明しましたが、無視してかまいません。したがって、O(log4n)= O(log2n)。対数時間計算量の表現では、対数時間計算量を無視します。
4 O(m + n)およびO(m * n)
int cal(int m, int n)
{
int sum_1 = 0;
int i = 1;
for (; i < m; ++i)
{
sum_1 = sum_1 + i;
}
int sum_2 = 0;
int j = 1;
for (; j < n; ++j)
{
sum_2 = sum_2 + j;
}
return sum_1 + sum_2; }
}
复制代码
ここでのmとnの大きさは、予測するには大きすぎます
5.インタビューにおける一般的なアルゴリズムの複雑さ
- 関連する並べ替え
- 二分木関連
6つのまとめ
- 複雑さの分析を学ぶことは、より良いコードを書くのに役立ちます。
- 複雑さの分析の主なポイント(1)1つのコードが高頻度を調べます。たとえば、ループ(2)を見て、最大のマルチセグメントコードを取得します。たとえば、シングルレベルループとマルチレベルループの両方があります。製品を見つけるには、高レベル(3)のネストされたコードを使用します。再帰など
- 一般的な複雑さ(1)多項式次数O(1)定数次数O(logn)対数次数O(n)線形次数O(n 2)二乗次数(2)非多項式指数階乗次数