前言
在了解了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)
以上就是本篇的全部内容。