时间空间复杂度

xiaoxiao2021-07-27  224

算法效率分为两种:一种是时间效率,另一种是空间效率。时间效率被称为时间复杂度,而空间效率被称作空间复杂度。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间。

时间复杂度的定义:

在计算机科学中,算法的时间复杂度是一个函数,它定量描述了该算法的运行时间。个算法所花费的时间与其中语句的执行次数成正比例,算法中的基本操作的执行次数,为算法的时间复杂度。

举个例子

void Fun1(int N) { int count = 0; for (int i = 0; i < N; ++i) { for (int j = 0; j < N; ++j) { ++count; } } for (int k = 0; k < 2 * N; ++k) { ++count; } int m = 10; while (m--) { ++count; } printf("%d\n", count); }

在这段代码中Fun1执行的操作次数为:F(N)=N^2+2*N+10

N=10 F(N)=130 N=100 F(N)=10210 N=1000 F(N)=1002010

在实际计算时间复杂度时,我们并不需要精确计算执行次数,于是我们采用大O渐进表示法。

大O符号:是用于描述函数渐进行为的数学符号。

推导大O阶方法:

用常数1取代运行时间中的所有加法常数在执行次数函数中,只保留最高阶项如果最高阶存在且不为1,则去除与这个项目相乘的常数

用大O渐进表示法表示Fun1的时间复杂度为:O(N^2)

算法的时间复杂度存在最好,平均,和最坏的情况: 最坏情况:任意输入规模的最大运行次数。(上界) 平均情况:任意输入规模的期望运行次数。 最好情况:任意输入的最小规模运行次数。(下界)

而一般情况下算法关注的都是最坏情况。

举例

void BubbleSort(int * a, int n) { assert(a); for (size_t end = n; end > 0; --end) { int exchange = 0; for (size_t i = 1; i < end; ++i) { if (a[i - 1]>a[i]) { Swap(&a[i - 1], &a[1]); exchange = 1; } } if (exchange == 0) { break; } } }

该冒泡排序的时间复杂度为:O(N^2)

int BinarySearch(int* a, int n, int x) { assert(a); int begin = 0; int end = 0; while (begin < end) { int mid = begin + ((end - begin) >> 1); if (a[mid] < x) { begin = mid + 1; } else if (a[mid]>x) { end = mid; } else { return mid; } } return -1; }

该算法的时间复杂度为:O(logN) logN是以2为敌底N的对数,有时候也写作lgN。

空间复杂度的定义

空间复杂度是对一个算法在运行过程中临时占用存储空间的度量。空间复杂度算的是变量的个数,空间复杂度的计算规则和时间复杂度基本类似,也用了大O渐进表示法。

void BubbleSort(int * a, int n) { assert(a); for (size_t end = n; end > 0; --end) { int exchange = 0; for (size_t i = 1; i < end; ++i) { if (a[i - 1]>a[i]) { Swap(&a[i - 1], &a[1]); exchange = 1; } } if (exchange == 0) { break; } } }

冒泡排序法中使用了常数个额外空间,所以空间复杂度为:O(1)

long long* Fibonacci(size_t n) { if (n == 1) { return NULL; } long long* fibArray = new long long[n + 1]; fibArray[0] = 0; fibArray[1] = 1; for (int i = 2; i <= n; ++i) { fibArray[i] = FibArray[i - 1] + finArray[i - 2]; } return fibArray; }

计算菲波那切数列开辟了N个空间,所以空间复杂度为:O(N)

转载请注明原文地址: https://www.6miu.com/read-4823449.html

最新回复(0)