1.2 数据结构——算法和算法分析

1.2.1 算法的定义

对特定问题求解方法和步骤的一种描述,它是指令的有限序列,其中每个指令表示一个或多个操作;简单来说,算法就是解决问题的方法和步骤。

1.2.2 算法的描述

1、自然语言:英文、中文。

2、流程图:传统流程图、NS流程图。

3、伪代码:类语言。

4、程序代码。

1.2.3 算法与程序

算法:是解决问题的一种方法或一个过程,考虑如何将输入转换成输出。

程序:是用程序设计语言对算法的实现。

程序 = 数据结构 + 算法。

1.2.4 算法的五个特性

1、有穷性:一个算法必须在执行有穷步骤后结束,并且每一步都在有穷时间内完成。

2、确定性:算法中的每一条指令必须有确切的含义、无二义性,在任何条件下,只有一条执行路径,即对于相同的输入只能得到相同的输出。

3、可行性:算法的每一步必须是可行的,每一步都可在执行有限次后完成。

4、输入:一个算法有0个或多个输入。

5、输出:一个算法有0个或多个输出。

1.2.5 算法设计的要求

1、正确性:算法的正确性是指算法应该具有输入、输出和加工处理无歧义性、能正确反映问题的需求、能够得到问题的正确答案。

主要分为以下四个层次:

(1)算法程序没有语法错误;

(2)算法程序对于合法的输入能够产生满足要求的输出;

(3)算法程序对于非法的输入能够得出满足规格说明的结果;

(4)算法程序对于精心选择的,甚至刁难的测试数据都有满足要求的输出。

2、可读性:算法的设计的另外一个目的是为了便于阅读、理解和交流。

3、健壮性:当输入数据不合法时,算法也能做出相关处理,而不是产生异常或莫名其妙的结果。

4、高效性:设计算法应该尽量满足时间效率高和存储量低的要求。

1.2.6 算法效率的度量方法

算法效率主要有以下两个方面考虑:

1、时间效率:指执行过程所耗费的时间。

2、空间效率:指执行过程中所耗费的存储空间。

时间效率和空间效率有时候是矛盾的。

算法效率的度量:

1、事后度量方法:通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序的运行时间进行比较,从而确定算法效率的高低。

这种方法有很大的缺点:

(1)必须依据算法事先编制好程序,这需要花费大量的时间和精力。

(2)时间的比较依赖计算机硬件和软件等环境因素,有时会掩盖算法本身的优劣。

(3)算法的测试数据设计困难,并且程序运行实际爱你往往还与测试数据的规模有很大关系,效率高的算法在小的测试数据面前往往得不到体现。

2、事前度量方法:在计算机程序编制钱,依据统计方法对算法进行估算。

算法运行时间 = 一个简单操作所需的时间*简单操作次数。

即算法中每条语句的执行时间之和:

算法运行时间 = Σ每条语句的执行次数*该语句执行一次所需的时间。

每条语句的执行次数又称为语句频度。

算法运行时间 = Σ每条语句频度*该语句执行一次所需的时间。

设每条语句的执行一次所需的时间为单位时间,所以我们计算算法运行时间只需考虑每条语句的频度之和。

1.2.7 算法时间复杂度的渐进表示法

为了方便比较不同算法的时间效率,我们仅比较它们的数量级。

age: T1 = 10n^2 和T2 = 5n^3

若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于0的常数,则称f(n)T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号),简称时间复杂度。

分析算法时间复杂度的基本方法:

1、找出语句频度最大的那条语句作为基本语句;

2、计算基本语句的频度得到问题规模n的某个函数f(n);

3、取其数量级用符号"O"表示。

age 1:

x = 0; 
y = 0;
for (int k = 0; k < n; k++)        //执行n+1次
    x++;                           //执行n次
for (int i = 0; i < n; i++)        //执行n+1次
    for(int j = 0; j < n; j++)     //执行n(n+1)次
        y++;                       //执行n*n次

这段代码中可以得到:f(n) = n(n+1),根据f(n)可得:T(n) = O(n^{2})

age 2:

for ( int i = 1; i <= n; i++)
    for (int j = 1; j <= i; j++)
        for (int k = 1; k <= j; k++)
            x++;

语句频度 =  \sum_{i=1}^{n} \sum_{j=1}^{i} \sum_{k=1}^{j} 1  =   \sum_{i=1}^{n} \sum_{j=1}^{i} j  =   \sum_{i=1}^{n} \frac{i(i+1)}{2}  =  \frac{1}{2}(\frac{n(n+1)(2n+1)}{6}+\frac{n(n+1)}{2})=  \frac{n(n+1)(n+2)}{6}

所以:T(n) = O(n^{3})

age 3:

i = 1;
while (i <= n)
    i = i*2;

设 i = i * 2;执行x次,可得:2^{x} <= n,即x < = \log_{2}n

f(n) <= \log_{2}n,取最大值f(n) = \log_{2}n

所以时间复杂度:T(n) = O(\log_{2}n)

算法时间复杂度:

最坏时间复杂度:指在最坏情况下,算法的时间复杂度。

平均时间复杂度:指在所有可能输入实例在等概率出现的情况下,算法的期望运行时间。

最好时间复杂度:指在最好情况下,算法的时间复杂度。

一般情况下是考虑在最坏情况下的时间复杂度,以保证算法的运行时间不会比它更长。

算法时间效率的比较

时间复杂度T(n)按数量级递增顺序为:

时间复杂度从低到高
常数阶对数阶线性阶线性对数阶平方阶立方阶...K次方阶指数阶
O(1)O(\log_{2}n)O(n)O(n\log_{2}n)O(n^{2})O(n^{3})O(n^{k})O(2^{n})

渐进空间复杂度

空间复杂度:算法所需存储空间的度量,记作:S(n) = O(f(n))

算法要占据的空间:

算法本身要占据的空间,输入、输出,指令,常数,变量等。

算法要使用的辅助空间。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值