目录
1、什么是时间复杂度:
时间复杂度是我们用来描述一段代码的时间效率的一个指标。通常使用大O的渐进表示法,用O(),()里面写关于参数的相关性代数式来描述代码的运行效率。
2、怎么计算时间复杂度
时间复杂度的计算是时间复杂度的难点,我们下面通过举例来进行分析:
void Func1(int N)
{
int count = 0;
for (int k = 0; k < 2 * N ; ++k)
{
++count;
}
int M = 10;
while (M--)
{
++count;
}
printf("%d\n", count);
}
这段代码我们可以分成两部分来分析,上面的for循环和下面的while循环,时间复杂度是反应的和参数的相关性,for循环进行了2*N次,相关性就是N,下面的while循环进行了M=10次,相关性为0,所以这段代码的时间复杂度就是O(N)。
实际上我们的参数也可以不止一个,举个例子:
void Func2(int N, int M)
{
int count = 0;
for (int k = 0; k < M; ++k)
{
++count;
}
for (int k = 0; k < N ; ++k)
{
++count;
}
printf("%d\n", count);
}
这段代码中的参数就有N和M,两个for循环分别执行M和N次,对于M和N来说相关性就是M和N,所以这段代码的时间复杂度就是O(M+N)。
接下来看看经典的冒泡排序:
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[i]);
exchange = 1;
}
}
if (exchange == 0)
break;
}
}
这里嵌套了两层for循环,那我们就来看看这两层循环,第一层循环了n次,第二层在每次循环过程中循环了n-1次,所以代码执行次数就是从1累加到(n-1),所以最后得到的相关性就是n^2,所以代码的实际复杂度就是O(n^2)。
那我现在提出一个问题,二分查找的时间复杂度
这里不写代码了,也没必要写,我们这里的参数是数组长度,每进行一次二分查找数组就分成一半,所以每一次数组长度都 /2,那一共进行的次数就是以2为底数组长度的对数,所以这里的参数相关性就是这个以2为底数组长度的对数,二分查找的时间复杂度就是O(log(2)n)。
还有一个类似的斐波那契算法
简单描述一下斐波那契数列,0 1 1 2 3 5 8 13,后面的一个数是前面两个数的和。要计算第n个斐波那契数就要调用第n-1和n-2个斐波那契数,每一次调用都会调用前面两个数,也就是调用内容翻倍,因为要计算第n个数,所以参数相关性就是2^n,时间复杂度是O(2^n),根据指数爆炸的理论,这个随着n的增大,这个算法的执行次数会爆炸式的增长,所以斐波那契算法很拉,没有实际价值。
以上就是时间复杂度的概念和计算方法了,希望大家都能够写出低时间复杂度的代码。
文章介绍了时间复杂度的概念,用于衡量代码执行效率。通过示例详细解释了如何计算时间复杂度,包括冒泡排序的时间复杂度O(n^2),二分查找的时间复杂度O(log(2)n),以及斐波那契算法的时间复杂度O(2^n)。强调了理解时间复杂度对于编写高效代码的重要性。

被折叠的 条评论
为什么被折叠?



