データ構造とアルゴリズム(インタビュー)

ソートアルゴリズム

 

直接挿入ソート:選択された要素は、順序付けられた要素よりも小さい場合には最前列で順次配列内のすべての要素は、要素に比べて良いされている、交換すべての要素が比較されるまで

丘は、ソート、ソート配列は、段差によってグループ化されるように、各グループの要素は、ソートをソートするために直接挿入法を用いて、ギャップが小さくなるたびに半分に、上述の動作サイクルを、場合1つのギャップ=、直接によって:挿入、完全なシーケンシング

単純にソートを選択:+交換を比較

ヒープソート:建物のビッグトップヒープソート

手書き方法スタック
 1を挿入番号ヒープ【サイズ++] = X;アップ(サイズ);
 2。秋は[ヒープの中から最小値を設定1 ]
 3最小ヒープ[削除。1 ] =ヒープ[サイズ]。サイズ- ;ダウン(1 );
 4。ヒープの削除任意の要素[K] =ヒープ[サイズ];サイズ- ;ダウン(K);最大(K); 
 5は、ヒープの任意の要素を変更する[K] =。X;ダウン(k)は、最大 (k)は、 

ヒープソート

INT N-、M;
 INT H [ 1000年]、CNT; 

ボイドダウン(INT U)
{ 
    int型 T = U;
     IF(U * 2 <= CNT && H [ U *2 ] <H [T])T = U * 2 もし(U * 2 + 1 <= CNT && H [U * 2 + 1 *] <H [T])T = U 2 + 1 もし(!U = T)
    { 
        スワップ(H [U]、H [T])。
        ダウン(T)。
    } 
} 

ボイドアップ(INT U)
{ 
    一方(U / 2 && H [U] <H [U / 2 ])
    { 
        スワップ(H [U]、H [U / 2 ])。
        U>> = 1 
    } 
} 
 
int型のmain()
{ 
    CIN >> N >> M。
    以下のためにINT iが= 1 ; I <= N; I ++)CIN >> H [i]は、
    CNT = N。
    
    INT I = N / 2 ; I; I - ダウン(I)。

    一方、(M - 
    { 
        CIN >> H [ 1 ] << "  " 
        H [ 1 ] = H [CNT - ]。
        ダウン(1 )。 
    }    
    戻り 0 
}

 

バブルソート

1ターンに比べ要素間の周りのシーケンスは、要素の権利を保障することは、常に左の要素よりも大きく、

2.ステップ1は、残りのn-1の間で再び配列エレメントを行います

長さnの配列のために3、n-1個必要の合計は比較用砥石を実行します

クイックソート:塗りつぶし+分割統治を掘るの数

ベクター< INT > quick_sort(ベクトル< 整数 > qは、整数 L、int型R)
{ 
    場合(L> = R)リターン;
    int型 iはL = - 1 INT J = R + 1 INT X = Q [L + R >> 1 ]。
    しばらく(I < J)
    { 
          行う ++私を。一方、(Q [i]の< X)。
          やる jは- 。一方、(Q [J]> X)。
          もし(I < J)スワップ(Q [I]、Q [J])。
    }
    quick_sort(Q、L、J)。
    quick_sort(Q、J + 1 、R)。
}

 

マージソート

1.各バイナリ分解----分割の配列

----ソートマージ後2合成配列セグメント分割二十から二

ベクトル< int型 > TMP;
ボイド merge_sort(ベクトル< 整数 > qは、整数 L、int型R)
{ 
    場合(L> = R)リターン; 
    自動ミッド = L + R >> 1 
    merge_sort(Q、L、MID)。
    merge_sort(Q、ミッド + 1 、R)。
    int型私は= リットル。
    int型 J =ミッド+ 1 ;
    INT K = 0 一方(I <= J)
    { 
          場合(Q [i]が<= Q [J])TMP [K ++] = Q [I ++];
          他の                    TMP [K ++] = Q [J ++ ]; 
    } 
    一方、(I <= MID)TMP [K ++] = Q [I ++ ]。
    一方、(j <= r)はTMP [K ++] = Q [J ++ ]。
    以下のためにINT iが= L、J = 0 ; I <= R; I ++、J ++)Q [I] = TMP [J]。
}

 

KMPアルゴリズム

マッチングが失敗した後にKMPアルゴリズムは、高速マッチングの目的を達成するための主な文字列パターン文字列一致の数を最小限にするために、鍵情報を使用します。特定の実装では、関数自体は部分情報パターン文字列のマッチングが含ま、次の()関数を実装することです。Oの時間複雑度(M + N)

一方、時間の複雑さは、非常に高いので、単純なアルゴリズムでは、我々は失敗する前に、すべての試合スケジュールと一致するたびに、与えなければならなかったK M Pの KMPアルゴリズム嘘の本質は、各故障モードの試合の後に文字列の先頭から進みません一致が、一致既知のデータによれば、特定のパターン文字列マッチング位置へのジャンプバックが続行され、各ビットのため、それによって時間を節約し、パターン文字列のユニークな「特定のスナップバックの位置」を有します。

ポインタ不一致:位置I値は、パターン文字列Sである(1添字A i)は、ミスマッチ配列の共通プレフィックスの最大長さと適切なサフィックス真

// 求めるのミスマッチ配列
 // 文字列自体のパターンマッチング処理自体、ちょうど配列が同じテキスト文字列マッチングのアイデアで、パターン文字列の意味における過失で構築されたと言う
int型 N- = s1.length();
 INT、M = s2.legnth();
 のためのINT I = 1 ; I <M、I ++ 
{ 
    ながら(!&& S2 K [I] = S2 [K])K = KMP [K];
     IF(S2 [I] = S2 [K])KMP [I + 1 ] ++ = K; 
} 

// テキスト文字列内のパターンの文字列を見つける
 // kは現在のモードが最終の文字列と一致するように仕上げられていることがわかります位置は、あなたもマッチした文字列のいくつかの概略として理解することができる

K = 0 ;
 のためにint型 I = 0; I <N-; ++ I)
{ 
    一方(S1 && K [I] = S2 [K])= K!KMP [K];
     // 一致が不一致ポインタジャンプパターン列に沿ってセットバックに失敗最初はジャンプアップしません。
    IF(S1 [I] == S2 [K])K ++     // + +1位置に成功したマッチ、マッチパターン文字列
    IF(K == M)COUT << I - M + 2 << ENDL;     / / パターン文字列、出力位置を見つけます。
}

 

クリティカルパス図

クリティカルパスのいかなる分析は、図のより重要な使用ではありません。各ノードは、それがアクションを完了するのにかかるだけでなく、実行しなければならないアクションを与えるために時間を表しています。したがって、図のノードのグラフの動作を制御します。

エッジ(V、W)アクションはWアクションの開始前に完了しなければならないことV手段:図中側は、優先度の関係を示します。

 

 条件は、最後のものは、すべてのプレイベント、プレイベントが互いに平行に指定することができますが、早い完了時間が最も長いパスで完成させることです始めました

 

おすすめ

転載: www.cnblogs.com/byene/p/12640382.html