第六课 算法效率的度量

本文探讨了算法的时间和空间复杂度,介绍了大O表示法作为衡量标准的重要性,并通过实例展示了如何通过空间换时间策略优化算法效率。

本文学习自 狄泰软件学院 唐佐林老师的 数据结构课程


我们用算法的时间复杂度来表示算法的效率,算法的时间复杂度使用大O表示法来描述,大O表示法的工程意义可以将大O表示法作为一个算法实现或者选择的标准例如要求某个算法是时间复杂度不能超过O(n*n)

在这里插入图片描述

当算法的时间复杂度为O(n!)、O(2(n))、O(n(n))是,即使n很小,实际的程序运行时间也会是不可接受的。O(nnn)是分水岭,最差的算法时间复杂度是立方阶

算法的空间复杂(space Complexity)

  • 定义 S(n) = S(f(n))
  • n是算法的问题规模,即这个算法处理的数据元素的个数
  • f(n)是空间使用函数,与n相关,即需要的内存空间
  • 推导时间复杂度的方法同样适用于空间复杂度,如当算法需要的空间是常数时,空间复杂度为S(1)

空间与实践的策略

  • 多数情况下,算法的时间复杂的更令人关注
  • 如果有必要,可以通过增加额外空间降低时间复杂度
  • 同理,也可以通过增加算法的耗时降低空间复杂度

在这里插入图片描述

空间换时间例子

-问题:在一个有自然数 1-1000 中的某些数组所组成的数组中,每个数字可能出现0次或多次,设计一个算法,找出出现次数最多的数字

#include <iostream>

using namespace std;

void search(int a[], int len)     // O(n)
{
    int sp[1000] = {0};//重要的初始化
    int max = 0;
    
    for(int i=0; i<len; i++)
    {
        sp[a[i] - 1]++;
    }
    
    for(int i=0; i<1000; i++)
    {
        if( max < sp[i] )
        {
            max = sp[i];
        }
    }
    
    for(int i=0; i<1000; i++)
    {
        if( max == sp[i] )
        {
            cout << i + 1 << endl;
        }
    }
}

int main(int argc, char* argv[])
{
    int a[] = {1, 1, 3, 4, 5, 6, 6, 6, 3, 3};
    
    search(a, sizeof(a)/sizeof(*a));

    return 0;
}

经典问题:当两个算法的大O表示法相同时,是否意味着两个算法的效率完全相同?
答;如果两个算法的大O表示法相同,只能够说明两个算法的效率是同一个级别的,不能够说明的这两个算法的效率完全相同

小结

  • 一般而言,工程中使用的算法,时间复杂度不超过O(n * n * n)
  • 算法分析与设计时,重点考虑最坏情况下的时间复杂度
  • 数据结构课程中重点关注算法的时间复杂度
  • 大O表示法同样适用于算法的空间复杂度
  • 空间换时间是工程开发中常用的策略
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值