「データ構造とアルゴリズムの美しさ」学習ノート 3 日目

コース: 「複雑さの分析 (パート 2): 最良、最悪、平均、および償却時間複雑さの簡単な分析」の概要

環境によって、コードの時間計算量が大きさ異なることがあります。コードの時間計算量をより包括的かつ正確に説明するには、次の概念を導入する必要があります。

複雑性分析の 4 つの概念

  1. ベストケースの時間計算量
    最も理想的な状況で実行されるコードの時間計算量。
  2. 最悪の場合の時間計算量
    最悪の場合のコード実行の時間計算量。
  3. 平均ケース時間複雑さ (平均ケース時間複雑さ)
    すべてのケースにおけるコードの複雑さの加重平均、つまり 加重平均 時間計算量 または 予想時間計算量
  4. 償却時間計算量 (償却時間計算量)
    タイミング関係のある連続操作のグループでは、この操作グループを全体としてみなした場合、実行時間を償却できます。複雑さの高いコードから複雑さの低いコードへ。次に、複雑度分析を実行した後の平均時間複雑度が得られます。この分析方法は償却分析と呼ばれます。 a>通常、この特殊な状況では、償却時間計算量が最良の場合の時間計算量になります

以下は放課後の質問の事例分析です。

// 全局变量,大小为10的数组array,长度len,下标i。
int array[] = new int[10]; 
int len = 10;
int i = 0;

// 往数组中添加一个元素
void add(int element) {
   if (i >= len) { // 数组空间不够了
     // 重新申请一个2倍大小的数组空间
     int new_array[] = new int[len*2];
     // 把原来array数组中的数据依次copy到new_array
     for (int j = 0; j < len; ++j) {
       new_array[j] = array[j];
     }
     // new_array复制给array,array现在大小就是2倍len了
     array = new_array;
     len = 2 * len;
   }
   // 将element放到下标为i的位置,下标i加一
   array[i] = element;
   ++i;
}
  • 最良の場合の時間計算量
    最良の場合は、現在の配列に追加データを保存するのに十分な領域があることです。つまり、データの追加操作が直接実行されるため、コードの実行回数の合計は定数レベルであるため、最適な時間計算量は O(1) です。

  • 最悪の場合の時間計算量
    最悪の場合は、配列がいっぱいで、新しい配列スペースを 2 倍再適用し、現在の配列の要素をコピーするためにループする必要がある場合です。新しいアレイに。現在の配列の長さが n であると仮定すると、Big O の複雑性分析手法によれば、コードの時間計算量は となります。 O(n)

  • ケースの平均時間計算量
    分析の結果、追加された要素の可能な格納場所は0、1、2、3、4 であることがわかりました。 .n -1 このn 状況と、配列がいっぱいで新しいアプリケーション領域が必要な状況つまり、1/(n+1) であり、各状況の確率が同じであると仮定します。つまり、 O(n) で、時間計算量 (つまり、最悪の時間計算量) ) スペースを申請するときの値は O(1) 計算量は n ケースの合計、スペースの申請が必要な前のケースでの時間n+1平均時間計算量は次のようになります。 T(n) = n 件 ( O(1) x 1 n + 1 {1 \over n + 1}
    n+11 ) + ( 配列がいっぱいの場合は O(n) x 1 n + 1 {1 \over n + 1} n+11 ) 即ち

    T(n) = O(1) x 1 n + 1 {1 \over n + 1} n+11 + O(1) x 1 n + 1 {1 \over n + 1} n+11 … O(1) x 1 n + 1 {1 \over n + 1} n+11 + O(n) x 1 n + 1 {1 \over n + 1} n+11 = O( 2 n n + 1 {2n \over n + 1} n+12n ) = O(1)

  • 償却時間計算量
    コードを分析すると、毎回n 回< a i =4>O(1) 操作の後には、O(n) の操作が続きます。これらの操作全体で、O(n) の操作に費やされる平均時間は n 操作。これは、もう 1 回のコード実行に相当します。O(1) 演算、つまり O(1) + O(1) = O(2) = O(1)< /span>

  • 以下は時間計算量の意味に基づいた私の分析です:
    私たちは知っています ビッグオータイム複雑さ は、 データ サイズの増加に伴う コード実行時間の変化傾向を表します 。この観点から、このコードを見てください。配列のサイズが大きく、追加されたデータを格納するのに十分な領域がある場合、コードの実行回数は一定になります。したがって、平均時間計算量は O(1) です平均時間計算量も O(1) になります。 a>.


前の記事:「データ構造とアルゴリズムの美しさ」学習ノート 2 日目
次の記事:「データ構造とアルゴリズムの美しさ」学習ノート 4 日目

おすすめ

転載: blog.csdn.net/weixin_44131612/article/details/129133681
おすすめ