推导O()的方法:
- 运行次数函数的加法常数用1取代
- 运行次数函数中,只保留最高阶项
- 把最高阶项的系数改为1
一、时间复杂度
时间复杂度主要是衡量一个算法的运行速度,定量描述该算法的运行时间。算法的基本操作执行次数就是该算法的时间复杂度。符号O的渐进表示法:O()
例:递归计算斐波那契:
long my_fibonacci(size_t n)
{
return n < 2 ? n : fibonacci(n - 1) + fibonacci(n - 2);
}
时间复杂度为O(2^n)。递归形式,效率低。
有些算法的时间复杂度存在最好、最坏、平均情况:
- 最好情况:任意输入规模的最小运行次数
- 最坏情况:任意输入规模的最大运行次数
- 平均情况:任意输入规模的期望运行次数
二、空间复杂度
空间复杂度主要是衡量一个算法所需要的额外空间,不是字节数,是变量的个数。符号O的渐进表示法:O()
二分查找(折半查找):
int BinarySearch(int arr[], int k, int left, int right)
{
assert(arr);
while (left <= right)
{
int mid = left + (right - left) / 2; // 防止数据越界
if (arr[mid] > k)
{
right = mid - 1;
}
else if (arr[mid] < k)
{
left = mid + 1;
}
else
{
return mid;
}
}
return - 1;
}
代码分析: