数据结构-二 算法和算法评价


定义:算法是对问题求解步骤的描述,通过有限序列的指令来实现。

特征

  1. 有穷性:有限步之后结束,不会出现无线循环。
  2. 确定性:不存在二义性,算法每个步骤被精确定义。
  3. 可行性:受限计算机的能力等因素,有些算法理论上可行,实际上无法完成。
  4. 输入:能被计算机处理的各种数据类型。
  5. 输出:一至多个程序输出结果。


算法的复杂度

时间复杂度:

  •  它用来衡量算法问题规模增大,算法执行时间增长的快慢
  • 时间复杂度是问题规模的函数:记作T(n),时间复杂度主要分析T(n)的数量级。
  • T(n)=O(f(n)),大O记法,f(n)是算法中基本运算的频度,一般我们考虑最坏情况下的时间复杂度。

空间复杂度:

  • 它用来衡量算法随着问题规模增大,算法所需空间增长的快慢
  • 是问题规模函数:S(n)=O(g(n))

 

常用的时间复杂度大小关系:

                 O(1)<O(logn)<O(n)<O(nlogn)<O(n^{2})<O(n^{3})<O(2^{n})

从左至右,时间性能依次降低。


复杂度的计算

eg:

int sum=0                      //执行一次
for (int i=0; i<=n; i+1){       // i=0执行一次,i<=n执行n+2次,i+1执行n+1次
    sum=sum+i;                  // 执行n+1次
}

时间分析:

      共执行(3n+6)个语句,每个语句执行时间为常数t,执行总的时间T=(3n+6)*t。

随着n增大,T与n的增长率一致。所以复杂度为O(n)。

复杂度是关于增长率的,因此忽略常数项,一般直接关注循环段的基本操作的执行次数。

 

单个循环体

关注循环体的执行次数,设为k.

int sum=0;
for(int i=0;i<=n;i++){
    sum=sum+i;
}

循环体执行次数:k=n+1

时间复杂度为O(n)

 

int sum = 0;
for (int i=0; i<=n; i=pow(2,n)){
    sum = sum + i;
    }

那么,2^{k}\leq n,当 k>log_{2}n 时,跳出循环。

所以执行次数为[log_{2}n],所以时间复杂度logn。

多个循环体

两个运算规则:乘法规则和加法规则

for (i=1;i<=n;i++)
    x++;

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

两个循环体是独立的,采用加法规则

时间复杂度为:T(n)=T1(n)+T2(n)=max(T1(n),T2(n))=O(n^{2})

 

for(int i=1;i<=n;i++){
    for(int j=1;j<=n;j=pow(2,j)){
        sum = sum + j;
    }
}

两个循环体是嵌套的,采用乘法规则:

时间复杂度为:T(n)=T1(n)*T2(n)=O(nlogn)


空间复杂度

空间复杂度S(n)指算法运行过程中所有的使用辅助空间的大小。

记为:Sn=O(f(n))

  • 辅助空间:除了存储算法本身的指令、常数、变量和输出数据伊娃,还需要存储对数据操作的存储单元。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值