《数据结构与算法分析-第2章-算法分析》
2017-11-07 10:45
399 查看
2.1 数学基础
1. 掌握O(N)的概念
2. 在需要大O表示的任何分析中,各种简化都是可能发生的,低阶项一般都会被自动忽略,常数也可以弃掉
2.2 模型
1. 对模拟机做的假设:
1. 模拟机做任何一件简单的工作(加法,减法,赋值,比较)都恰好花费一个时间单元
2. 模拟机有无限的内存,不会发生缺页中断
2.3 要分析的问题
若无相关的指定,则所需要的量是最坏情况下的运行时间
例子:最大子序列和问题的三种解法时间复杂度的分析
一般来说,数据的读入是一个瓶颈,只要可能,使得算法足够有效且不会导致问题的瓶颈是非常重要的
2.4 运行时间的计算
1. 一般法则:
法则1:for循环 一次for循环时间至多是for循环内语句(包括测试)的运行时间乘迭代的次数
法则2:嵌套的for循环 嵌套循环的一条语句总的运行时间为该语句的运行时间乘以所有for循环的大小的乘积
法则3: 顺序语句 运行时间求和(其实其中的最大值就是所得的运行时间)
法则4: if/else语句 从不超过判断在加上s1和s2中运行时间长者的总的运行时间
2. 最大子序列求和问题的解决编码的四种办法
1. O(N^3),7105ns
public static int maxSum(int[] list,int N) { int thisSum ,maxSum ,i,j,k; maxSum = 0; for (i = 0; i < N; i++) { for (j = i; j < N; j++) { thisSum = 0; for (k = 0; k <=j; k++) { thisSum+=list[k]; } if(thisSum > maxSum) { maxSum = thisSum; } } } return maxSum; }
2. O(N^2),3158ns,可以看到,这里少了一层循环
public static int maxSum2(int[] list,int N) { int thisSum ,maxSum ,i,j; maxSum = 0; for (i = 0; i < N; i++) { thisSum = 0; for (j = i; j < N; j++) { thisSum += list[j]; if(thisSum > maxSum) { maxSum = thisSum; } } } return maxSum; }
3. O(NlogN),22501ns,数据量比较比较小的情况下,递归比较浪费时间
public static int maxSum3(int[] list,int left,int right) { int maxLeftSum,maxRightSum; int maxLeftBorderSum,maxRightBorderSum; int LeftBorderSum,RightBorderSum; int mid,i; if(left == right) { if(list[left]>0) { return list[left]; } return 0; } mid = (left + right) /2; maxLeftSum = maxSum3(list, left, mid); maxRightSum = maxSum3(list, mid + 1, right); maxLeftBorderSum = 0; LeftBorderSum = 0; for (i = mid; i >= left; i--) { LeftBorderSum += list[i]; if(LeftBorderSum > maxLeftBorderSum) { maxLeftBorderSum = LeftBorderSum; } } maxRightBorderSum = 0; RightBorderSum = 0; for (i = mid + 1; i <= right; i++) { RightBorderSum += list[i]; if(RightBorderSum > maxRightBorderSum) { maxRightBorderSum = RightBorderSum ; } } return Math.max(maxLeftSum, Math.max(maxRightSum, maxLeftBorderSum + maxRightBorderSum)); }
4. O(N),3158ns
public static int maxSum4(int[] list,int N) { int thisSum = 0; int maxSum = 0; for (int i = 0; i < N; i++) { thisSum += list[i]; if(thisSum > maxSum ) { maxSum = thisSum; } else if(thisSum < 0){ thisSum = 0; } } return maxSum; }
3. 运行时间为对数的例子
1. 二分查找
2. 欧几里得算法(计算最大公因数),其实就是辗转相除法
3. 幂运算(一种利用递归求解的快速方法)
相关文章推荐
- 数据结构与算法分析:第1、2章:引论和算法分析
- 算法导论第2章(1):插入排序,算法分析
- 数据结构与算法分析(chapter2 算法分析)
- 【数据结构与算法分析——C语言描述】第二章总结 算法分析
- 《算法导论》[第2章] 算法入门-[2.2] 算法分析
- 数据结构与算法分析(算法分析部分)
- 连载4---第2章:开始(2.1:分析算法)
- 《数据结构与算法分析》学习笔记(二)——算法分析
- 数据结构与算法分析(3)算法分析
- 《Java数据结构和算法(第二版)》第2章编程作业2.6中noDup方法错误分析及纠正方法
- 数据结构与算法分析c++:算法分析
- 00数据结构与算法分析_02算法分析(三)
- 浅谈数据结构与算法分析学习及如何进行算法分析
- 数据结构与算法分析(4)算法分析的编程练习
- 第2章——算法分析
- 《数据结构与算法分析--c语言描述》之第二章:算法分析
- <数据结构与算法分析 C++描述>算法分析之最大子序列和问题
- 数据结构与算法分析再读之引论和算法分析
- 数据结构与算法分析c++:算法分析
- 《数据结构与算法分析--c语言描述》之第二章:算法分析