算法的定义 & 概念

 算法是解决特定问题求解步骤的描述,即处理问题的策略

表现为指令的有限序列

每条指令表示一个或多个操作

引入

求解1+2+3+...+100=?

高斯的解法:

程序实现如下:

算法特性

1.零个或多个输入,至少一个输出

2.有穷性  有限步骤,不会出现无限循环

3.确定性  每一个步骤具有确定的含义,不会出现二义性

4.可行性  每一步必须可行,即每一步可以通过执行有限次数完成

算法设计要求

1.正确性  有输入输出、处理无歧义、正确反应问题的需求、得到正确答案

2.可读性

3.健壮性  输入数据不合法时,会做出相关处理

4.时间效率高、存储量低

算法效率的度量方法

1.事后统计【不考虑】

通过设计好的测试程序和数据,利用计算机计时器对不同算法编制的程序运行时间比较

缺陷:

 

2.事前分析估算

 在程序编制前,依据统计方法对算法进行估算

程序消耗时间取决于:

程序运行时间  ——>  算法好坏   +    问题输入量的规模

看引入中的两种求和算法

第一种:2n+3 次

第二种:3 次

延伸代码:100^2  + 2次

测定运行时间最可靠的方法——> 计算对运行时间有损耗的基本操作的执行次数

运行时间与此计数成正比

 函数的渐近增长

 算法A要做2n+3次运算【n次循环完后继续n次循环,再有3次赋值或运算】,算法B要作3n+1次运算【同A】,输入规模都是n,谁快?

不一定

 即n=1,A<B;n=2,效率相同;n > 2, A > B  ——>  总体上,A好过B

判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,更应该关注最高价项的价数

算法时间复杂度

用大写O( ) 体现算法时间复杂度的记法,称之为大O记法

O(1)   常数阶

O(n)    线性阶

O(n2)  平方阶

 例子:

  运行次数函数是f(n)=3

时间复杂度为O(1)

12次 

这种与问题大小无关(n的多少),执行时间恒定的算法,称之为具有O(1)的时间复杂度

分析算法复杂度,关键是要分析循环结构的运行情况

线性阶     ——> 循环的时间复杂度为O(n)   因为循环体中的代码要执行n次

对数阶     ——>2x = n   ——> x = log 2 n     时间复杂度为O(log n)

平方阶      ——>   时间复杂度为O(n2

 

 例:

用推导大O阶的方法得其时间复杂度为O(n2

 例:分析方法调用的时间复杂度

    调用的函数:

该函数的时间复杂度为O(1),所以整体的时间复杂度为O(n)

如果调用的函数:

则整体的时间复杂度是O(n2

常见的时间复杂度

 最坏情况与平均情况

 

   【很难通过分析得到,一般都是通过运行一定数量的实验数据后估算出来的】

对算法的分析:

1.平均时间复杂度——>计算所有情况平均值

2.最坏时间复杂度——>计算最坏情况下的时间复杂度

 空间复杂度

 

一般,不用限定词使用“复杂度”时,是指时间复杂度

原文地址:https://www.cnblogs.com/expedition/p/10672760.html