zoukankan      html  css  js  c++  java
  • 算法及其性能分析

    要点概论:

    1. 算法概述

    2. 算法的时间复杂度分析

    3. 增长量级

    4. 算法的空间复杂度分析

    1. 算法概述

      算法是指解决问题的一种方法或一个过程。算法通常使用计算机程序来实现。算法接手待处理的输入数据,然后执行相应的处理过程,最后输出处理的结果。如图所示:

      算法的实现为若干指令的有穷序列,具有如下性质。

        1)输入数据:算法可以接收用于处理的外部数据

        2)输出结果:算法可以产生输出结果

        3)确定性:算法的组成指令必须准确无歧义

        4)有限性:算法指令的执行次数必须是有限的,执行的时间也必须是有限的。

      再计算机上执行一个算法,会产生内存开销和时间开销,算法的性能分析包括以下两个方面。

        1)时间性能分析

        2)空间性能分析

    2. 算法的时间复杂度分析

      衡量算法有效性的一个指标是运行时间。算法的运行时间长度与算法本身的设计和所求解的问题的规模(即算法求解问题的输入量,通常以一个整数表示)有关。

      算法的时间性能分析,又称为算法的时间复杂度分析。

      对于问题规模较大数据,如果算法的时间复杂度呈指数分布,完成算法的时间可能趋向于无穷大,即无法完成。

      一个算法运行的总时间取决于以下两个主要因素:

         1)每条语句的执行成本。

         2)每条语句的执行次数(频度)。

      算法中语句的频度之和示例:

    total = 0
    
    for i in range(n):
        for j in range(n):
            total += a[i][j]
    
    print(total)
    
    #内循环语句运行了 n * n 次,总算发执行语句频度为: n*2 + 2

    3. 增长量级

      对于问题规模 n ,假如算法 A 中所有语句的频度之和为 100n + 1 ;算法 B 中所有语句的频度之和为 n*2 + n + 1。则算法 A 和 B 对于不同问题规模的运行时间对照如表所示:

    问题规模 n 算法 A的运行时间 算法 B 的运行时间
    10   1001   111
    100   10 001   10 101
    1000   100 001   1 001 001
    10 000   1 000 001   100 010 001

      

      由表可以看出,随着问题规模 n 的增长,算法的运行时间主要取决于最高指数项

      在算法分析中,通常使用增长量级来描述。

      

      增长量级用于描述函数的渐进增长行为,一般使用大O符号表示。

      例如, 2n  ,100n 与  n + 1属于相同的增长量级,记为 O(n),表示函数随 n 线性增长。

      

      算法分析中常用的增长量级如表所示:

    函数类型 增长量级 举例 说明
     常量型   1 count -= 1 语句(整数递减)
       对数型   
    ㏒₂n
      

    while n > 0:

      n = n//2

      count += 1  

    除半(二分查找法等) 
       线性型     n

     for i in range(n):

      if i / 2 != 0:  #奇数

        sum_odd += i

    单循环(统计奇数的个数,顺序查找法等) 
      线性对数型   
    n㏒₂n
      (待补充)  分而治之算法(归并排序法等)
     二次型    n**2

     for i in range(l,n):

      s = ''

      for j in range(l,n):

        s += str.format('{0:l}*{l:l}={2:2}',i,j,i*j)

      print(s)

     两重嵌套循环(打印九九乘法表,冒泡排序算法,选择排序算法,插入排序算法等)
     三次型    n**3

     for i in range(n):

      for j in range(i+l,n):

      for k in range(j+l,n):

        if ( a[i] + a[j] + a[k] ) == 0:

          count += 1

     三重嵌套循环

    4 . 算法的空间复杂度分析

      衡量算法有效性的另一个指标是内存消耗。对于复杂的算法,如果其消耗的内存超过运行该算法的计算机的可用物理内存,则算法无法正常执行。

      算法的内存消耗分析,又称为算法的空间复杂度( Space Cconplexity)分析

      python语言面向对象特性的主要代价之一是内存消耗

      python的内存消耗与其在不同计算机上的实现有关。不同版本的python有可能使用不同方法实现同一种数据类型。

      

      确定一个python程序内存使用的典型方法是,先统计程序使用的对象的数量,然后根据对象的类型乘以各对象占用的字节数。示例如下:

    import sys
    
    >>>sys.getsizeof(100)      # 28
    
    >>>sys.getsizeof('abc')   # 52
    
    >>>sys.getsizeof(True)    # 28

      

  • 相关阅读:
    Code Forces Gym 100886J Sockets(二分)
    CSU 1092 Barricade
    CodeChef Mahesh and his lost array
    CodeChef Gcd Queries
    CodeChef GCD2
    CodeChef Sereja and LCM(矩阵快速幂)
    CodeChef Sereja and GCD
    CodeChef Little Elephant and Balance
    CodeChef Count Substrings
    hdu 4001 To Miss Our Children Time( sort + DP )
  • 原文地址:https://www.cnblogs.com/HZY258/p/8452824.html
Copyright © 2011-2022 走看看