算法及其性能分析

要点概论:

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

 

 

  

 

posted @ 2018-02-18 15:35  皇昭仪  阅读(955)  评论(0编辑  收藏  举报