时间复杂度(小总结)

时间复杂度定义:

如果一个问题的规模是n,解这一问题的某一算法所需要的时间为T(n),它是n的某一函数 T(n)称为这一算法的“时间复杂性”。
当输入量n逐渐加大时,时间复杂性的极限情形称为算法的“渐近时间复杂性”。

计算方法:

1. 找到执行次数最多的语句
2. 计算语句执行次数的数量级
3. 用大O来表示结果


O(1)
交换i和j的内容
temp=i;
i=j;
j=temp;                    

以上三条单个语句的频度为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

O(n2)
    sum=0;                /* 执行次数1 */
    for(i=1;i<=n;i++)      
       for(j=1;j<=n;j++)
         sum++;       /* 执行次数n2 */
解:T(n) = 1 + n2 = O(n2)

   for (i=1;i<n;i++)
   {
       y=y+1;        ①   
       for (j=0;j<=(2*n);j++)    
          x++;        ②      
   }         
解:  语句1的频度是n-1
         语句2的频度是(n-1)*(2n+1) = 2n2-n-1
         T(n) = 2n2-n-1+(n-1) = 2n2-2
         f(n) = n2
         lim(T(n)/f(n)) = 2 + 2*(1/n2) = 2
         T(n) = O(n2).


例子:
O(n)                                         
   a=0;
   b=1;                     ①
   for (i=1;i<=n;i++) ②
   {  
      s=a+b;    ③
      b=a;     ④  
      a=s;     ⑤
   }
解:  语句1的频度:2,        
         语句2的频度:n,        
         语句3的频度:n,        
         语句4的频度:n,    
         语句5的频度:n,                                  
         T(n) = 2+4n
         f(n) = n
         lim(T(n)/f(n)) = 2*(1/n) + 4 = 4
         T(n) = O(n).     
                                                                            
O(log2n)
   i=1;       ①
   while (i<=n)
      i=i*2; ②
解: 语句1的频度是1, 
       设语句2的频度是t,  则:nt<=n;  t<=log2n
       考虑最坏情况,取最大值t=log2n,
        T(n) = 1 + log2n
        f(n) = log2n
        lim(T(n)/f(n)) = 1/log2n + 1 = 1
        T(n) = O(log2n)

 O(n3)
   for(i=0;i<n;i++)
   { 
      for(j=0;j<i;j++) 
      {
         for(k=0;k<j;k++)
            x=x+2; 
      }
   }
解:当i=m, j=k的时候,内层循环的次数为k当i=m时, j 可以取 0,1,...,m-1 ,  所以这里最内循环共进行了0+1+...+m-1=(m-1)m/2次所以,i从0取到n, 则循环共进行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/2次
T(n) = n(n+1)(n-1)/2 = (n3-n)/2
f(n) = n3
所以时间复杂度为O(n3)。

最后总是把最大的,成长最快的时间复杂度作为代表时间复杂度的最终结果。

例如 理论计算复杂度应该为O(n^3+n^2+n^1)最后结果为O(n^3).


<think>好的,我现在需要帮助用户查找关于蓝桥杯竞赛中时间复杂度相关的总结或复习资料。首先,我需要回想用户提供的引用内容,看看里面有没有相关的信息。 用户提供了三个引用,其中引用[1]和引用[2]都提到了时间复杂度的分析。引用[1]明确指出蓝桥杯基础算法中时间复杂度的分析是关键,并且提到了需要结合理论与实践。引用[2]用户提到自己在准备蓝桥杯时开始关注程序的运行时间和性能,意识到不能仅仅满足于代码能跑,还要优化时间复杂度。引用[3]则列出了蓝桥杯的常考知识点,包括排序、搜索、动态规划等,这些都需要时间复杂度分析。 接下来,我需要将这些信息整理成用户需要的总结或复习资料。首先应该解释时间复杂度的基本概念,比如大O表示法,常见的时间复杂度类别,如O(1)、O(logn)、O(n)、O(nlogn)、O()等。然后结合蓝桥杯的考点,比如排序算法(快速排序、归并排序)、搜索算法(BFS、DFS)、动态规划等,分别说明它们的时间复杂度。 还要注意用户提到的引用中提到的关键点,比如引用[1]强调理论与实践结合,引用[3]提到的常考知识点中的排序、BFS/DFS、动态规划等。因此,在总结中需要将这些算法的时间复杂度详细说明,并给出例子,比如快速排序的平均时间复杂度是O(nlogn),最坏情况是O(),以及如何优化以避免最坏情况。 此外,用户可能需要一些备考建议,比如如何分析题目中的时间复杂度要求,如何选择合适算法,以及如何通过练习题目来巩固这些知识。引用[3]中提到的推荐题目,比如排列字母、纸张尺寸、平方和、成绩统计等,可能需要结合这些题目的分析来说明时间复杂度的应用。 最后,生成相关问题,帮助用户进一步思考。比如如何优化算法的时间复杂度,不同算法在特定场景下的复杂度比较等。 需要确保回答结构清晰,分点说明,并正确引用提供的资料。同时,使用中文回答,数学公式用$...$格式,独立公式用$$...$$。检查是否有遗漏的考点或用户可能关心的其他方面,比如空间复杂度,但用户主要问的是时间复杂度,所以重点放在时间上。</think>### 蓝桥杯竞赛中时间复杂度相关总结与复习资料 #### 1. **时间复杂度基础** - **定义**:时间复杂度描述算法执行时间与输入规模的关系,用大O符号表示。例如: - $O(1)$:常数复杂度(如数组随机访问)。 - $O(n)$:线性复杂度(如遍历数组)。 - $O(n^2)$:平方复杂度(如冒泡排序)。 - $O(n \log n)$:快速排序、归并排序的平均时间复杂度。 - $O(2^n)$:指数复杂度(如暴力穷举)[^1][^2]。 - **分析方法**: - 关注循环嵌套层数。 - 忽略低阶项和常数系数。 - 考虑最坏情况(如快速排序的最坏时间复杂度为$O(n^2)$)。 #### 2. **蓝桥杯高频考点的时间复杂度** - **排序算法**: - 快速排序:平均$O(n \log n)$,最坏$O(n^2)$(需优化基准选择)。 - 归并排序:稳定$O(n \log n)$,但空间复杂度$O(n)$。 - **搜索算法**: - BFS/DFS:时间复杂度通常为$O(n + m)$,其中$n$为节点数,$m$为边数。 - 二分查找:$O(\log n)$,需有序数组[^3]。 - **动态规划(DP)**: - 线性DP(如斐波那契数列):$O(n)$。 - 状态压缩DP(如旅行商问题):$O(n \cdot 2^n)$。 #### 3. **实践建议** - **题目关联**: - 例如蓝桥杯真题“平方和”需优化循环次数,避免$O(n)$暴力计算。 - “排列字母”可通过计数排序($O(n)$)实现,而非$O(n \log n)$的标准排序[^3]。 - **优化技巧**: - 减少冗余计算(如记忆化搜索)。 - 利用数学规律(如前缀和、快速幂)。 - 选择合适数据结构(如哈希表$O(1)$查询替代线性查找$O(n)$)。 #### 4. **推荐复习资料** - **官方文档**:蓝桥杯竞赛环境中的API帮助文档(如C++组的STL容器操作复杂度)。 - **刷题列表**: - 基础题:成绩统计(考察输入输出效率)、纸张尺寸(递归或迭代实现的时间差异)。 - 进阶题:排列字母(计数排序优化)、BFS迷宫最短路径。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值