算法及复杂性分析

计算机应用:

数值计算:加工处理的对象--纯粹的数值。

非数值计算:工业检测、过程控制、管理系统、数据处理--->加工处理的对象(具有一定的结构)

具有一定的结构包括:

逻辑结构:研究对象的特性及其相互之间的关系

存储结构:有效地组织计算机存贮

算法:有效地实现对象之间的“运算”关系

以上是《数据结构与算法》的研究内容

 

算法:通俗地讲,算法就是解题的方法。算法是对特定问题求解步骤的一种描述,它是指令的有限序列,其中每一条指令表示一个或多个操作。

算法的五个特性:

有穷性:一个算法必须总是在执行有穷步之后结束,且每一步都在有穷时间内完成。

确定性:算法中的每一条指令必须有确切的含义,无二义性。并且在任何条件下,对于相同的输入只能得出相同的输出。

有效性:算法描述的所有操作都可以通过已经实现的基本运算执行有限次来实现的。

输入:一个算法有零个或多个输入,这些输入取自于某个特定的对象集合。他们可以使用输入语句由外部提供,也可以使用赋值语句在算法内给定。

输入:一个算法有一个或多个输出,这些输出是同输入有着某些特定关系的量。

 

算法设计的要求

设计一个“好”的算法应开率以下几个方面(评价标准):

(一)正确性:算法应满足具体问题的需求。

“正确”的含义有很大的差别,大体可分为以下四个层次:

1、不含语法错误

2、对于几组输入数据能够得出满足规格说明要求的结果

3、对于精心选择的、典型的、苛刻的、带有刁难性的几组数据能够得出满足规则说明要求的结果

  通常以第3层意义的正确性作为衡量算法是否合格的标准。

4、对于一切合法的输入数据都能产生满足规格说明要求的结果

 

(二)可读性:算法在正确的前提下可读性是摆在第一位的,这在当今大型软件需要多人合作的环境下是至关重要的,另一方面,晦涩难读的程序易于隐藏错误而难以调试。

(三)健壮性:算法应具有容错处理功能。

当输入的数据非法时,算法应当恰当地作出反映或进行相应处理,而不是产生莫名其妙的输出结果。并且,处理出错的方法不应是中断程序的执行,而应是返回一个表示错误或错误性质的值,以便在更高的抽象层次上进行处理。

(四)高效率:效率指的是算法执行的时间(时间复杂性);高效性则要求算法的执行时间要尽可能的短,其执行时间越短,算法的效率就越高;

(五)低存储量需求:存储量需求指算法执行过程中所需要的最大存储攻坚(空间复杂性)。一般这两者与问题的规模有关。

 

一个好的算法首先要具备正确性、可读性和健壮性。

再考虑:时间效率,空间效率

 

算法效率的度量

(1)事后统计的方法

此方法有两个缺陷:一是必须先运行程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素。

(2)事前分析估算的方法

与算法执行时间相关的因素有:

1算法选用的策略  2问题的规模

3编写程序的语言  4编译程序产生的机器代码的质量

5计算机执行指令的速度

 

分析:任何一个算法都是由一个控制结构和若干原操作组成的。

控制结构:顺序、分支和循环3种。

 

算法的执行时间Σ = 原操作(i)的执行次数*原操作(i)的执行时间

算法的执行时间 与 原操作执行次数之和 成正比

通常做法:从算法中选取对所研究问题(或算法类型)来说是基本操作的原操作,以该基本操作重复执行次数作为算法的时间度量。

 

例:两个N*N矩阵相乘算法。

for (i=1;i<=n;++i)

{

for(j=1;j<=n;++j)

{

c[i][j] = 0;

for (k=1;k<=n;++k)

  c[i][j] += a[i][k] *b[k][j]

}

}

基本操作:

c[i][j] += a[i][k] *b[k][j]

算法执行时间:

T(n) = O(n³)

 

一个算法的执行基本运算次数T(n)是问题规模n的某个函数f(n),记作:

T(n)=O(f(n))

记号“O”读作“大O”(是Order的简写,意指数量级),它表示随问题规模n的增大,算法执行时间的增长率和f(n)的增长率相同。

算法的时间复杂度以算法中基本操作执行的次数(简称频度)作为算法的时间度量。

 

推导大O阶攻略:

1、用常数1取代运行时间中的所有加法常数。

2、当T(n)为多项式时,可只读取其最高次幂项,且它的系数也可略去不写。

3、得到的最后结果就是大O阶。

 

常量阶O(1)

int fun2(int n)

{int s;

s = (n*(n+1)/2);

return s;

}

线性阶O(n)

int fun2(int n)                          

{int  i,s=0;

for (i=1;i<=n;i++)

  s+=i;

return s;

}

int fun2(int n)                          

{int  i,s=0;

for (i=1;i<=n;i+=2)

  s+=i;

return s;

}

 

平方阶O(n²)

int i,j;

int sum =0

for (i=1;i

{

for(j=1;j

{

sum+=i*j

}

}s

 

对数阶O(logn)

int count=1;

while(count

{

count = count*2

}

 

时间复杂度T(n)按数量级递增顺序为:

常数阶 对数阶 线性阶 线性对数阶 平方阶 立方阶 ...

k次方阶

指数皆 阶乘阶
O(1) O(log₂n) O(n) O(nlog₂n) O(n²) O(n3)    O(n k) O(2ⁿ) O(n!)

复杂度低      →复杂度高

注:

O()为渐进符号。

空间复杂度S(n)按数量级按递增顺序也与上表类似。

其中,O(1)为常数数量级,即算法的时间复杂性与输入规模n无关。

 

算法的存储空间需求

空间复杂度:算法所需存储空间的度量,记作:S(n) = O(f(n))

其中n为问题的规模。

一个算法所需存储空间:算法本身的空间、输入数据的存储空间、算法在运行过程中临时占用的存储空间。

若所需临时空间不随问题规模的大小而改变,则称此算法为原地工作。

若所需存储量依赖于特定的输入,则通常按最坏情况考虑。

 

转载于:https://www.cnblogs.com/privilege/p/11189525.html

你可能感兴趣的:(数据结构与算法)