算法--递归、穷举、冒泡排序及复杂度

算法

1,概念

指解题方案的准确而完整的描述,是一系列解决问题的清晰指令,算法代表着用系统的方法描述解决问题的策略机制,也就是说,能够对一定规范的输入,在有限时间内获得所要求的输出,不同的算法可能用不同的时间、空间或效率来完成同样的任务。一个算法的优劣可以用空间复杂度与时间复杂度来衡量。

2,特征

1>有穷性(Finiteness):指的是算法必须在执行有限个步骤之后能够终止,简单的理解,就是程序需要一个终止的标识,不然程序可能就会陷入死循环的状态。

2>确切性(Definiteness):每一步必须有确定的定义。

3>输入项(Input):有0个或者多个输入,给予运算对象的一个初始状态,所谓0个输入是指算法本身定出了初始条件。

4>输出项(Output):有1个或者多个输出,反映输入的数据被程序加工后的结果,没有输出的算法是没有意义的。

5>可行性(Effectiveness):算法中执行的任何计算步骤都是可以被分解为基本的可执行的操作步骤,即每个计算步骤都可以在有限时间内完成(也称之为有效性)。

3,评定

同一个问题可以用不同的算法解决,一个算法的质量好坏影响到这个算法和程序的执行效率,一个算法的评价主要从时间复杂度和空间复杂度来考虑。

3.1 时间复杂度

时间复杂度是指执行算法所需要的计算工作量。一般来说,算法的时间复杂度记做:T(n)=Ο(f(n))
因此,问题规模n 的值越大,算法执行的时间的增长率与f(n) 的增长率正相关,称作渐进时间复杂度(Asymptotic Time Complexity)。

按数量级递增排列,常见的时间复杂度有:

常数阶O(1),对数阶O(log2n),线性阶O(n),线性对数阶O(nlog2n),平方阶O(n^2), 立方阶(n^3),…, 指数阶O(2^n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低

以上六种计算算法时间的多项式是最常用的。其关系为:
O(1)<O(logn)<O(n)<O(nlogn) <O(n2)<O(n3)

指数时间的关系为:O(2n)<O(n!)<O(n^2)
当n取得很大时,指数时间算法和多项式时间算法在所需时间上非常悬殊。

3.2 空间复杂度

空间复杂度是指算法需要消耗的内存空间,其计算和表示方法与时间复杂度相似,同时间复杂度相比,空间复杂度的分析要简单一些。一般记作:记做S(n)=O(f(n))

二者的关系:对于一个算法,时间复杂度和空间复杂度往往是相互影响的。当想要一个较好的时间复杂度时,可能会使空间复杂度的性能变差,即可能导致占用较多的存储空间;反之,当想要一个较好的空间复杂度时,可能会使时间复杂度的性能变差,即可能导致占用较长的运行时间

4,方法

4.1 递归法

程序调用自身的方法技巧称为递归(recursion)。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

注意:1)递归就是在过程或函数里调用自身;
2)在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。

例题:利用递归实现斐波那契数列,斐波那契数列规律为1,1,2,3,5,8,13,21,…
在这里插入图片描述

4.2 穷举法

是一种最简单的算法,来穷尽出现的问题每一种可能的情况,从而解决问题。简单地说,利用循环把各种可能出现的情况都走一遍,把满足要求的结果筛选出来。

适用的场景:穷举的效率不高,用于没有明显规律的情况。

例题:韩信点兵问题,韩信知道部队人数大约1000人左右,具体数字不详,5人一组剩余1人,7个人一组还剩两个人,8个人一组还剩3个人,问:这支部队有多少人?

在这里插入图片描述

4.3 冒泡排序

一种简单直观的排序算法,重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢"浮"到数列的顶端。

思想:比较相邻的元素。如果前一个比后一个大,就交换他们两个的位置,对每一对相邻元素作同样的工作,第一轮之后,最大的数会在最后,就这样从第一对开始到结尾的最后一对,重复以上的步骤,执行的次数会越来越少,直到没有任何一对数字需要比较。

例题:对一组数字利用冒泡的方法进行排序,结果从小到大

在这里插入图片描述
在这里插入图片描述

5,算法的复杂度

在这里插入图片描述

扩展

练习题:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
在这里插入图片描述

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页