一些算法总结

来源:互联网 发布:mac 装win10 鼠标右键 编辑:程序博客网 时间:2024/05/18 17:03


运行时间计算

一般法则

法则1——for循环

一次for循环的运行时间至多是该for循环内语句(包括测试)的运行时间乘以迭代的次数。

法则2——嵌套的for循环

从里向外分析这些循环。在一组嵌套循环内部的一条语句总的运行时间为该语句的运行时间乘以该组所有的for循环的大小的乘积。

法则3——顺序语句

将各个语句的运行时间求和即可(其中的最大值就是所得的运行时间)。

法则4——IF/ELSE语句

if(condition)  S1else  S2

一个if/else语句的运行时间从不超过判断再加上S1和S2中运行时间长者的总的运行时间。

基本上分析的基本策略是从内部(或最深层部分)向外展开的。如果有函数调用,那么这些调用要首先分析。

如果有递归过程,那么存在几种选择。

若递归实际上只是被薄面纱遮住的for循环,则分析通常是很简单的。

分析算法最混乱的方面大概集中在对数上面。我们已经看到,某些分治算法将以O(NlogN)时间运行。除分治算法外,可将对数最常出现的规律概括为下列一般法则:如果一个算法用常数时间O(1)将问题的大小削减为其一部分(通常是1/2),那么该算法就是O(logN)。另一方面,如果使用常数时间只是把问题减少一个常数(如将问题减少1),那么这种算法就是O(N)的。

显然,只有一些特殊种类的问题才能够呈现出O(logN)型。例如,若输入N个数,则一个算法只是把这些数读入就必须耗费(N)的时间量。因此,当我们谈到这类问题的O(logN)算法时,通常都是假设输入数据已经提前读入。

五大常用算法(思想)

分治

把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。

动态规划

每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

贪心

在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的仅是在某种意义上的局部最优解。 

回溯

回溯算法实际上一个类似枚举的搜索尝试过程,主要是在搜索尝试过程中寻找问题的解,当发现已不满足求解条件时,就“回溯”返回,尝试别的路径。

分支限界

类似于回溯法,也是一种在问题的解空间树T上搜索问题解的算法。但在一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出T中满足约束条件的所有解,而分支限界法的求解目标则是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。

0 0