算法策略间的比较

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

浅谈算法间的策略比较

算法策略的中心思想是:将解决问题的过程归纳为可以用基本工具“循环机制和递归机制”表示的规范操作。

当我们面临实际的各种问题时,应该首先分析它属于常见问题中的哪一种。对于查找问题,它在实际运用中主要用于搜索,而且要求时间效率很高。

1算法设计

1.1穷举法,采用2~n-1之间的数试除法。

这是最自然的想法,如果n除以在这个范围内的任一数,而余数为0,则这个数就是n的因子。求余数采用取模的方法。

1.2采用2~sqrt(n)之间的数试除。

因为n的最大因子≤n/2,如果求出n在2~n/2范围内的因子i,那么n 的另外一个因子就是n/i。但是在这个范围内有重复操作。所以还可缩小范围在2~sqrt(n),这样就避免了重复输出。

1.3采用迭代法解数学模型。

一个合数的所有因子都可以由素数相乘得到。所以只要求出n的所有素数因子就可以相应求出它的所有因子。由此该问题将被分解为整数因子划分和素数测试两个子问题。

数学模型设计:n=P1(Q1)*P2(Q2)………Pn(Qn)

其中,P1<P2<……<Pn是素数,P1(Q1)表示P1的Q1次方,Q1,

Q2……Qn是正整数。

数据结构设计:新增两个一维数组A[N]与B[N],其中A[i]存放素数Pi,B[N]存放该素数的指数Qi因为小于10的4次方的素数有1229,小于10的8次方的素数有5761455个,小于10的12次方的素数有37607912018个。如果n值很大,则相应地N值就会很大,用A[0],B[0]存放实际元素个数。算法优化:对算法3中的整数划分算法其实就是一个求质数的问题。质数除了2

之外,其余的都是奇数,所以可以把2单独考虑,在3~sqrt(n)范围内每次都自增2,而不是自增1,这样又大大缩小了时间复杂度,得到O(log2(n)/2)。

1.4 采用递归法求解数学模型

因为算法3的整数因子划分算法其实是个递推过程,现在把它转换成递归过程。其中数组A[N],B[N],变量L都设置为外部变量,且都初始化为0。

2算法分析

算法1分析:问题域从2~n-1,基本语句为if(n%i==0),该语句执行次数为n-2次,时间复杂度为O(n)。

算法2分析:其基本语句与算法1相同,语句执行次数为sqrt(n)-1,时间复杂度为O(log2(n))。对于一个正整数n,其位数为m=[log10(n+1)],则算法时间复杂性是O(10m/2)。假设m=40,每次循环只需要1ns,它也需要花费1000年的时间完成。

算法3分析:在整数因子划分算法中采用了迭代法,对每找到一个质数因子i,n的值就变成n/i。其基本语句是n=n/i,时间复杂度为O(log2(n))如果n=24,n的值变化情况如下:24->12->6->3->1。也就是说for循环语句只执行了2次,基本语句n=n/i执行了4次。有两次调用了素数判断算法,该算法只分别执行了1次。所以总共执行了5次,这与算法2:sqrt(n)-1=sqrt(24)-1=3次相比时间复杂度增加,而且还开辟了两个数组,浪费了空间。因此对于n域较小时,直接使用穷举法最合适。若是n域很大,其位数超过16位,显然采用迭代法求解可以将n划分成更小的值,其时间复杂度将大大减小。

算法4分析:算法4的时间复杂度与算法3相当,但是又需要增加栈来操作,所以对该问题递归算法没有递推算法好。这也正好验证了对于大多数实际问题能够采用递推法的时候尽量不要使用递归法。因为分治法与动态规划法都是递归算法思想的应用与扩展,那么采用这两种策略是否能够提高效率。

分治法有一个很重要的特征,就是该问题所分解出的各个子问题是相互独立的,且子问题之间不包含公共的子问题。对于整数因子分解,它显然不满足该特征。首先,它包含公共的子问题:判断素数,其次各子问题之间也不是独立的,都与n,i有关。

动态规划=贪婪策略+递推+存储递推结果。贪婪策略采用的是局部处理法

来求解最优解,因此它具有无向性。即后面的过程不会影响前面的状态,只与当前状态有关,从而达到由局部最优解构造出全局最优解。但是整数因子分解并不是个求最优解的过程,所以不适合采用贪婪策略解该问题。

虽然这两种策略不适合该问题,但是它们在实际运用中很广泛。如果采用蛮力法的选择排序与起泡排序,其时间复杂度是O(n(2)),但是采用归并排序与快速排序其时间复杂度可以缩小为O(nlog2(n)),减小了一个数量级。n值越大,分治策略的优越性就越明显。

3算法策略比较

由以上分析可知,解决该问题最好的策略是迭代法。对于问题域较小又容易解决的问题采用蛮力法。对于需要进行数值计算的问题采用迭代法。对于较复杂难以直接解决,必须进行分解才能解决的的大问题,采用分治法和动态规划法。特别是当这个问题涉及到最优化问题时采用动态规划法。如果这个问题在每一阶段的选择都是当前状态下的最优选择,并且最终能够求得问题的整体最优解,则采用贪心法。

在计算机领域中,最常见的问题有:查找问题、排序问题、图问题、组合问题、几何问题。蛮力法解决这些问题,一般情况下时间复杂度分别为O(n)、O (n*n)、O(n!)、O(2(n))、O(n*n)。它的解题思路简单明了,实现容易,附加空间小,而且经过思考可以对算法进行一定程序的改良。但是对于组合问题,图问题,除非是问题规模非常小的实例,否则蛮力法几乎不实用。分治法解决各种问题比蛮力法更优越,大多情况下时间复杂度均为O(nlog(2(n))。它利用空间复杂度来换取时间效率。因此查找或排序的速度更快。迭代法可进行数学建模,对于问题规模大而且可以设计数学模型的问题来说,它比其它算法更优越。贪婪策略和动态规划策略对图问题,组合问题比其它策略更好。只是动态规划比贪婪策略更通用。因为很多问题采用贪婪策略可能找不到解时,采用动态规划可以解决。如果贪婪策略可以解决,一般采用贪婪策略。

当我们面临实际的各种问题时,应该首先分析它属于上述常见问题中的哪一种。对于查找问题,它在实际运用中主要用于搜索,而且要求时间效率很高。若搜索的内容是已经排好序的线性表,这时应该采用分治法。若搜索的内容是需要进行增、删改的动态查找表,则采用动态规划法。对于排序问题,在实际运用中

相关文档
最新文档