zoukankan      html  css  js  c++  java
  • 《数据结构与算法分析-第2章-算法分析》

    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. 幂运算(一种利用递归求解的快速方法)

  • 相关阅读:
    php 类文件加载 Autoloader
    windows下配置nginx+php
    crontab 定时调度
    PHP 常见语法 集合
    php socket
    tengine + mysql + nginx + php
    yii2 [行为] behaviors 拦截器
    .htaccess 语法以及应用
    nginx 安装
    Nginx HTTP负载均衡和反向代理配置
  • 原文地址:https://www.cnblogs.com/qjx-2016/p/7797891.html
Copyright © 2011-2022 走看看