基礎——アルゴリズム
2147 ワード
5つのアルゴリズムはここから来ています
ぶんかつアルゴリズム
分けて治す:直接解決しにくい大きな問題を、いくつかの規模の小さい同じ問題に分割して、それぞれを破壊して、分けて治す.
分割法には、各階層の再帰に3つのステップがあります.
その中の最後のステップは、統合であり、分治アルゴリズムの特徴である.一般的に動的に計画すればいいです.
ダイナミックプランニング
特徴:サブ問題の解には重複部分があり,中間結果はcacheできる.逆押し.keys:状態変数,中間結果,遷移方程式
動的計画には、各階層の再帰に2つのステップがあります.
テンプレート:
欲張りアルゴリズム
特徴:貪欲法は一般的に最適な問題を解くために用いられ、実際には問題の状態空間ツリーを検索し、この状態空間ツリーの中で最適な経路を検索して最適な戦略を求める.貪欲法は上から下まで深さ探索のみを行い,その代価はサブ問題の数,すなわち木の高さに依存し,現在の問題の状態で毎回選択されるのは1であり,すなわち,実際には広さ探索を行わないため,得られる解が必ずしも最適解ではなく,近似最適解である可能性が高いという欠点をもたらした.
さかのぼる
https://segmentfault.com/a/1190000006121957特徴:ステータス空間ツリーで深さ検索を行い、広さ検索を行います.key:決定関数テンプレート:
ぶんかつアルゴリズム
分けて治す:直接解決しにくい大きな問題を、いくつかの規模の小さい同じ問題に分割して、それぞれを破壊して、分けて治す.
分割法には、各階層の再帰に3つのステップがあります.
step1 : , , ;
step2 : ,
step3 : 。
その中の最後のステップは、統合であり、分治アルゴリズムの特徴である.一般的に動的に計画すればいいです.
ダイナミックプランニング
特徴:サブ問題の解には重複部分があり,中間結果はcacheできる.逆押し.keys:状態変数,中間結果,遷移方程式
動的計画には、各階層の再帰に2つのステップがあります.
step1
step2
テンプレート:
ArrayList> totalResult \\
void DP(map, intermediateResult, currentState){
if(currentState== ){
= new(intermediateResult) \\for safety
totalResult.add( )
}
else{
// .....
intermediateResult.add()
DP(map, intermediateResult, NextState)
intermediateResult.remove() // , remove
// ....
}
}
欲張りアルゴリズム
特徴:貪欲法は一般的に最適な問題を解くために用いられ、実際には問題の状態空間ツリーを検索し、この状態空間ツリーの中で最適な経路を検索して最適な戦略を求める.貪欲法は上から下まで深さ探索のみを行い,その代価はサブ問題の数,すなわち木の高さに依存し,現在の問題の状態で毎回選択されるのは1であり,すなわち,実際には広さ探索を行わないため,得られる解が必ずしも最適解ではなく,近似最適解である可能性が高いという欠点をもたらした.
さかのぼる
https://segmentfault.com/a/1190000006121957特徴:ステータス空間ツリーで深さ検索を行い、広さ検索を行います.key:決定関数テンプレート:
finalResult;
void backTracking(intermediateResult, state){
if( )
return ;
if(intermediateResult ){
finalResult.add(intermediateResult)
return finalResult;
}
for( ){//
backTracking(intermediateResult,nextState);//
}
return ;
}