序文
これは2019年1月20日の記事です。今日再投稿した理由は、アルゴリズムの複雑さの分析が入門アルゴリズムの基本的なスキルだと思うからです。「武道を実践しなければ、何もできなくなる」という良い言葉があります。見直したばかりですが、あまり使わないと忘れてしまうことがあります。
もう一つのポイントは、過去にはアニメーションの技術記事が少なかったようですが、その執筆と制作には非常に時間がかかり、今回は想像を超えるものになります。私の当初の意図は、急いで記事を完成させて公開アカウントに投稿することではありませんでした。これは私とあなたにとって無責任です。
そこで、もう少し時間を取って上手に書いて、わかりやすいように図をデザインすることにしました。毎日変更を求めるのではなく、各記事に最高の状態で共有してもらいます。
1.データ構造は何に使用されますか?
データ構造とアルゴリズムの誕生により、コンピューターは「より速く実行」し、「スペースを節約」することができます。
2.データ構造とアルゴリズムの品質を判断するために何が使用されますか?
「実行時間」と「占有スペース」から、データ構造とアルゴリズムの品質を判断します。
3.複雑さとは何ですか?
「時間の複雑さ」と「空間の複雑さ」を使用してパフォーマンスの問題を説明します。どちらもまとめて複雑さと呼ばれます。
4.複雑さは何を表していますか?
複雑さは、アルゴリズムの実行時間(または占有スペース)とデータサイズの増加との関係を表します。
1.パフォーマンス分析と比較した場合の利点は何ですか?
支援度分析は、実行環境に依存しない、低コスト、高効率、操作が容易、強力なガイダンスという特徴があります。
2.なぜ複雑さの分析が必要なのですか?
複雑さは、アルゴリズムの実行時間(または占有スペース)とデータサイズの増加との関係を表します。
1.複雑さの分析を実行できる方法は何ですか?
方法:「BigO表記」
2. Big O表記とは何ですか?
アルゴリズムの「実行時間」は、コードの各行の「実行数」に正比例します[T(n)= O(f(n))] = "ここで、T(n)はアルゴリズムの合計実行時間を表し、f(n)はそれぞれを表します。コード実行の合計行数、およびnは、多くの場合、データのサイズを示します。
3. Big O表記の特徴は何ですか?
時間の複雑さはアルゴリズムの実行時間とデータスケールの増加傾向を表すため、定数次数、低次数、および係数は実際にはこの増加傾向に決定的な影響を与えません。したがって、時間の複雑さの分析を行う場合、これらの項目は無視されます。
4.複雑さの分析ルール
-
[頻度を確認するための単一のコード]:コードスニペットの「ループコード」の時間の複雑さを確認します。
-
[最大のものを表示するための複数のコード]:複数のforループがある場合は、「最もネストされたループ」を持つコードの時間の複雑さを調べます。
-
[ネストされたコード製品]:ループ、再帰コード、内側と外側のネストされたコードを乗算して、時間の複雑さを軽減します。
------------------❤------------------
時間の複雑さ
1.複雑さとは何ですか?
すべてのコードの「実行時間T(n)」は、コードの各行の「実行回数n」に比例します[T(n)= O(f(n))]。
2.3つの分析方法
■最大ルール
式の定数、低レベル、および係数を無視し、最大サイクル数を取得します。これは、サイクル数が最も多いコード行です。
例
1// 求n个数字之和
2int xiaolu(int n) {
3 int sum = 0;
4 for (int i = 1; i <= n; ++i) {
5 sum = sum + i;
6 }
7 return sum;
8 }
分析
2行目は、nとは関係がなく、無視できる一定レベルのコード行です。4行目と5行目は、主要な分析オブジェクトであり、nに関連しています。時間の複雑さは、実行時間とnデータスケールの関係を反映しています。n個のデータの合計を見つけるには、n回実行する必要があります。したがって、時間の複雑さはO(n)です。
■追加のルール
全体の複雑さは、サイクル数が最大のサイクルの複雑さに等しくなります。
例
1int xiaolu(int n) {
2 int sum = 0;
3 //循环一
4 for (int i = 1; i <= 100; j++) {
5 sum = sum + i;
6 }
7 //循环二
8 for (int j = 1; j <= n; j++) {
9 sum = sum + i;
10 }
11 }
分析
上記の2つのループがあり、1つは100回、もう1つはn回です。ループの数が最も多く、「データサイズn」に関連するループを選択します。上記から、データサイズnに関連する2番目のサイクルを簡単に選択でき、サイクル数が最大であり、サイクル数が最大のコードの時間の複雑さは、全体の時間の複雑さ、つまりO(n)を表すことがわかります。
■乗算ルール
ネストされたforループに遭遇した場合、時間の複雑さをどのように計算しますか?それは内側と外側のサイクルの産物です。
例
1 for (int j = 1; j <= n; j++) {
2 for(int i = 1; i <= n; i++)
3 sum = sum + i;
4 }
分析
外側のループは1回、内側のループはn回、外側のループはn回、内側のループはn * n回です。したがって、時間の複雑さはO(n²)です。
スペースの複雑さ
1.スペースの複雑さとは何ですか?
アルゴリズムの「ストレージスペース」と「データサイズ」の間の成長関係を表します
例
1int xiaolu(int n) {
2 int sum = 0;
3 //循环一
4 for (int i = 1; i <= 100; j++) {
5 sum = sum + i;
6 }
7 //循环二
8 for (int j = 1; j <= n; j++) {
9 sum = sum + i;
10 }
11 }
分析
すべてのコードで、ストレージスペースに関連するコードを簡単に見つけることができます.2行目は一定レベルのストレージスペースに適用されるため、スペースの複雑さはO(1)です。
2.最も一般的なスペースの複雑さ
O(1)、O(n)、O(n²)。
■O(1)
コード行であろうと複数行であろうと、一定レベルである限り、一定レベルの時間複雑性表現方法は、O(1)で表されます。
例
1int i = 1;
2int j = 2;
3int sum = i + j;
分析
これらの3行のコード、つまり一定レベルのコードは、nデータサイズの変更によって変更されないためです。(ループと再帰を除く)
■O(ログ)| O(nlogn)
「対数時間の複雑さ」は、分析するのが最も難しい時間の複雑さです。
例
1 i=1;
2 while (i <= n) {
3 i = i * 3;
4 }
分析
このコードに必要な時間の複雑さは、このコードが実行された回数です。具体的な分析については、次の図を参照してください。
補足
2、3、または10に基づいているかどうかに関係なく、すべての対数次数の時間の複雑さはO(logn)として記録できます。対数は変換できるため、高校の教科書を参照してください。
* ■O(m + n)| O(m n)**
上記の加算および乗算の規則を参照してください。
1.最良および最悪の時間の複雑さ
いわゆる最良および最悪の時間の複雑さは、それぞれ最良の場合および最悪の場合のコード実行に対応します。
例
1 //在一个 array 数组中查找一个数据 a 是否存在
2for (int i = 1; i < n; i++) {
3 if (array[i] == a) {
4 return i;
5 }
6 }
分析:
1.最良のケースは、配列の最初の1つが検索するデータである場合です。上記のコードは、1回実行できます。この場合、時間の複雑さは、O(1)である最良の時間の複雑さです。
2.最悪の場合、配列の最後が検索したいデータであり、配列をn回ループする必要があります。これは、O(n)の最悪の時間の複雑さに対応します。
2.平均時間の複雑さ
平均時間の複雑さは、確率理論の知識を使用して分析する必要があります。確率理論は、期待値とも呼ばれる確率理論の加重平均と呼ばれます。
分析
たとえば、上記の例で、配列内で探しているデータの確率が1/2であり、配列に現れる確率がn / 1であるとします。次の式に従って、現れる確率は1 / 2nとして計算できます。
次に、それぞれの状況を考慮して、平均時間の複雑さを計算します。
3.償却時間の複雑さ
■償却時間の複雑さとは何ですか?
たとえば、n回ごとにデータを挿入する時間の複雑さはO(1)であり、データを1回挿入する時間の複雑さはO(n)です。この時間の時間の複雑さをデータを挿入するn回に平均し、複雑さはまだO(1)です。
■償却分析
たとえば、n回ごとにデータを挿入する時間の複雑さはO(1)であり、データを1回挿入する時間の複雑さはO(n)です。この時間の時間の複雑さをデータを挿入するn回に平均し、複雑さはまだO(1)です。
■該当シーン
一般に特定のデータ構造に適用され、連続操作の時間の複雑さは比較的低いですが、個々のケースの時間の複雑さは特に高く、今回は特に高い操作をより低い操作に平均します。
■いくつかの複雑さのパフォーマンス比較