【算法设计与分析】——算法及效率分析基础(二)

算法分析框架

  1. 基本操作它通常是算法最内层循环中最费时的操作。四则运算中:加、减、乘、除。其中最耗时的操作是除法,其次是乘法,最后是加法和减法。

  2. 问题规模:排序:数组中元素个数n.
                      检索:被检索数组的元素个数n.
                      矩阵相乘:矩阵的行列数i,j,k.
                      图的遍历:图的顶点数n,边数m
  3. 稳定性:如果一个排序算法保留了等值元素在输入中的相对顺序,就可以说它是稳定的(stable)。换句话说,如果一个输入列表包含两个相等的元素,它们的位置分别是i和j,i<j, 而在排好序的列表中,它们的位置分别为i'和j',那么i'<j'肯定就是成立的。一般来说,将相隔很远的键交换位置的算法虽然不稳定,但往往速度很快。
  4. 在位:对于排序算法来说,第二个值得注意的特性是算法需要的额外存储空间(如数组)。如果一个算法不需要额外的存储空间(除了个别存储单元以外),我们就说它是在位的(in-place)。重要的排序算法有些是在位的,有些则不是。

基本算法效率类型

基本的渐近效率类型
类型名称注释
1常量为数很少的效率最高的算法,很难举出几个合适的例子,因为典型情况下,当输入的规模变得无穷大时,算法的运行时间也会趋向于无穷大
log n对数一般来说, 算法的每一次循环都会消去问题规模的一个常数因子。注意,一个对数算法不可能关注它的输入的每一个部分(哪怕是输入的一个固定部分):任何能做到这一点的算法最起码拥有线性运行时间
n线性扫描规模为n的列表(例如,顺序查找)的算法属于这个类型
n logn线性对数许多分治算法,包括合并排序和快速排序的平均效率,都属于这个类型
n^2平方一般来说,这是包含两重嵌套循环的算法的典型效率。基本排序算法和n阶方阵的某些特定操作都是标准的例子
n^3立方一般来说,这是包含三重嵌套循环的算法的典型效率。线性代数中的一些著名的算法属于这一类型
2^n指数求n个元素集合的所有子集的算法是这种类型的典型例子。“指数” 这个术语常常被用在一个更广的层面上,不仅包括这种类型,还包括那些增长速度更快的类型
n!阶乘求n个元素集合的完全排列的算法是这种类型的典型例子

递归算法效率分析

分析递归算法时间效率的通用方案
(1)决定用哪个(哪些)参数作为输入规模的度量标准。
(2)找出算法的基本操作。
(3)检查一下,对于相同规模的不同输入,基本操作的执行次数是否可能不同。如果有这种可能,则必须对最差效率、平均效率以及最优效率做单独研究。
(4)对于算法基本操作的执行次数,建立一个递推关系以及相应的初始条件。
(5)解这个递推式,或者至少确定它的解的增长次数。
 

非递归算法效率分析

分析非递归算法效率的通用方案.
(1)决定用哪个(哪些)参 数表示输入规模。
(2)找出算法的基本操作(作为-一个规律,它总是位于算法的最内层循环中)。
(3)检查基本操作的执行次数是否只依赖于输入规模。如果它还依赖于一些其他的特性,则最差效率、平均效率以及最优效率(如有必要)需要分别研究。
(4)建立一个算法基本操作执行次数的求和表达式。
(5)利用求和运算的标准 公式和法则来建立一个操作次数的闭合公式,或者至少确定它的增长次数。

例子:

算法MaxElement(A[..n- 1])
//求给定数组中最大元素的值
//输入:实数数组A{0..n- 1]
//输出: A中最大元素的值
maxval←A[O]
for i←1 to n-1 do
     if A[i] > maxval
        maxval←A[I]
return maxval
此时输入规模为n,循环体中有赋值和比较两种操作,由于比较每次都会执行,赋值并不是,所以基本操作为比较。

把C(n)记作比较运算的执行次数,则有求和表达式   C(n)= {\sum_{i=1}^{n-1}}1 = n-1 = Θ(n)

算法的数学基础

  • 几类重要的函数

1、至少指数级: 2n, 3n, n!, …

2、多项式级: n,  n2,  nlogn,  n1/2, …

3、对数多项式级: logn,  log2n,  loglogn, …

4、对数函数:logn= log2 n

                        logkn = (logn)k

                        loglogn= log(logn)

     性质: (1)   log2n = Θ (logln)

                 (2)   logbn = o(n^α )α > 0

                 (3)   a^logb n= n^logb a

5、指数函数与阶乘

stirling公式  n! = (2πn)^1/2 (n/e)^n(1+Θ(1/n))

n! = o(n^n)

n! = ω(2^n)

log(n!) = Θ(nlogn)

log(n!) = Ω(nlogn)

  • 序列求和的方法

  • 迭代法求解递推方程

  1. 不断用递推方程的右部替换左部迭代法 
  2. 直到出现初值停止迭代 
  3. 每次替换,随着 n 的降低在和式中多出一项    
  4. 将初值代入并对和式求和     
  5. 可用数学归纳法验证解的正确性 
  • 差消法化简递推方程

  • 递归树

    

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值