时间和空间复杂度<二>
2017-10-29 14:58
94 查看
前面已经介绍了时间空间复杂度的具体计算,这里将结合具体代码来详细分析时间和空间复杂度。
例1
由于执行次数最多语句为printf("hello world\n"),当i=0执行n次,i=1执行n次,当i=2执行n次,....,因此printf("hello world\n")执行次数为n+n+..+n=n^2,所以复杂度为O(n^2)=O(n^2)
空间复杂度:
只有调用函数才使用栈,所以执行次数为1,所以复杂度为O(1)
例2
执行最多语句为printf("hello world\n"),当i=0执行n次,当i=1执行n-1,当i=2执行n-2次,...,因此执行printf("hello world\n")次数为n+(n-1)+(n-2)+..+1=(n+1)n/2,所以复杂度为O((n+1)n/2)=O(n^2)
空间复杂度:
不存在额外空间分配/使用,所以复杂度O(1)
例3
执行最多语句为*p[j] = malloc(sizeof(int)),当i=0执行n次,当i=1执行n-1,当i=2执行n-2次,...因此执行*p[j] = malloc(sizeof(int))次数为n+(n-1)+(n-2)+..+1=(n+1)n/2,所以复杂度为O((n+1)n/2)=O(n^2)
空间复杂度:
分配空间最多语句为*p[j] = malloc(sizeof(int)),当i=0执行n次,当i=1执行n-1,当i=2执行n-2次,...因此执行*p[j] = malloc(sizeof(int))次数为n+(n-1)+(n-2)+..+1=(n+1)n/2,所以复杂度为O((n+1)n/2)=O(n^2)
例4
执行最多语句为return f(n-1),求f(n)先求f(n-1)一次,求f(n-1)先求f(n-2)一次,求f(n-2)先求f(n-3)一次,...,因此return f(n-1)执行1+1..+1=n,复杂度O(n)
空间复杂度:
分配空间最多语句为f函数调用,求f(n)先求f(n-1)压栈一次,求f(n-1)先求f(n-2)压栈一次,求f(n-2)先求f(n-3)压栈一次,...,因此f压栈总共1+1...+1=n,复杂度O(n)
例5
执行最多语句为while( i < n ) i = i * 2,分析可知执行若干次2相乘然后循环退出,设循环次数为x,那么则有2^x=n,得到x=(log2)n,总共执行次数为(log2)n+(log2)n=2((log2)n),所以复杂度为O(2((log2)n))=O((log2)n)
空间复杂度:
不存在额外使用/分配空间,所以O(1)
例6
执行最多语句为return n * f(n-1),求f(n)先求f(n-1)一次,求f(n-1)先求f(n-2)一次,求f(n-2)先求f(n-3)一次,...,因此return n * f(n-1)执行1+1..+1=n,复杂度O(n)
空间复杂度:
分配空间最多语句为f函数调用,求f(n)先求f(n-1)压栈一次,求f(n-1)先求f(n-2)压栈一次,求f(n-2)先求f(n-3)压栈一次,...,因此f压栈总共1+1...+1=n,复杂度O(n)
总结:
判断执行最多语句,计算次数之和,最后仅保留最高阶数
例1
void print(void){ for(i = 0; i < n;i ++)// 执行n次 for(j = 0; j < n;j ++)// 执行n次 printf("hello world\n")// 执行?次 }时间复杂度:
由于执行次数最多语句为printf("hello world\n"),当i=0执行n次,i=1执行n次,当i=2执行n次,....,因此printf("hello world\n")执行次数为n+n+..+n=n^2,所以复杂度为O(n^2)=O(n^2)
空间复杂度:
只有调用函数才使用栈,所以执行次数为1,所以复杂度为O(1)
例2
void print(void){ for(i = 0; i < n;i ++)// 执行n次 for(j = i; j < n;j ++)// 执行n次 printf("hello world\n")// 执行?次 }时间复杂度:
执行最多语句为printf("hello world\n"),当i=0执行n次,当i=1执行n-1,当i=2执行n-2次,...,因此执行printf("hello world\n")次数为n+(n-1)+(n-2)+..+1=(n+1)n/2,所以复杂度为O((n+1)n/2)=O(n^2)
空间复杂度:
不存在额外空间分配/使用,所以复杂度O(1)
例3
static int n, *p ; void print(void){ for(i = 0; i < n;i ++)// 执行n次 for(j = i; j < n;j ++)// 执行n次 *p[j] = malloc(sizeof(int))// 执行?次 }时间复杂度:
执行最多语句为*p[j] = malloc(sizeof(int)),当i=0执行n次,当i=1执行n-1,当i=2执行n-2次,...因此执行*p[j] = malloc(sizeof(int))次数为n+(n-1)+(n-2)+..+1=(n+1)n/2,所以复杂度为O((n+1)n/2)=O(n^2)
空间复杂度:
分配空间最多语句为*p[j] = malloc(sizeof(int)),当i=0执行n次,当i=1执行n-1,当i=2执行n-2次,...因此执行*p[j] = malloc(sizeof(int))次数为n+(n-1)+(n-2)+..+1=(n+1)n/2,所以复杂度为O((n+1)n/2)=O(n^2)
例4
long f(int n){ if(n == 0) return 1; else return f(n-1); }时间复杂度:
执行最多语句为return f(n-1),求f(n)先求f(n-1)一次,求f(n-1)先求f(n-2)一次,求f(n-2)先求f(n-3)一次,...,因此return f(n-1)执行1+1..+1=n,复杂度O(n)
空间复杂度:
分配空间最多语句为f函数调用,求f(n)先求f(n-1)压栈一次,求f(n-1)先求f(n-2)压栈一次,求f(n-2)先求f(n-3)压栈一次,...,因此f压栈总共1+1...+1=n,复杂度O(n)
例5
int i = 1, n = 100; while( i < n ) i = i * 2;时间复杂度:
执行最多语句为while( i < n ) i = i * 2,分析可知执行若干次2相乘然后循环退出,设循环次数为x,那么则有2^x=n,得到x=(log2)n,总共执行次数为(log2)n+(log2)n=2((log2)n),所以复杂度为O(2((log2)n))=O((log2)n)
空间复杂度:
不存在额外使用/分配空间,所以O(1)
例6
int f(int n){ if( n == 1) return 1; else return n * f(n-1); }时间复杂度:
执行最多语句为return n * f(n-1),求f(n)先求f(n-1)一次,求f(n-1)先求f(n-2)一次,求f(n-2)先求f(n-3)一次,...,因此return n * f(n-1)执行1+1..+1=n,复杂度O(n)
空间复杂度:
分配空间最多语句为f函数调用,求f(n)先求f(n-1)压栈一次,求f(n-1)先求f(n-2)压栈一次,求f(n-2)先求f(n-3)压栈一次,...,因此f压栈总共1+1...+1=n,复杂度O(n)
总结:
判断执行最多语句,计算次数之和,最后仅保留最高阶数
相关文章推荐
- 时间复杂度的计算<二>
- 时间和空间复杂度<一>
- 算法的时间复杂度和空间复杂度-总结<转载>
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 一串首尾相连的珠子(m 个),有N 种颜色(N<=10),设计一个算法,取出其中一段,要求包含所有N 中颜色,并使长度最短。并分析时间复杂度与空间复杂度。
- 排序 之 快排、归并、插入 - <时间复杂度>----掌握思想和过程
- 面试-链表逆置 作业手写一个单链表,并且实现单链表元素的逆置,(a0, a1,a2,a3,..an)-> (an,an-1,… a1, a0),算法的空间复杂度和时间复杂度经可能低
- 给一个数组[a1,a2,a3....an],要求出令ai-aj有最大值,其中i<=j,时间和空间复杂度尽可能小
- js获取系统时间的几种方法<二> 《网摘学习》
- PostgreSQL学习手册(客户端命令<二>)
- 《第九周任务二》定义Time类中的<<和>>运算符的重载,实现时间输入输出,改造源程序中对运算结果的显示方式,使程序读起来更自然
- SharePoint 2013 列表关于大数据的测试<二>
- Java基础零碎练手<二>
- 算法的时间复杂度和空间复杂度
- 数据结构—时间与空间复杂度
- N个大小不等的自然数排序,时间复杂度为O(n),空间复杂度为O(1)
- 解析Json数据:使用Gson进行解析json数据<二>
- struts2 <s:property/>标签的使用--输出时间格式转换
- 【Qt编程】基于Qt的词典开发系列<二>--本地词典的设计
- solr<二> Java 操作 solr CURD