算法和复杂度

目录

1.算法和复杂度

1)什么是算法

2)复杂度

2.时间复杂度

 大O渐进表示法

常数阶O(1)

线性阶O(N)

平方阶O(N^2)

对数阶O(logN) 

递归情况

常见复杂度对比

3.空间复杂度

O(1)

O(N)


1.算法和复杂度

1)什么是算法

    算法(Algorithm)是指用来操作数据、解决程序问题的一组方法。同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。

2)复杂度

  衡量不同算法的优劣,主要从时间复杂度空间复杂度来考虑。

2.时间复杂度

  算法的时间复杂度是一个函数式T(N),计算的是大概执行次数,通常用大O渐进法表示

 大O渐进表示法

  在大O符号表示法中,时间复杂度的公式是: T(n) = O( f(n) )其中f(n) 表示每行代码执行次数之和,而 O 表示正比例关系,这个公式的全称是:算法的渐进时间复杂度。

  注:大O在实际中关注的是任意输入规模的最大运行次数,即最坏情况,也称为上界

规则:

  1. T(N)中只保留最高阶项,低次项对函数式影响较小可以省略
  2. 如果最高项存在且不是1,则去除常系数
  3. T(N)中无N相关项,只有常数项,用1取代所有常数

常数阶O(1)

void Fun(int N)
{
  int count=0;
  for(int k=0;k<100;k++)
   {
       ++count;
   }

}

   从这段代码来看,T(N)=100,所以时间复杂度O(1)

线性阶O(N)

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

    时间复杂度O(n)

平方阶O(N^2)

for(int i=0;i<N;i++)
{
    for(int j=0;j<N;j++)
      {
          printf("%d",arr[i][j]);
      }
}

时间复杂度O(N^2)

对数阶O(logN) 

void Fun(int n)
{
  int cnt=1;
   while(cnt<n)
    {
      cnt*2=n;
    }

}

一般情况下底数忽略:O(logN)


递归情况

//计算递归阶乘复杂度
long long Fac(size_t N)
{
     if(N==0)
        return 1;
     return Fac(N-1)*N;

}

 

   因为递归过程不断进行函数的自身引用,执行次数应相加,总空间复杂度=单次递归时间复杂度*递归次数

   所以时间复杂度=O(N)

常见复杂度对比

O(1)<O(logN)<O(N)<O(N*logN)<O(N^2)<O(N^3)

  复杂度升序,执行速度也越来越慢

3.空间复杂度

  使用大O法,计算额外临时开辟的空间大小

O(1)

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

  代码中的 i 所分配的空间都不随着处理数据量变化,因此它的空间复杂度 S(n) = O(1)

O(N)

举例:递归引用

    递归程序中,不断创建空间进行程序递归引用计算,所以空间复杂度为O(N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值