代码改变世界

数据结构0308

2018-03-08 23:47  SummerVan  阅读(154)  评论(1)    收藏  举报

算法设计的要求:

1正确性(应该保证输入输出处理没有歧义,能够得到问题的正确答案)

 (1)最基本没有语法错误

 (2)对于合法的输入能得出正确的结果

 *(3)对于异常,不合法的输入能得出满足规格的结果(程序不报错或异常 一般情况下以第三条作为标准)

 (4)即使是专门挑选用来测试的数据都能有满足要求的结果输出

2可读性(便于阅读理解算法  算法越能简单易懂越好)

3健壮性(在错误或者异常的输入时 算法也能进行相对的操作保证程序不会异常或者卡死)

4时间效率和存储量(算法执行的时间长短和占用计算机内存大小)

 

算法效率的度量方法

1事后统计法(基本不予采用):通过设计好的程序和数据来对算法的执行时间进行比对,来判断效率 耗费时间和精力巨大 效率高的算法往往需要大量数据才能判断优劣

2事前分析估算法:在程序编制前,根据统计方法估算

估算的因素:

(1)算法采用的方法 思路(算法好坏的根本)

(2)编译产生的代码质量(依赖软件)

(3)问题的输入规模

(4)计算机执行的速度(依赖硬件)

总结:一个程序的运行时间,取决于算法本身的的好坏和问题输入的规模大小

例:算法1                  算法2

let n =100 sum = 0  执行一次                            let n =100 sum = 0;  一次

for(var i =1; i < n;++i)  n + 1此        sum = (n+1)*n/2;    一次

{                      return sum      一次

  sum += i;    n次            共3次

}

return sum  一次

共 2n +3次

随着问题输入规模 N的增大 算法优劣会越来越明显 在分析一个算法的运行时间时 要把基本操作的数量和输入规模关联起来 (基本操作的数量必须表示成输入规模相关的函数)

 

函数的渐进增长

定义:给定两个函数法f(n)和g(n),如果存在一个整数N,使得对于所有的n>N,f(n)总是大于g(n),那么我们说f(n)的渐进增长快于g(n)

例:2n+3次操作和3n+1次操作 在n>2的时候前者优于后者

4n+8和2n²+1相比在n>3后后者计算量远远大于前者与最高项相乘得常数并不重要 最高次项指数大的函数随着n的增长也会变得增长特别快

在判断一个算法运行效率时,函数中的常数和其他次项可以忽略不计,应该关注最高阶项的阶数 例:2n²和3n+1和2n²+3n+1相比较

比较算法:随着n的增大(问题输入规模的增大)算法会越来越优于或差于另一个算法,以此来推断算法优劣 渐进增长越快 函数的操作次数也会增长的越快 所以增长最慢的最优