数据结构之时间复杂度

文章介绍了时间复杂度的概念,用于衡量代码执行效率。通过示例详细解释了如何计算时间复杂度,包括冒泡排序的时间复杂度O(n^2),二分查找的时间复杂度O(log(2)n),以及斐波那契算法的时间复杂度O(2^n)。强调了理解时间复杂度对于编写高效代码的重要性。

目录

1、什么是时间复杂度:

2、怎么计算时间复杂度

        接下来看看经典的冒泡排序:

        那我现在提出一个问题,二分查找的时间复杂度

        还有一个类似的斐波那契算法


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的增大,这个算法的执行次数会爆炸式的增长,所以斐波那契算法很拉,没有实际价值。

以上就是时间复杂度的概念和计算方法了,希望大家都能够写出低时间复杂度的代码。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值