程序复杂度通常分为时间复杂度和空间复杂度两个维度。
时间复杂度
定义:时间复杂度是指程序执行所需时间随输入规模增长的变化趋势,通常用大O表示法(O(f(n))表示)。
计算方法:
基本操作法:选取算法中最基本、最频繁执行的语句,统计其执行次数作为时间复杂度的度量。例如,一个简单的for循环执行n次,则时间复杂度为O(n)。
大O表示法:忽略常数因子和低阶项,只保留最高阶项。例如,O(3n^2 + 10n + 10)简化为O(n^2)。
常见时间复杂度:
O(1):常数时间复杂度,无论输入规模如何,执行时间都是固定的。
O(logn):对数时间复杂度,执行时间与输入规模的对数成正比。
O(n):线性时间复杂度,执行时间与输入规模成正比。
O(nlogn):线性对数时间复杂度,执行时间与输入规模的对数乘以线性成正比。
O(n^2):平方时间复杂度,执行时间与输入规模的平方成正比。
O(n^3):立方时间复杂度,执行时间与输入规模的立方成正比。
O(2^n):指数时间复杂度,执行时间与输入规模的指数成正比。
O(n!):阶乘时间复杂度,执行时间与输入规模的阶乘成正比。
空间复杂度
定义:空间复杂度是指程序执行过程中所需内存空间随输入规模增长的变化趋势,通常也用大O表示法表示。
计算方法:
变量空间:统计程序中使用的变量总数。
数据结构空间:统计程序中使用的数据结构(如数组、链表、树等)所占用的空间。
递归栈空间:对于递归算法,统计递归调用栈的深度。
常见空间复杂度:
O(1):常数空间复杂度,无论输入规模如何,所需内存空间都是固定的。
O(logn):对数空间复杂度,所需内存空间与输入规模的对数成正比。
O(n):线性空间复杂度,所需内存空间与输入规模成正比。
O(n^2):平方空间复杂度,所需内存空间与输入规模的平方成正比。
O(n^3):立方空间复杂度,所需内存空间与输入规模的立方成正比。
示例
假设有一个简单的for循环:
```python
for i in range(n):
执行一些操作
```
这个循环的时间复杂度是O(n),因为它会执行n次循环体中的操作。
再假设有一个递归函数:
```python
def factorial(n):
if n == 0:
return 1
else:
return n * factorial(n-1)
```
这个递归函数的时间复杂度是O(n),因为每次递归调用都会减少n的值,直到n为0为止,总共需要n次调用。
通过这些方法,可以对不同算法的复杂度进行度量和分析,从而选择更高效的算法。