第二十七章:时间复杂度与优化

本文通过小灰与大黄的故事引出衡量代码好坏的两个关键指标:运行时间和占用空间。接着,文章介绍了如何计算基本操作执行次数,并通过四个场景深入浅出地解释了时间复杂度的概念,包括常量、对数、线性、平方等不同时间复杂度的案例。文章强调了渐进时间复杂度的重要性,并通过例子展示了不同时间复杂度在程序执行效率上的巨大差异。最后,文章探讨了时间复杂度优化的重要性,并给出了一些例题和练习,旨在帮助读者理解和提高代码性能。
摘要由CSDN通过智能技术生成

 阅读本文前,请确保已经学会C++的基本知识,包括:三大结构(顺序、分支、循环)、数组、字符串等相关知识。
部分题目可能要求掌握相应的基础算法。

一、小灰与大黄的故事

二、怎么衡量代码的好坏

让我们来想象一个场景:某一天,小灰和大黄同时加入了一个公司......

一天过后,小灰和大黄各自交付了代码,两端代码实现的功能都差不多。大黄的代码运行一次要花0.1秒,内存占用5MB。小灰的代码运行一次要花100秒,内存占用500MB。于是......

由此可见, 衡量代码的好坏,包括两个非常重要的指标 :

1.运行时间;

2.占用空间。

三、基本操作执行次数

关于代码的运行时间,我们一般用程序的基本操作执行次数来计算,我们用四个生活中的场景,来做一下比喻:

场景1:

给小灰一条长10寸的面包,小灰每3天吃掉1寸,那么吃掉整个面包需要几天?

答案自然是 3 × 10 = 303×10=30 天。

如果面包的长度是 NN 寸呢?

此时吃掉整个面包,需要 3 × n = 3n3×n=3n 天。

如果用一个 数学函数 来表达这个相对时间,可以记作 T(n)=3nT(n)=3n 。

我们如果用C++程序来实现这个问题,那么代码如下:

int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++)
    {
        cout << "第一天,等待" << endl;
        cout << "第二天,等待" << endl;
        cout << "第三天,吃掉一寸面包" << endl;
    }
}

Copy

场景2:

给小灰一条长16寸的面包,小灰每5天吃掉面包剩余长度的一半,第一次吃掉8寸,第二次吃掉4寸,第三次吃掉2寸......那么小灰把面包吃得只剩下1寸,需要多少天呢?

这个问题翻译一下,就是数字16不断地除以2,除几次以后的结果等于1?这里要涉及到数学当中的 对数 ,以2为底,16的对数,可以简写为 log_216log2​16 ,这个式子算的结果就是4了。我们在计算机中一般简记为 log16log16 。

因此,把面包吃得只剩下1寸,需要 5 × log16 = 5 × 4 = 205×log16=5×4=20 天。

如果面包的长度是 NN 寸呢?

需要 5 × logn = 5logn5×logn=5logn 天,记作 T(n)= 5lognT(n)=5logn 。

代码如下:

int main()
{
    int n;
    cin >> n;
    for(int i = 1; i < n; i = i * 2)
    {
        cout << "第一天,等待" << endl;
        cout << "第二天,等待" << endl;
        cout << "第三天,等待" << endl;
        cout << "第四天,等待" << endl;
        cout << "第五天,
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值