[数据结构] 时间复杂度的理解
2016-11-27 08:00
417 查看
时间复杂度:函数计算之行的基本次数
面试tip:面试官问及时间复杂度不一定只有最坏的,一般人一般会直接答最坏的,其实还有最好和平均。
例如:在一个长度为N的线性表中搜索一个数据x。
最坏:没有找到,到最后才找到
平均:不好不坏到中间才找到
最好:很开心第一下就找到了,一般必须要关注,但是在哈希的时候会关注
官方的说法:
最坏情况:任意输入规模的最大运行时间。(上界)
平均情况:任意输入规模的期望运行时间。
最好情况:任意输入规模的最小运行时间,通常最好情况不会出现。(下界)
在实际中我们通常情况考量的是算法的最坏运行情况。也就是说对于任意输入规模N,算法的最长运行时间,理由如下:
一个算法的最坏情况的运行时间是在任意输入下的运行时间上界。
对于某些算法,最坏的情况出现的较为频繁。
大体上看,平均情况与最坏情况一样差。
算法分析要保持大局观:
忽略掉那些的常数。
关注运行时间的增长趋势,关注函数式中增长最快的表达式。
描述这时间复杂度的站在数学家的角度总会抽象出一个东西,那这个东东我想就是大O的渐进表示法、
如:F(N) = N^3 + N^2 + N +1000,则关注N^3->O(N^3)
[align=left]Test1的时间复杂度为:O(N^2)[/align]
Test2的时间复杂度为:O(M+N)
[align=left][/align]
Test3的时间复杂度为:O(M*N)
下面来算下常见的几种算法的时间复杂度:
冒泡:(比较次数)
等差数列:(n-1)+(n-2)+.......+1 = n*(1+(n-1))/2 = 1/2n^2 约等于 O(n^2)
二分查找:(前提:有序)相当于一颗搜索二叉树(左孩子比根大右孩子比根小),每次排出一半
假设树的高度h节点有N个
2^h-1 = N
二分查找的时间复杂度相当于搜索二叉树的高度 !!! 是不是很震撼
这里扩展下如果不是二分查找,三分,四分,五分呢? 那不就是多叉树吗!!哈哈
二分查找的时间复杂度:O(log2N)
变形下就是:O(logmN) (m就是几叉 几分)
[align=left]折纸法理解折半查找[/align]
[align=left]递归算法的时间复杂度计算[/align]
递归算法的时间复杂度为递归总次数*每次递归次数。
空间复杂度
[align=left]空间复杂度的计算跟时间复杂度类似,也使用大O的渐进表示法。--(对象的个数)[/align]
[align=left]要注意的是递归算法的空间复杂度,假如递归深度为N*每次递归的空间大小为1,则空间复杂度为O(N)。[/align]
[align=left]
[/align]
[align=left]
[/align]
以斐波那契数列学习时间复杂度&空间复杂度的计算
[align=left]long long Fibonacci1( int n )[/align]
[align=left]{[/align]
return n < 2 ? n : Fibonacci(n -
1) + Fibonacci( n - 2);
[align=left]}[/align]
[align=left]斐波那契递归算法时间复杂度:O(2^N)空间复杂度为:O(N)(请自己画图思考这里的时间复杂度和空间复杂度是这样?)[/align]
[align=left]
[/align]
[align=left]实现斐波那契数列[/align]
[align=left]升级版1: 要求时间复杂度为O(N)。[/align]
[align=left]升级版2:要求时间复杂复杂度为O(N),空间复杂度为O(1)。[/align]
[align=left]
[/align]
[align=left]斐波那契的优化[/align]
[align=left]long long Fibonacci2(int n)[/align]
[align=left]{[/align]
[align=left] long long * fibArray = new long long[ n+1];[/align]
[align=left] fibArray[0] = 0;[/align]
[align=left] fibArray[1] = 1;[/align]
[align=left]
[/align]
for (int i =
2; i <= n ; ++i)
[align=left] {[/align]
fibArray[i ] = fibArray[ i -
1] + fibArray [i - 2];
[align=left] }[/align]
[align=left]
[/align]
[align=left] long long ret = fibArray[n ];[/align]
[align=left] delete[] fibArray ;[/align]
[align=left]
[/align]
[align=left] return ret ;[/align]
[align=left]}[/align]
[align=left]long long Fibonacci3( int n )[/align]
[align=left]{[/align]
[align=left] long long fibArray[3] = {0, 1, n};[/align]
[align=left]
[/align]
for (int i =
2; i <= n ; ++i)
[align=left] {[/align]
[align=left] fibArray[2] = fibArray [1] + fibArray[0];[/align]
[align=left] fibArray[0] = fibArray [1];[/align]
[align=left] fibArray[1] = fibArray [2];[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] return fibArray [2];[/align]
[align=left]}[/align]
[align=left][/align]
面试tip:面试官问及时间复杂度不一定只有最坏的,一般人一般会直接答最坏的,其实还有最好和平均。
例如:在一个长度为N的线性表中搜索一个数据x。
最坏:没有找到,到最后才找到
平均:不好不坏到中间才找到
最好:很开心第一下就找到了,一般必须要关注,但是在哈希的时候会关注
官方的说法:
最坏情况:任意输入规模的最大运行时间。(上界)
平均情况:任意输入规模的期望运行时间。
最好情况:任意输入规模的最小运行时间,通常最好情况不会出现。(下界)
在实际中我们通常情况考量的是算法的最坏运行情况。也就是说对于任意输入规模N,算法的最长运行时间,理由如下:
一个算法的最坏情况的运行时间是在任意输入下的运行时间上界。
对于某些算法,最坏的情况出现的较为频繁。
大体上看,平均情况与最坏情况一样差。
算法分析要保持大局观:
忽略掉那些的常数。
关注运行时间的增长趋势,关注函数式中增长最快的表达式。
描述这时间复杂度的站在数学家的角度总会抽象出一个东西,那这个东东我想就是大O的渐进表示法、
如:F(N) = N^3 + N^2 + N +1000,则关注N^3->O(N^3)
void Test1 ( int N ) { for (int i = 0; i < N ; ++ i) { for (int j = 0; j < N ; ++ j) { //... } } for (int k = 0; k < 2 * N ; ++ k) { //... } int count = 10; while (count --) { //... } }
[align=left]Test1的时间复杂度为:O(N^2)[/align]
void Test2 (int N, int M) { for (int i = 0; i < M ; ++i) { } for (int k = 0; k < N ; ++k) { //... } }void Test3 (int N, int M) { for (int i = 0; i < M ; ++i) { for (int j = 0; j < N ; ++j) { //... } } }
Test2的时间复杂度为:O(M+N)
[align=left][/align]
void Test3 (int N, int M) { for (int i = 0; i < M ; ++i) { for (int j = 0; j < N ; ++j) { //... } } }
Test3的时间复杂度为:O(M*N)
下面来算下常见的几种算法的时间复杂度:
冒泡:(比较次数)
等差数列:(n-1)+(n-2)+.......+1 = n*(1+(n-1))/2 = 1/2n^2 约等于 O(n^2)
二分查找:(前提:有序)相当于一颗搜索二叉树(左孩子比根大右孩子比根小),每次排出一半
假设树的高度h节点有N个
2^h-1 = N
二分查找的时间复杂度相当于搜索二叉树的高度 !!! 是不是很震撼
这里扩展下如果不是二分查找,三分,四分,五分呢? 那不就是多叉树吗!!哈哈
二分查找的时间复杂度:O(log2N)
变形下就是:O(logmN) (m就是几叉 几分)
[align=left]折纸法理解折半查找[/align]
[align=left]递归算法的时间复杂度计算[/align]
递归算法的时间复杂度为递归总次数*每次递归次数。
空间复杂度
[align=left]空间复杂度的计算跟时间复杂度类似,也使用大O的渐进表示法。--(对象的个数)[/align]
[align=left]要注意的是递归算法的空间复杂度,假如递归深度为N*每次递归的空间大小为1,则空间复杂度为O(N)。[/align]
[align=left]
[/align]
[align=left]
[/align]
以斐波那契数列学习时间复杂度&空间复杂度的计算
[align=left]long long Fibonacci1( int n )[/align]
[align=left]{[/align]
return n < 2 ? n : Fibonacci(n -
1) + Fibonacci( n - 2);
[align=left]}[/align]
[align=left]斐波那契递归算法时间复杂度:O(2^N)空间复杂度为:O(N)(请自己画图思考这里的时间复杂度和空间复杂度是这样?)[/align]
[align=left]
[/align]
[align=left]实现斐波那契数列[/align]
[align=left]升级版1: 要求时间复杂度为O(N)。[/align]
[align=left]升级版2:要求时间复杂复杂度为O(N),空间复杂度为O(1)。[/align]
[align=left]
[/align]
[align=left]斐波那契的优化[/align]
[align=left]long long Fibonacci2(int n)[/align]
[align=left]{[/align]
[align=left] long long * fibArray = new long long[ n+1];[/align]
[align=left] fibArray[0] = 0;[/align]
[align=left] fibArray[1] = 1;[/align]
[align=left]
[/align]
for (int i =
2; i <= n ; ++i)
[align=left] {[/align]
fibArray[i ] = fibArray[ i -
1] + fibArray [i - 2];
[align=left] }[/align]
[align=left]
[/align]
[align=left] long long ret = fibArray[n ];[/align]
[align=left] delete[] fibArray ;[/align]
[align=left]
[/align]
[align=left] return ret ;[/align]
[align=left]}[/align]
[align=left]long long Fibonacci3( int n )[/align]
[align=left]{[/align]
[align=left] long long fibArray[3] = {0, 1, n};[/align]
[align=left]
[/align]
for (int i =
2; i <= n ; ++i)
[align=left] {[/align]
[align=left] fibArray[2] = fibArray [1] + fibArray[0];[/align]
[align=left] fibArray[0] = fibArray [1];[/align]
[align=left] fibArray[1] = fibArray [2];[/align]
[align=left] }[/align]
[align=left]
[/align]
[align=left] return fibArray [2];[/align]
[align=left]}[/align]
[align=left][/align]
相关文章推荐
- 数据结构-算法的时间复杂度
- 数据结构:算法的时间复杂度求法
- 堆排序时间复杂度理解
- 常用数据结构的时间复杂度
- 数据结构-算法效率的度量-时间复杂度和空间复杂度
- 数据结构时间复杂度的计算
- 2015腾讯校园招聘研发笔试题:在java中,哪些数据结构可以常量的时间复杂度O(1)添加元素?
- 【算法与数据结构】关于代码运行时间复杂度的计算方法
- 重读数据结构之--算法的时间空间复杂度
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)
- 大家都说是水题。。好吧,那我就从水题开始做。。自己独立的做。正好最近在辅导大二的数据结构,自己也加强下对栈的理解和应用。 第一次那么完全的独立完成OJ的题,激动呐!读题目理解就废了我好多的时间,虽说英语过了
- 时间复杂度和空间复杂度2 - 数据结构和算法04
- 时间复杂度和空间复杂度2 - 数据结构和算法04
- 数据结构之时间复杂度和空间复杂服
- 数据结构时间复杂度的计算
- 数据结构时间复杂度的计算
- 数据结构方面时间复杂度~空间复杂度
- 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、push以及pop的时间复杂度都是O(1)。
- 一道关于时间复杂度的数据结构题目
- 定义一个栈的数据结构,要求实现一个min函数,每次能够得到栈的最小值,并且要求Min的时间复杂度为O(1)