数据结构与算法分析03-算法与算法分析

算法与算法分析

2.1定义

对特定问题求解方法和步骤的一种描述。
其实算法就是解决问题的方法和步骤。

2.2描述

自然语言:英语 中文
流程图:传统流程图、NS流程图
伪代码:类语言
程序代码:C语言程序,Java语言程序

2.2.1算法与程序

算法是解决一种问题的方法和步骤
程序是用程序设计语言对算法的具体实现

2.3算法与算法分析
2.3.1算法特性:

有穷性:一个算法执行的步骤和时间必须是有穷的
确定性:每一步指令要有确切的含义,不能有二义性,相同的输入必须是相同的输出

可行性:算法是可执行的
输入:一个算法有零个或多个输入
输出:一个算法有一个或多个输出

2.3.2算法设计的要求

正确性:
可读性:
健壮性(鲁棒性):当输入非法数据的时候,算法能灵活的作出反应,而不是返回一个错误。
高效性:花费尽量少的时间和尽量低的存储需要

2.3.3算法分析

算法效率:时间效率和空间效率

算法时间效率:程序在计算机上执行所消耗的时间。
统计方法

1,事后统计,实现算法以后进行实际测量时间和空间的开销,对硬件环境要求大,误差大。

2,事前统计:估算方法,执行一种操作(赋值,比较,移动等等)所需要的时间与算法中简单操作次数的乘积。所需要的时间是由机器本身软硬件的环境决定的。所以我们假设执行每条语句所需要的时间均为单位时间。

语句频度:每条语句的执行次数
算法所耗费的时间定义为该算法中每条语句的频度之和。为了更加简便的比较时间效率,我们只比较他们的数量级,这就是算法的渐进时间复杂度,简称时间复杂度。T(n) = O(f(n)) o表示数量级

T(n) = 2n^3 + 3n^2 + 2n + 1
当n趋近于无穷的时候T(n)与n^3 的比值趋近于2,表明当n充分大时,T(n)与n^3是同阶或同级数量级,则T(n) = O(n^3)
对于一个算法,我们只需要计算次数最多的,即次幂最大的语句。

定理:若f(n)= an^m + bn^m-1 + … + n是m次多项式,那么T(n) = O(n^m),可以直接忽略所有低次幂项和最高次幂系数,体现出增长率的含义。

计算时间复杂度的基本方法:
1.找出语句频度最大的语句作为基本语句
2.计算基本语句的频度得到问题规模n的某个函数f(n)
3.取其数量级用符号O表示

时间复杂度是有嵌套最深层语句的频度决定的

f = mn 那么 O(f(n)) = mn 因为他跟m和n都有关系
如果对于f跟对数有关系,那么我们可以直接用对数表示。

复杂度还包括: 算法的最坏时间复杂度,平均时间复杂度,最好的时间复杂度

一般总是考虑在最坏情况下的时间复杂度。如果一个复杂的算法,可以将它分成几个容易估算的部分,然后利用加法法则和乘法法则,计算算法的时间复杂度。

加法法则
T(n) = T1(n) + T2(n)
那么分别算出T1和T2的时间复杂度,然后取两者的最大值

乘法法则
T(n) = T1(n) * T2(n)
那么分别算出两者的时间复杂度,然后将时间复杂度相乘

复杂度按数量级递增顺序
常数<对数<线性<线性对数<平方<立方<指数

空间复杂度
把算法所需要开辟空间的次数,算出来

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章