アルゴリズムの基本的な考え方

アルゴリズム設計の一般的な 5つの基本的なスキルは、貪欲法、分割統治アルゴリズム、ダイナミックプログラミング、乱択アルゴリズムとバックトラックアルゴリズムがあります。

。貪欲アルゴリズム

各地域の最適な選択をするとき、アルゴリズムの終わり、ですが、期待は大域的最適解が正しいことです。しかし、時には、ときに、異なる条件と要件の下で、最良の答えは、複数の解決策、または同じではないが、貪欲アルゴリズムはおおよその答えを描くことができますを有することができます。

1.マルチプロセッサスケジューリング

完了したジョブのマルチプロセッサスケジューリングにおける問題は、表 1-1ジョブスケジューリングは、最小平均時間最適回答に図1-1および1-2の方法で行ってもよいです。

仕事

J1

J2

J3

J4

J5

J6

J7

J8

J9

時間

3

5

6

10

11

14

15

18

20

1-1仕事とスケジュール

 

1-1ジョブスケジューリングモード1                                                                                 1-2ジョブスケジューリングモード2

二つの異なる方法、貪欲なスケジューリング・アルゴリズムを使用する最初の方法をスケジュールジョブでは、各プロセッサが時系列第1のスケジューリング処理動作を開始するの平均処理時間を取得するために、最小限の処理を必要と 18.33です。ジョブスケジューリングの相対的な順序は、他のプロセッサにその処理を変更する変更することなく、第2のスケジューリングモードは、平均的な処理時間は、同様に18.33得ます。

しかし、第2のスケジューリングモード、最後のジョブ完了時間における 38、及び40の終了時の第一の端部。仕事を完了するための最後の時間を考慮した場合、最初のスケジューリング貪欲アルゴリズムは最高の答えを得るために使用される場合に考慮されることはありません。

問題を梱包、問題、貪欲アルゴリズムの使用を梱包する際に貪欲アルゴリズムの別のアプリケーションは、より速い速度を解決することができ、その答えは必ずしもベストではないですが、また、ほぼ最適。

2.ハフマンアルゴリズム

ハフマンアルゴリズムは、アルゴリズムを使用して、典型的な貪欲なアルゴリズムです。

森の中で、新しいツリーを形成し、2点の重みは、フォレスト内の最後にのみツリーまで、新しいツリーを形成している最小数を選択するための選択された2つの重みの最小数は、最小量の木であります。次のようにハフマン符号は、

 

1-3ハフマンツリーアルゴリズムのコード実装

 

プライオリティキューハフマンアルゴリズムの場合、その実行時間は、に最適化することができます O(NlogN)。

 

二つ。分割統治法

 

アルゴリズムを分割統治単純な再帰が、マイナーな問題に元の問題の再帰的なソリューションを解決し、問題の子供からのソリューションを構築するための大きな問題ではありません。ポイントのルールのアルゴリズム - 例えば、クイックソートとマージソートポイントは分割統治法、および再帰的なトラバースバイナリ木探索のグラフ再帰の深さとはありません数えます。

 

分割統治アルゴリズムの計算は重要な定理の走行時間を持っています

問題の大規模が分割を使用して解決する多くの小さな独立した問題に分解アルゴリズムを征服することができるよりも広く使われているアルゴリズムの分割統治。

クイック選択アルゴリズムは分割統治アルゴリズムの簡単な比較を使用することに基づいています。より大きな選択、再帰の元の問題の大きさまでのサブ問題のグループ分割方式の中央値を取ることによって値の5つの元を選択するための高速アルゴリズムの実行時間はOであるように、アルゴリズムの効率を向上させるために、70% (N)。

5元メジアングループの値はすぐにセグメンテーションを取っ各々は、5つの要素、設定値第(N / 10)について取得するために、各グループの中央値8を見つけるために比較の使用のその値の組に分け、N個の要素からグループkの小さな要素が見つかるまで、スプリット高速な選択アルゴリズムを呼び出します。

以上の整数のビット数を乗じた、除算を使用して、その動作を最適化するアルゴリズムを征服し、その実行時間は、サブ次の時間のために最適化することができます。同様に、複雑な行列乗算、分割統治法は、ランタイムアルキレン立方時間を最適化することができます。

。動的計画

動的プログラミングアルゴリズムの差は分割して2つのアルゴリズムはまた、小さな問題に大きな問題を打破し、征服することで、動的プログラミングを解決繰り返されるいくつかのこれらのより小さい問題の元の問題の明確なセグメンテーションではありません大きな問題を扱うとき、あなたはマイナーな問題に対処するために繰り返しますが、あまり直接的に解決するために、記録の質問に答えることができないようなので、動的なプログラミングソリューションは、小さな問題を記録します。

动态规划的典型运用就是对斐波那契数T(N)=T(N-1)+T(N-2)的求解,斐波那契数的求解同样可以运用分治算法,不过在其使分治算法中,其运行时间是随着N呈指数增长的,这显然会造成程序效率的低效。

而对斐波那契数使用动态规划求解的时候,计算T(N)只需将前面求解过的T(N-1)和T(N-2)进行相加即可,这种算法的实现也比较简单,代码可以实现如下,

3-1 使用动态规划设计的斐波那契数求解算法代码

Floyd算法在求图的每一个顶点到其他所有顶点的最短路径中也应用了动态规划的设计技巧。虽然dijkstra算法通过迭代V次也可以以O(V^3)求出,但Floyd算法在求解稠密图的时候更快,且能应对存在负边值无圈的图。

该算法在求解顶点i和j之间的最短路径时,尝试绕过其他顶点k来求最短路径,并保留相应的结果,以备其他顶点在求解时使用,其代码的实现也相对容易,设置两个矩阵以保留最短路径权值和路径通路,实现如下

3-2 Floyd算法的实现

.随机化算法

随机化算法的一个应用是在快速排序中对枢纽元素的选择,使得算法的运行时间不止依赖于特定的输入,还而且还依赖于所出现的随机数。虽然一个随机化算法的最坏情形运行时间常常与非随机化算法的最坏情形运行时间相同,但两者还是有区别的,好的随机化算法没有坏的输入,而只有坏的随机数。

即在非随机化算法中,存在特定的输入序列总使得算法产生最坏的O(N^2)运行时间。如果运用随机化算法,且将该特定的序列输入运行,该算法的每一次运行将会得到不同的运行时间。

随机化算法的第二个应用是测试大数是否为素数,虽然该算法会出错,但随着测试次数的增多,那么错误的概率可以小到忽略不计。

五.回溯算法

回溯算法相当于穷举搜索的巧妙实现,对比蛮力的穷举搜索,回溯算法可以对一些不符合要求的或者是重复的情况进行裁剪,不再对其进行搜索,以减少搜索的工作量提高效率。比如,在图运用回溯算法的深度优先搜索遍历中,会对已搜索遍历过的顶点进行标记,避免下次的回溯搜索中对再次出现的该顶点进行重复遍历。

书中一例子是收费公路重建问题的应用。

对距离集合D,在一条路径上重构出符合距离集合D的点集X。比如,对距离集合D={1,2,2,2,3,3,3,4,5,5,5,6,7,8,10}重构出点集X,而重建所的到的决策树如下图5-1,对于下x4=7的决策点,其下的决策都的得不到符合距离集合D的要求结果,因此需要回溯到x5=8的决策点,再对其下同下x4=7对等的决策点x2=3进行测试,以求最终结果。

 

5-1 收费公路重建距离集D对应的决策树

重建完后,可以得到如下结果,

 

5-2 距离集合D对应的点集重建

 

          

おすすめ

転載: www.cnblogs.com/lincz/p/10961025.html