时间复杂度与空间复杂度

 前言

        在了解了c/c++语言后,就开始了数据结构的学习。而学习数据结构的第一部就是去了解时间复杂度与空间复杂度。本文就浅谈一下两者相关的知识。

算法效率:

        一般的,我们把算法效率分为时间效率与空间效率。

        时间效率:

                指的是算法的执行速度或所需时间。时间效率高的算法能够在较短的时间内完成任务,或者在给定的时间内处理更多的数据。

                空间效率:

                指的是算法所需的存储空间或内存大小。空间效率高的算法需要较少的存储空间,因此在处理大量数据时可以减少对系统资源的需求。

复杂度:        

时间复杂度:

                时间复杂度是用来描述程序运行时间长短的指标,它通常与算法中的基本操作次数有关。一个算法执行所耗费的时间,从理论上说,是不能准确算出来的,只有把程序放在机器上运行起来,才能知道。但是,我们通常使用时间复杂度来评估算法的执行效率。

        时间复杂度可以用来比较不同算法的优劣。一般来说,时间复杂度越低的算法效率越高,因为它在执行过程中需要执行的操作次数较少。在选择算法时,我们通常会选择时间复杂度较低的算法,以提高程序的执行速度。

大O的线性表示法:

        一般的,我们用大O的线性表示法来表示代码的复杂度。

         接下来,我用兔子数列的代码为你演示如何计算时间复杂度。

#include <iostream>  
using namespace std;  
  
int fibonacci(int n) {  
    int a[n+1];  
    a[0] = 1;  
    a[1] = 1;  
    for (int i = 2; i <= n; i++) {  
        a[i] = a[i-1] + a[i-2];  
    }  
    return a[n];  
}  
  
int main() {  
    int n = 10; // 输出前10个兔子数列数  
    cout << fibonacci(n) << endl;  
    return 0;  
}

         此处代码的时间复杂度为O(n),应为在函数fibinacii中,循环函数for调用一次。故,时间复杂度为O(n).

        我们对大O的线性表示法的用法有以下规定:

推导大O阶方法:
1、用常数1取代运行时间中的所有加法常数。
2、在修改后的运行次数函数中,只保留最高阶项。
3、如果最高阶项存在且不是1,则去除与这个项目相乘的常数。得到的结果就是大O阶。

空间复杂度: 

        是算法在运行过程中使用的额外空间大小的度量。在计算机科学中,空间复杂度是一种评估算法效率的重要指标,它可以帮助我们了解算法所需的存储空间随输入规模增长的情况。

        空间复杂度通常通过算法执行过程中所使用的额外空间来计算。这包括算法在运行过程中创建的任何临时变量、数组或数据结构所需的空间。在分析空间复杂度时,我们通常关注算法在最坏情况下的空间使用情况,因为这提供了算法在最不利情况下的性能保证。

        空间复杂度的评估对于优化算法和数据结构的选取非常重要。在处理大规模数据时,我们通常希望选择空间复杂度较低的算法,以减少额外的存储需求并提高程序的运行效率。

接下来,依旧是用兔子数列去演示,但方法为函数递归:

#include <iostream>  
using namespace std;  
  
int fibonacci(int n) {  
    if (n == 0 || n == 1) {  
        return 1;  
    } else {  
        return fibonacci(n - 1) + fibonacci(n - 2);  
    }  
}  
  
int main() {  
    int n = 10; // 输出前10个兔子数列数  
    for (int i = 0; i < n; i++) {  
        cout << fibonacci(i) << " ";  
    }  
    cout << endl;  
    return 0;  
}

        在函数递归中,因为在不断递归,所开辟的栈也随之增加。因此,函数的空间复杂度为O(n),二时间复杂度为O(1)。

        空间复杂度一般只有两种情况:
        创建了常数个变量:O(1)
        创建了N个变量:O(N)

以上就是本篇的全部内容。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值