这样用大写O()来体现算法时间复杂度的记法,我们称之为大O记法。一般情况下,随着n的增大,T(n)增长最慢的算法为最优算法。
举例,如果一个算法对于任何大小为n的输入,它至多需要5n3+3n的时间运行完毕,那么它的渐近时间复杂度是O(n3) 。
注意:
时间复杂度计算过程中,是最终会去掉这个函数的低阶项和首项系数的。(这也就是为什么5n3+3n 会最终化简为n3)
举例:
一:O(1) 常数阶
Temp=i;i=j;j=temp;
以上三条单个语句的频度均为1,该程序段的执行时间是一个与问题规模n无关的常数。算法的时间复杂度为常数阶,记作T(n)=O(1)。如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。
二: O(n) 线性阶
通常,如果某个循环结构以线性方式运行n次,并且循环体的时间复杂度都是O(1),那么该循环的复杂度就是O(n).
for(int i = 0; i < n; i++){ //一些列复杂度为O(1)的步骤.... }
即使,该循环跳过某些常数部分,只要跳过的部分是线性的,那么该循环体的时间复杂度仍就是O(n).
比如
int count = 1; while(count < n){ count += 2; //一些列复杂度为O(1)的步骤.... }
时间复杂度还是O(n)
三:O( log2n) 对数级
int count = 1; while(count < n){ count *= 2; //一些列复杂度为O(1)的步骤.... }
该循环2^f(n)<=n; f(n)<=log2n 取最大值f(n)= log2n, T(n)=O(log2n)
四:循环嵌套复杂度分析
for(int count1 = 0; count1 < n; count1++){ for(int count2 = 0; count2 < n; count2++){ //一些列复杂度为O(1)的步骤.... } }
在这种情况下应该 先计算内层循环的时间复杂度,然后用内层的复杂度乘以外层循环的次数。 最内层循环体的时间复杂度都是O(1)所以循环n次也就是O(n) 在乘以最外层for的n次。所以得出结论 2层嵌套循环的时间复杂度 = O(1) * n*n = O(n2)
算法优化:
计算1 + 2 + 3 + 4 + ...... + n =? ,通过程序实现,并标出算法的时间复杂度。
Java解法一:
public int method01(int n){ int sum = 0; for(int i=1;i<=n;i++){ sum += i; } return sum; }
时间复杂度: O(n)
德国数学家高斯曾经在他约9岁的时候就提过自己的解法:
SUM = 1 + 2 + 3 + 4 + ...... + 100
SUM = 100 + 99 + 98 + 97 + ...... + 1
SUM + SUM = 2*SUM = 101 + 101 + 101 + .... + 101 //正好 100 个 101
SUM = (100*101)/2 = 5050
Java解法二:
public int method02(int n){ int sum = 0; sum = (n*(n-1))/2; return sum; }
时间复杂度: O(1)
从时间复杂度上来年,解法二比解法一更高效
常见的算法时间复杂度由小到大依次为:
Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<{Ο(2n)<Ο(n!)<O(nn)}
最后三项用大括号把他们括起来是想要告诉大家,如果日后大家设计的算法推导出的“大O阶”是大括号中的这几位,那么趁早放弃这个算法,在去研究新的算法出 来吧。因为大括号中的这几位即便是在 n 的规模比较小的情况下仍然要耗费大量的时间,算法的时间复杂度大的离谱,基本上就是“不可用状态”。
参考资料:
http://www.cnblogs.com/sakorn/archive/2007/05/18/751661.html
http://www.douban.com/note/91775206/
http://blog.csdn.net/xingqisan/article/details/3206303
http://www.cnblogs.com/yanng/articles/2178710.html
相关推荐
算法的评价参数之一是时间复杂度,即算法的执行时间关于输入规模的函数。 时间复杂度是衡量算法效率的重要指标。它是指算法执行时间关于输入规模的函数。时间复杂度可以分为两种:最坏情况下的时间复杂度和平均情况...
试完成求有向图的强连同分量的算法,并分析算法的时间复杂度
### 算法的时间复杂度与空间复杂度详解 #### 一、算法复杂度概述 在计算机科学领域,算法的时间复杂度与空间复杂度是衡量一个算法效率的重要指标。时间复杂度关注的是算法执行时间的增长速率,而空间复杂度则侧重...
在计算机科学与信息学竞赛中,算法的时间复杂度分析是一个核心知识点,它直接关系到算法的效率以及解决问题的可行性。本文将对这些关键概念进行深入探讨,并提供一些实例来加深理解。 首先,算法的时间复杂度是衡量...
在《算法的时间复杂度分析》这篇文章中,作者程世辉等人详细探讨了算法时间复杂度的相关概念及计算方法。 #### 二、算法分析的基本理论 ##### 2.1 评价算法好坏的标准 对于同一问题的不同算法,评价其优劣的标准...
应用马尔科夫链模型证明了遗传禁忌搜索算法是以概率1收敛到全局最优解的,并应用求解随机算法时间复杂度的方法,即求解算法的期望收敛时间,估算了该算法的时间复杂度,结果证明该算法的时间复杂度与所得解的多样性、...
### 快速排序改进算法:时间复杂度的深入解析 #### 快速排序的基本概念与问题 快速排序,由C.A.R.Hoare于1962年提出,是一种高效的排序算法,基于分治策略。它通过选择一个“基准”元素,将数据集分割成两个子集,...
数据结构的基本概念和术语,算法的时间复杂度,讲述了数据结构的一些概念点,也就是最基本的一些东西,还有如何计算算法的时间复杂度之类的一些问题及举例
算法的时间复杂度和空间复杂度 算法的时间复杂度和空间复杂度是衡量算法性能的两个重要指标。时间复杂度是指执行算法所需要的计算工作量,而空间复杂度则是指执行这个算法所需要的内存空间。 稳定排序和非稳定排序...
根据给定文件的信息,我们可以详细地探讨“算法时间复杂度”的相关知识点。时间复杂度是衡量算法运行时间随输入规模增长而变化的函数,它在计算机科学与编程领域扮演着至关重要的角色。接下来,我们将围绕以下几个...
算法时间复杂度的计算 算法时间复杂度的计算是计算机科学中一个非常重要的概念,它描述了算法执行时间随着输入规模的变化而增长的速度。时间复杂度通常用大 O 记法表示,即 O(f(n)),其中 f(n) 是问题规模 n 的函数...
### 算法的时间复杂度分析 #### 一、算法分析的基本理论 ##### 1.1 评价算法好坏的标准 在计算机科学中,算法是指解决问题的一系列步骤或指令集。评估算法的好坏不仅要看它是否能正确解决问题,还需要考虑算法的...
本题集主要涉及了NOIP(全国青少年信息学奥林匹克竞赛)普及组和提高组的CSP-J(Junior)和CSP-S(Senior)初赛中的算法时间复杂度题目,涵盖了不同类型的算法和时间复杂度分析。 1. **稳定性**: - 在排序算法中...
关于递归算法时间复杂度分析的探讨,是一个深入理解算法效率和优化的关键议题。递归,作为解决问题的一种强大工具,其本质是将复杂问题分解为更简单的子问题,通过求解这些子问题来达到最终解决方案的目的。然而,...
在递归算法时间复杂度的分析中,我们可以将递归算法中的每个递归调用看作一个序列中的一个项,这个序列可以是函数调用次数的序列。每一项与前一项之间可能存在一个递推关系,这个关系可以用生成函数来表达。通过分析...
因此,作为程序员,掌握基本的算法时间复杂度分析方法是非常必要的。 在分析算法的时间复杂度时,需要考虑多个因素,包括算法采用的策略、方法、编译产生的代码质量、问题的输入规模以及机器执行指令的速度。这些...
算法复杂度分析是评估算法效率的重要工具,主要涉及时间复杂度和空间复杂度两个方面。这门基础课程旨在教授如何分析算法在处理大规模数据时所需的资源,帮助开发者优化程序性能。 一、算法复杂度的概念 1. 时间...
本资源包含的“算法实验代码和报告”聚焦于几个重要的算法概念:时间复杂度、0-1背包问题、分治策略以及贪心方法,这些都是计算机科学中基础且实用的知识点。 首先,我们来看**时间复杂度**。时间复杂度是用来衡量...
各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概执行时间。试通过随机的数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。
根据提供的标题“【课件】1.2_2_算法的时间复杂度.pdf”及描述“【课件】1.2_2_算法的时间复杂度”,我们可以推断出这份课件主要讲解了算法时间复杂度的相关知识。下面将详细介绍与算法时间复杂度相关的几个关键知识...