static 求和 简单 结构 就是 加法 模型 指定 三种
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;
- }
《数据结构与算法分析-第2章-算法分析》
static 求和 简单 结构 就是 加法 模型 指定 三种
原文:http://www.cnblogs.com/qjx-2016/p/7797891.html
来源: http://www.bubuko.com/infodetail-2383868.html