C言語のデータ構造 - アルゴリズム

@(データ構造アルゴリズム)

アルゴリズムの1定義

== ==演算:特定の問題解決のステップは、コンピュータ内の命令の優先順位のパフォーマンスを解決する記述、およびそれぞれが1つまたは複数の指示操作を表します。(アルゴリズムは、問題の説明を解決するための方法です。)

アルゴリズムの2特性

  1. 入出力
    アルゴリズムは、ゼロ以上の入力を持っています。印刷のように「Hello World!」任意の入力パラメータを必要としません。
    その出力は、アルゴリズムはできませんが、入力がなければなりません
  2. 貧困層の存在する
    == ==有限性は:限られたステップの実行後にアルゴリズムを指しますが、自動的に無限ループを終了させず、各ステップは、時間の許容期間内に完了された
    アルゴリズムならば、実際の生活の中で、当然のことながら、これは、数学的な感覚が有限であることを、完了するまでに数年かかるが、それは、アルゴリズムの意味ではありません。
  3. 不確実性
    == ==確実:アルゴリズムの各ステップは、意味を定義して、あいまい表示されません。
    一定の条件の下では、アルゴリズム、唯一の実行パスは、同じ入力は固有の出力を持つことができます。アルゴリズムの各ステップは、正確に曖昧さなしで定義されます。
  4. 実現可能性が
    == ==可能性:アルゴリズムの各ステップが実行可能でなければならないが、つまり、各ステップは、限られた回数を実行することによって完成させることができます。
    実現可能性は、アルゴリズムは、マシンプログラム上で実行し、正しい結果を得るために変換できることを意味します。

3.アルゴリズムの設計要件

  1. 正確
    == ==正し:少なくとも正しく、入力、出力、および明確な処理を持って、需要の問題を反映すべきであるアルゴリズムを指し、あなたは正しい答えを得ることができます。
    :4つのレベルに分かれ
    1.アルゴリズムプログラム構文エラー。
    2.出力結果を生成することができるアルゴリズムプログラムは、有効な入力データのための要件を満たします。
    不正な入力データ3.アルゴリズムプログラムは、結果の仕様を満たすことができます。
    4.アルゴリズムプログラムのために慎重であっても、テストデータ出力要件の両方を満足させることは極めて難しい選択。
  2. 読みやす
    == ==可読性:それはアルゴリズムの別のオブジェクトを読み、理解とコミュニケーションを容易にするために設計されています。
    主に実行するためにマシンに続いて読んで人々と交流、アルゴリズム。グッド可読性アルゴリズムの人々の理解に貢献し、デバッグが困難な多くのエラーを非表示に変更するあいまいなプログラムが簡単にできます。
  3. 堅牢
    == ==ロバストネス:入力データが正当でない場合、アルゴリズムは、関連するプロセスではなく、例外または不可解な結果を作ることができます。
    例えば、入力された時間または距離は負であってはなりません。
  4. 高効率、低蓄積時間
    == ==時間効率:アルゴリズムの実行時間を指します。
    == ==ストレージ要件:主にメモリや外付けハードディスクストレージスペースによって占有時間を実行するアルゴリズムを参照して、実行最大ストレージ容量中に必要なアルゴリズムを指します。
    設計アルゴリズムは、高い時間効率と低メモリ要件を満たすようにしてください。

4.アルゴリズムの効率測定方法

  • 後で統計的方法
    == ==その後の統計的方法:主に良いデザイン試験手順およびデータを介して、プログラムの準備の時間を実行しているコンピュータアルゴリズム異なるタイマーを使用して、アルゴリズムの効率のレベルを決定するために比較しました。
    この方法は大きな欠点があります:
    1.プログラムが用意したアルゴリズムに従って実行されなければならない。
    その結果、時間2.統計は、コンピュータのハードウェア、ソフトウェア、およびアルゴリズム自体の弱点をカバーするために、時には簡単の環境要因に依存します。

  • 分析前の推定方法
    、コンピュータプログラムで、推定するための統計的手法に基づくアルゴリズム:== ==分析前の推定方法。
    :消費コンピュータ上の高水準言語で書かれたプログラムの実行時には、以下の要因に依存し
    、アルゴリズムの戦略、方法1.使用。(基本的なアルゴリズムは、良いか悪いかである)
    、コンパイラによって生成されたコードの品質2.。(ソフトウェアをサポートしている)
    規模の3.問題に入りました。(入力の数を指す)
    の命令を実行するために機械の速度4.。(ハードウェアの性能に依存する)
    、例えば、次の二つの方法:

int i,sum = 0,n=100;      // 执行1次
for(i=1;i<=n;i++)         // 执行了n+1次
{
    sum = sum + i;        // 执行n次
}
printf("%d",sum);         // 执行1次

実行1+(N + 1)+ N + 1 = 2N + 3回回

int sum = 0,n = 100;      // 执行一次
sum = (1 + n) * n/2;      // 执行一次
printf("%d",sum);         // 执行一次

1 + 1 + 1 = 3の実装では、
第2のアルゴリズムより良い明らかです。
実行時の計算の決意は、消費の時間を実行している数と基本的な操作を実行するための最も信頼性の高い方法です。時間を実行すると、この数に比例しています。
プログラムの実行中の時間を分析するときに最後に、最も重要なことは、プログラミング言語アルゴリズムまたは一連のステップの独立したプログラムとして見られることです。

機能5.プログレッシブ成長

プログレッシブ成長関数== ==:与えられた2つの関数F(N)およびg(n)は、整数Nを、存在する場合、そのような全てのn> N、F(n)のためgより常に大きいこと、(N) 、その後、我々は、F(n)は漸進的増加速くgより(n)のことを言います。
一般的には、以下の結論:

  1. 加法定数+ 3、+ 1、およびので、無視することができます。
  2. 最高次の項の定数を掛けたことは重要ではありません。
  3. Nの成長と最高度の用語指数大きい関数は、結果は、特に急速な成長になるであろう。
  4. アルゴリズムの効率を決定すると、関数の定数およびその他の小項目は、多くの場合、無視することができますが、オーダーの主な項目(最高次の項)を心配する必要があります。
  5. このアルゴリズムは、Nが増加するにつれて、それはますますアルゴリズムが他より優れている、または他のアルゴリズムに悪化しているとなろう。

6.アルゴリズムの時間計算

  1. アルゴリズムの時間複雑度が定義されている
    == ==定義されたアルゴリズムの時間複雑:アルゴリズム解析、実行文T(N)の総数は、問題の大きさの関数であり、次いで、N、T(n)と変化を分析します大きさのT(n)の順序を決定します。T(N)= O(:アルゴリズムの時間複雑性は、アルゴリズムは、で表される、時間の尺度である F(N))。Nはサイズとともに増加する問題は、アルゴリズムの実行時間は同じ成長率とF(N)増殖、アルゴリズムと呼ばれる進行性の時間複雑さを表し、と呼ばれる時間複雑ここで、f(n)は、問題のサイズnの関数です。
    大文字O()ランダウの記号となる、アルゴリズム表記の時間複雑さを反映します。
    一般的に、Nが増加するにつれて、T(n)のアルゴリズムは、最も遅い成長に最適なアルゴリズムです。
    • O(1)と呼ばれる一定の段階
    • O(N)と呼ばれる線形順序
    • O(N ^ 2 ^)が呼ばれる正方形の順序
  2. 大きいオーダーOの導出方法
    大きいO導出する== ==ための方法:全添加定数1を交換する一定の動作時間で1。唯一の最高次の項を保持改訂番号でファイル名を指定して実行機能2.。3.最高次の項が存在し、1でない場合は、定数項を除去乗算されます。その結果、大規模なO-ためということです。

  3. 一定の秩序が
    どんなに多くの定数、(1)、Oとして記録されていない
    というよりもO(3)、O(4 ) 、などその他多数。

  4. 線形順序
    動作周期構造の分析を主要な解析アルゴリズムの複雑さです。
    次のコード例では、時間計算量はO(N)
int i;
for(i=0;i<n;i++)
{
    某个时间复杂度为O(1)的步骤   // 执行了n次
}
  1. 注文するには
int count = 1;
while(count < n)
{
    count = count * 2;
    某个时间复杂度为O(1)的步骤
}

分析:近いnとそれ以降の各カウントは* 2ので、つまり、xはnが掛けより大きい2ヶ月後になるとループを終了します。2 ^ X ^ = NしたX = LOG2(N)。したがって、上記のコードの時間複雑性はO(ログ(N))です。

  1. 正方形の順序
    複数サイクル、サイクルタイムがサイクル動作の回数を乗じたループの複雑さの複雑さに等しいです。
    たとえば、次のコード:
int i,j;
for(i=0;i<n;i++)
{
    for(j=i;j<n;j++)
    {
        时间复杂度为O(1)的步骤
    }
}

実行の総数は、N +(N-1)+(N-2)である+ ... + 2 + 1 =(N ^ 2 ^ / 2)+(N / 2)、コード時間計算のセグメントを得ることができるOであります(N ^ 2 ^)。

一般:
O(1)<O(ログ(N))<O(N)<O(nlog(N))<O(N ^ 2 ^)<O(N ^ ^ 3)<O(2 ^ N ^)<O(N! )<O(N ^ N ^)

7.その他

== ==最悪の場合は走行時間を参照することは悪いことではないだろう、保証です。その後、我々が言及した走行時間の走行時間は、最悪の場合は、特に指定がない限り、これは、最も重要なニーズの一つであり、適用されます。
それが所望の動作時間であるため、== ==平均実行時間は、すべての場合において最も重要です。
S(N)= O(:実施計算アルゴリズムによって== ==空間的複雑必要な記憶空間、示される式 F(n))は、 問題のn型スケールは、F(n)は約ステートメントです、 nで占められた機能収納スペース。

おすすめ

転載: www.cnblogs.com/PursuingtheLight/p/11359721.html