アルゴリズム
- 計算=情報処理
工具によっては、特定のルールに従って、クリア及び機械の形で行われます - 、特定のコンピュータモデルの下で、特定の問題を解決するために設計された一連の命令である、いわゆるアルゴリズム、
- 保留中の入力情報(質問)
- 情報処理された出力(答え)
- 正しさは確かに特定の問題を解決することができます
- 決定論的アルゴリズムのいずれかは、以下からなる基本的な一連の動作として説明することができます
- 各基本的な操作の実現可能性は、カットを完了するのに一定の時間で実現することができます
- 任意の入力に貧弱な耐性を持っており、基本的な操作を通じて貧しい時代を出力することができます
序列Hailstone(n)
グッドアルゴリズム
- 正しいです
- 堅牢な
- 可読
- (できるだけ速くとして、可能な限り小さな収納スペース)効率
To measure is to know.
If you can not measure it,
you can not improve it.
- Lord Kelvin
アルゴリズム分析
2つの側面:
- 正しさ;
- コスト:時間+領域必要な実行
RAM:ランダムアクセスマシン
- レジスタシーケンス番号、合計数が限定されるものではない(R [0]、R [1] ...)
- それぞれの基本的な操作のみ時定数
- TMモデルの外観と同様に、RAMは、我々は、アルゴリズムの効率に信頼できる比較や評価を行うために、特定のプラットフォームに依存しないことができるように、一般的にコンピュータモデルの簡素化と抽象化です
- これらのモデルでは、アルゴリズムの実行時間+無限アルゴリズムは動作のよああ、基本的な数がnの問題の規模を解決するために、T(N)=アルゴリズムによって実行される、動作の数は、基本を実行するために必要な必要
ランダウの記号
Mathematics is more in need
of good notations than
of new theorems.
- Alan Turing
好读书不求甚解
每有会意,便欣然忘食
-- 陶渊明
定数(定数関数)
のこのタイプの最も効率的なアルゴリズム
、アルゴリズム解析
He calculated just as men breathe
as eagles sustain themselves in the air.
- Francois Arago
二つの主要なタスク
- 正しいこと
- 複雑
複雑性分析の主な方法
- イテレーション:総和
- 再帰:再帰的に追跡+プッシュリリース
- +認証をゲス
シリーズ
- 等差数列:最後の項目と同じ順序の広場
- パワー和シリーズ:最初のオーダーの電力よりも高いです
- 等比数列:同じ順序の最後の項目
- コンバージェントシリーズ:定数
- 高調波シリーズ:1 + 1/2 + ... + 1 / N = O(Nログ)
- 対数進行:LOG1 + LOG2 + ... + LOGN = O(Nログ)
相关书籍:Concrete Mathematics
バブルソート
//n 为在某个位置之前排序(不包含),相当于arr数组的长度
public void vuvvlesort(int[] arr,int n){
for(boolean sorted = false; sorted = !sorted; n--){
for(int i = 1; i < n; i++){
if(arr[i-1]>arr[i]){
swap(arr,arr[i-1],arr[i]);//交换两个元素位置函数,需要自己实现
}
}
}
}
裏表紙推定値(バック・オブ・エンベロープ計算)
某位物理学家当时在测量原子弹爆炸威力时,在安全范围内将一张纸撕成很多个碎片,在爆炸时将手里的纸扔下,通过计算纸张落下的位置来 计算原子弹爆炸的威力,与当时计算机计算出来的数值仅仅差距为2倍,换算成O的算法,同阶!!!
小さな思考:あなたは地球の円周を測定した場合、どのように?
イテレーションは人工的な、再帰的なパーティー超自然的な力(反復するためには、再帰する人間、である 、神。)
パブリックな未亡人原則としてルールは、スコアも(大きな力の制御がされている場合 、いくつかの男性のコントロールと同じ原理:それはありますその数を分割の単なる質問 )
ジェーンと統治
分割統治
- ハーフ再帰的
配列の合計:半分再帰
sum(int[] arr,int lo,int hi){
if(lo == hi) return arr[lo];
int mi = (lo + hi) >> 1;
return sum(arr, lo, mi) + sum(arr, mi + 1, hi);
}
public int[] max2(int[] arr, int lo, int hi){
int[] result=new int[2];
if (lo + 2 == hi) {
return arr[lo] >= arr[lo+1] ? new int[]{ arr[lo], arr[lo + 1] } : new int[]{arr[lo + 1], arr[lo]};
}
if (lo + 3 == hi) {
if (arr[lo] >= arr[lo + 1]) {
return arr[lo + 1] > arr[lo + 2] ? new int[]{arr[lo], arr[lo + 1]}
: arr[lo] >= arr[lo + 2] ? new int[]{arr[lo], arr[lo + 2]} : new int[]{arr[lo + 2], arr[lo]};
} else {
return arr[lo] > arr[lo + 2] ? new int[]{arr[lo+1], arr[lo]}
: arr[lo + 1] >= arr[lo + 2] ? new int[]{arr[lo + 1], arr[lo + 2]}: new int[]{arr[lo + 2], arr[lo + 1]};
}
}
int mi = (lo + hi) >> 1;
int[] los = max2(arr, lo, mi);
int[] his = max2(arr, mi, hi);
if (los[0] >= his[0]) {
return los[1] >= his[0] ? new int[]{los[0], los[1]} : new int[]{los[0], his[0]};
} else {
return his[1] >= los[0] ? new int[]{his[0], his[1]} : new int[]{his[0], los[0]};
}
}
private void swap(int[] arr, int a, int b) {
arr[a] = arr[a] ^ arr[b];
arr[b] = arr[a] ^ arr[b];
arr[a] = arr[a] ^ arr[b];
}
ダイナミックプログラミング
Make it work,
make it right,
make it fast.
- Kent Beck
思考の計算:フィボナッチ数
public int f(int n){
if(n == 0){
return 0;
}else if(n == 1){
return 1;
}
return f(n - 1) + f(n - 2);
}
アルゴリズムの時間計算量が特に高い、おそらく50必要数に関する顕著な遅延が表示されており、それぞれの後に複数の指数関数的成長表示され、アルゴリズムの時間複雑度は、O(N ^ 2)であり、
改善:
public int f(int n){
int f=0;
int g=0;
while(0 < n--){
g += f;
f = g - f;
}
return g;
}
シーケンス(サブシーケンス):
二つの文字列の最も一般的なシーケンスを実行します
等待更新...
递归版本(O(2^n))
动态规划版本(O(m*n))
ベクトル
&抽象データ型のデータ構造
- 抽象データ型:データモデル+モデル操作のセットで定義されています
- データ構造:特定の言語に基づいて、アルゴリズムADTのセットを達成するために
リニアアレイ
- 静的空間管理- >ダイナミックスペース管理
蝉の哲学:
成長のすべての期間の後、本体だけでなく、住宅を収容することができない
ことではなく、オリジナルのシェルを流しています... - 容量戦略倍増
インクリメントを
分析方法:
- 平均分析
- シェア分析