組み込みチームのトレーニング_データ構造とアルゴリズムの概要
要件:理解し、覚えておくことが、それはアルゴリズムの時間の複雑さを解決します
要約:プログラミング=データ構造+アルゴリズムの
説明:データデータストレージの問題を解決するために使用される構造、及び処理してデータを分析するためのアルゴリズム。(カタログ、ページ前後)
A:データ構造
データ:すべてのシンボルがコンピュータに入力することができます。我々は通常、整数、浮動小数点などの使用だけでなく、文字、音、写真、ビデオ(符号化することにより文字データになるために)などだけでなく、。
理解することは簡単で、それはの研究であるロジックとデータストレージ規律。データ:単純に分割論理構造(論理関係)及び
物理的構造。それは一緒に、何らかの形のデータ組織の収集だけでなく、データを格納するだけでなく、データにアクセスして処理の動作をサポートする(に基づいているCRUD)。
試験の内容に関する大:あなたができることを覚えています
1.論理構造:
論理構造データは、単純なデータ間の論理的関係を意味すると理解しました。
データの間の論理だけで3つのカテゴリに分けることができます。
- ワン(線形構造、文字列)
- 多対(階層ツリー)
- 対多(図)
2.物理的な構造
これは、データを参照コンピュータ・メモリ・モード(例えば:メモリ)に記憶されている中央記憶または記憶装置を分散を選択することができます。
特定の性能:順次記憶(連続アドレス)とチェーンストレージ(ポインタは、論理的な関係を示しています)。
3.抽象データ型
抽象データ型ADT:数学モデルとモデルで定義された操作のセット。(端的に言えば、仕様がある)
データ構造のシリーズは、以下の抽象データ型で説明されています。
II:アルゴリズム
シンプルな一連の命令に従うように、問題の必要性を解決するためのアルゴリズムが明確に規定されています。コンピュータでは、アルゴリズムは、溶液の正確かつ完全な記述を指します。
ときに問題解決には、アルゴリズムは、最初の書き込みのコードにアルゴリズムを中心に、心の問題を解決する必要があります。
したがって、データ構造のプログラミング=アルゴリズム+
試験の内容に関する大:あなたができることを覚えています
1.アルゴリズムの5つの基本的な機能:
- 入力
の入力パラメータは、数(> = 0)、例えば:ダイレクトプリント、それはパラメータではありません。 - 出力の
出力と戻り値、数(> 0)は、出力を有していなければならないプリントを有するように、少なくとも、。 - 有限性質は
ステップを制限され、無限ループではなく、後に限られた時間内に完了します。 - 不確実性
のすべてのステップは、特定の意味を持っている必要があり、それがあいまいな表示されません。 - 実現可能性が
あること、限られた時間内に完了されようと話をしているすべてのステップが実行可能である、各ステップは、限られた時間のためです。(有限時間の全体的な仕上がりそう)
2.アルゴリズムの設計要件
- 正しさ(少し):正しい答えを得る質問(ナンセンス)
- 読みやすさ:簡単プログラマ、理解、通信の間で読み取るために、ヘルプの人々が簡単にデバッグを変更するために、アルゴリズムを理解しています。たとえば、次のようにコメント
- 堅牢性:用の入力データ(パラメータ)正当性チェック。入力データが正当でない場合、アルゴリズムはむしろ例外よりも、治療に関連します。
- 高い時間効率と低メモリ要件(満たすようにしてください低複雑の時間と空間の複雑さを)
3.時間と空間の複雑さ
わずかに(1):(統計的手法事後)
の良好なテストプログラム(テスト)データを設計した後、効率を決定することであった実行時間を比較することによって。
事前に推定する(2)推定方法
、プログラム前推定アルゴリズムの統計的方法に記載の方法。
(3)時間と空間の複雑さ
アルゴリズムの時間複雑さは、主に使用されるアルゴリズムは、(「周波数」と称する)コードループ構造サイクルの数に依存します。数が少ない、アルゴリズムの時間計算量を下げます。
リセットスケールデータ入力は、Nであります
a) ++x; s=0;
b) for (int i = 1; i <= n ; i++) { ++x; s += x; }
c) for (int i = 1; i <= n; i++) {
for (int j = 1; i <= n; j++) { ++x; s += x; }
}
周波数f(n)は1、N、N ^ 2です。
アルゴリズムの時間複雑さ、時間は、覚えアルゴリズム対策:T(N)= O(F(N))
時間計算量はO(N)であり、bはO(1)の時間計算量は、Cは、時間複雑度はO(N ^ 2)です。
場合、Bは、プログラムの組成物の三つの例C、アルゴリズムの時間複雑度は、O(N ^ 2 + N +である 1)。
しかしながら、そのような表現は間違っているだけでなく、nの^ 2 + n + 1の簡略化のために。
三つのステップにまとめ簡体手順:
さらに、すべての一定の実行時間を取り外し1.。(例えば、N ^ 2 + N + 1、+ 2 ^ダイレクトは、n-N-なる)
2.のみ最もアイテム。(例えば、N ^ 2 + N ^ 2は、N-なる)
3.最高エントリが存在するが因子でない場合、係数を除去しました。(例えば、係数は1からn ^ 2です)
したがって、最終的には、bおよびc合併タイムコードの複雑さはO(N ^ 2)です。
常数阶:O(1)(单纯的分支结构也是执行一次)
int sum = 0,n = 100; /* 执行一次 */
sum = (1 + n) * n/2; /* 执行一次 */
printf("%d", sum); /* 执行一次 */
if(sum == 0) { /* 执行一次 */
printf("%d", sum);
} else {
printf("-1");
}
线性阶:O(n)(循环结构)
int i;
for (i = 0; i < n; i++) { /* 执行n次 */
/* ......(里面是O(1)) */
}
对数阶:O(logn)(迭代)
int count = 1;
while (count < n) {
//2^x=n x=logn
count = count * 2;
/* ......(里面是O(1)) */
}
平方(次方)阶:O(n^2),O(n^3)....
int i,j;
for(i = 0; i < n; i++) {
for(j = 0; j < n; j++) {
/* ......(里面是O(1)) */
}
}
循环嵌套
思考:下列代码的时间复杂度是?
(1)
int i,j;
for(i = 0; i < n; i++) {
for(j = i; j < n; j++) { /* 注意这里j=i */
/* ......(里面是O(1)) */
}
}
(2)
int n;
void function (int count) {
int j;
for(j = count; j< n; j++) {
/* ......(里面是O(1)) */
}
}
---------------------------------
n++;
int i,j;
function(n);
for(i = 0; i < n; i++) {
for(j = i; j < n; j++) { /* 注意这里j=i */
/* ......(里面是O(1)) */
}
}
第三に、仕事
図1に示すように、ブロックの時間的複雑さ)は、(以下で
s = 0;
for(i=0; i<n; i++)
for(j=0; j<n; j++)
s += B[i][j];
sum = s;
図2に示すように、時間計算量は次のプログラムセグメントです()
for(i=0; i<n; i++)
for(j=0; j<m; j++)
A[i][j] = 0;
図3に示すように、時間計算量は次のプログラムセグメントです()
i=1;
while(i<=n)
i = i*3;