时间复杂度
来源:互联网 发布:awr sql statistics 编辑:程序博客网 时间:2024/06/07 03:18
几种排序算法的思想很容易掌握,就是对应的时间复杂度,究其原因就是对时间复杂度是什么,如何定义计算还不知道,那么时间复杂度是如何计算的呢?请看下文。
在说时间复杂度之前要说一下算法,算法是为解决某问题而采取的具体的,有限的操作步骤,既然算法是操作步骤,那么步骤占用计算机资源的多少就决定了算法的效率。而计算机资源中有时间资源(处理器)和空间资源(存储器),因此时间复杂度是描述算法效率的标准中的一种。
什么是时间复杂度
算法中,操作重复执行的次数为算法的时间度量。
设f(n)为描述一个算法重复执行次数的函数,这个算法的时间复杂度即为O(f(n))。这里只需求的函数(f(n))的增长率。
例题1:
f(n)=n^3+3n O(f(n))=n^3
f(n)=2 O(f(n))=1
f(n)=logn+n O(f(n))=logn
如何求解
现在如果给定我们一个算法的函数,我们肯定可以特别轻松的写出时间复杂度,但是,函数往往不直接给我们,给我们的是一段代码,我们是否很容易的求出时间复杂度呢?
如下:
例题2.1:
for(i=1;i<=n;++i){ for(j=1;j<=n;++j){ ++x; s+=x; }}
分析: 1)第一个for循环重复的次数为n2)第二个for重复的次数也为n
3)两个for是嵌套的,程序总的重复次数为n^2
4)时间复杂度即为n^2
例题2.2:
i=1; while(i<=n){ i=i*2; }
分析:1)设重复的次数为m
2)i=1 循环一次i的值都乘以2, m次循环后i的值就不满足小于等于n了,得函数i*(2^m)>n (i=1)
3)求得重复次数m=log2(n/i),即得时间复杂度
说明:上题中i如果不为1时,时间复杂度还是log2(n/i),原因是求的是函数的增长率。
好了,现在我们知道了如何去求时间复杂度的函数及时间复杂度,单个的函数能求出来,那么多个函数在一块呢?就好比我们会算加法、减法和乘法,那么混合运算怎么算呢? 复合的程序中就能写出多个时间复杂度的函数,整个函数的时间复杂度如何计算就好比混合运算的优先级,是有规则的,请继续看:
时间复杂度的表示法则
加法法则:
乘法法则:
特例:若其中有一个为常数c
f(n1)=c O(f(n1))*O(f(n2))=O( c*f(n2) ) = O( f(n2) )
例3:
{ for ( int i = 0; i < m; i++ ) { sum[i] = 0; for ( int j = 0; j < n; j++ ) { sum[i] += x[i][j]; } } for ( i = 0; i < m; i++ ) { System.out.println(i); }}
分析: 1)嵌套的两个for循环,用乘法法则得:O(m*n)
2)第三个for循环,时间复杂度为O(m)
3)利用加法法则得:时间复杂度为O( max(O(m*n),O(m)) )
- 时间复杂度,空间复杂度
- 时间复杂度&空间复杂度
- 时间复杂度 & 空间复杂度
- 时间复杂度、空间复杂度
- 时间复杂度 空间复杂度
- 时间复杂度&空间复杂度
- 时间复杂度/空间复杂度
- 时间复杂度+空间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- 时间复杂度
- Android开源项目SlidingMenu深入剖析
- Android AsyncTask完全解析,带你从源码的角度彻底理
- hadoop info 1
- UVa 10420 List of Conquests (STL map)
- URAL 1309: Dispute
- 时间复杂度
- TCPL C++迭代器的用法 用作参数传递 读写文件
- IT English Collection(27)of Collection
- 继续实习?还是潜心补习?
- 从代码角度进行优化的技巧
- Jbpm5.4配置与安装
- windows下配置git
- 浅谈MVC
- java基础