zoukankan      html  css  js  c++  java
  • 算法时间复杂度计算

    1. 概述

      一个算法是由控制结构(顺序,分支,循环)和原操作(指固有数据类型的操作)构成。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对所研究的问题来说是基本操作的原操作,以该基本原操作重复执行的次数作为算法的时间度量。多数情况下,基本原操作是它最深层循环中的原操作,对算法的时间度量最常用的是考虑在最坏的情况下时间复杂度。

    2. 时间复杂度的定义

      算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n)),称O(f(n))为算法的渐进时间复杂度(O是数量级的符号 ),简称时间复杂度。

    3. 基本的计算步骤

      1. 计算出基本操作的执行次数T(n) 
        基本操作即算法中的每条语句(以;号作为分割),语句的执行次数也叫做语句的频度。在做算法分析时,一般默认为考虑最坏的情况。

      2. 计算出T(n)的数量级 
        求T(n)的数量级,只要将T(n)进行如下一些操作:忽略常量、低次幂和最高次幂的系数。令f(n)=T(n)的数量级。

      3. 用大O来表示时间复杂度 
        当n趋近于无穷大时,如果lim(T(n)/f(n))的值为不等于0的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=O(f(n))。

    4. 步骤简化

      1. 找到执行次数最多的语句
      2. 计算语句执行次数的数量级
      3. 用大O来表示结果

    5. 举例

      例一(O(n))

    public void printsum(int count){
        int sum = 1;
        for(int i= 0; i<n; i++){
           sum += i;
        }   
        System.out.print(sum);
    }

      记住,只有可运行的语句才会增加时间复杂度,因此,上面方法里的内容除了循环之外,其余的可运行语句的复杂度都是O(1)。
      所以printsum的时间复杂度 = for的O(n)+O(1) = 忽略常量 = O(n)

      这里其实可以运用公式 num = n(n+1)/2,对算法进行优化,改为

    public void printsum(int count){
        int sum = 0;
        sum = count*(count+1)/2;
        System.out.print(sum);
    }

      这样算法的时间复杂度将由原来的O(n)降为O(1),大大地提高了算法的性能。

      例二(O(log2n))

    int i= 1;
    while(i<n){
        i = i*2;
    }

      设(i=i2)的频度是t, 则:2t(2的t次方)<=n; 两边去对数t<=log2n,考虑最坏情况,取最大值t=log2n。T(n) = O(log2n)。


      
    例三(O(n2))

    int num=0;
    for(int i=0;i<n;i++){
        for(int j=0;j<n;j++){
            num++;
        }
    }

      时间复杂度为O(n2)。

    6.常用算法的时间复杂度

      算法介绍:http://wiki.jikexueyuan.com/project/java-special-topic/sort.html

      


     

      参考资料:

        1. http://www.jianshu.com/p/99bac69fdd97

  • 相关阅读:
    php 图形用户界面GUI 开发
    centos实现两种秒级任务的简单方法
    rsync同步工具的配置与使用
    【转】网络字节序与主机字节序
    【转】Visual Studio 非常实用的调试技巧
    【原/转】【boost】智能指针使用规则以及介绍
    【转】一个非常常见但容易被忽略的c++问题——用IPML模式可以解决
    【转】Visual Studio项目相对路径的设置,实用
    【原】visual studio添加现有文件夹的方法
    【原】自定义UINavigationItem的两种方法以及相应的隐藏方法
  • 原文地址:https://www.cnblogs.com/springlight/p/6475529.html
Copyright © 2011-2022 走看看