算法简介及算法分析

算法简介及算法分析

算法简介

算法的定义:

算法是对特定问题求解步骤的一种描述,是指令的有限序列。(所以说只要满足上述条件,即使很简单的一个循环也是算法)

算法具备5个特征:

输入

输出

有穷性

确定性

可行性

什么是好算法:

正确性

鲁棒性

简单性

抽象分级

高效性

算法分析:

高效性是评价一个算法是否是好算法的重要标准,那么我们怎么判断算法是否高效呢?有的人说,把算法用程序语言实现一下,再输入多个测试数据实际检测运行速度(时间频度)和空间开销就好了呗!这种事后统计的方法并不能准确检测,它牵扯到计算机软硬件等环境因素。所以一般采用事前分析估算的方法,渐进复杂度分析方法(渐进时间复杂度和渐进空间复杂度)。

?

时间复杂度

当问题规模充分大时,算法中基本语句的执行次数在渐进意义下的阶,用大O记号表示。

空间复杂度

指在算法的执行过程中,需要的辅助空间数量。

?

算法分析计算方法:

一般我们更注重算法的时间性能,所以这里讲解时间复杂度的计算方法。

常见的算法时间复杂度由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)

首先找出所有语句中执行次数最大的那条语句作为基本语句,计算基本语句的执行次数,取其数量级放入大O中即可。

要理解这种方法还需要明白一个定义和一个定理。

定义:

若存在两个正的常数c和n0,对于任意n>=n0,都有T(n)<=c * f(n),则称T(n)=O(f(n))。

(该定义说明了函数T(n)和f(n)具有相同的增长趋势,并且T(n)的增长至多趋同于函数f(n)的增长。)

定理:

若A(n)=amnm + am-1nm-1 + am-2nm-2 + am-3nm-3 + am-4nm-4 + … + a1n1 + a0,则A(n)=O(nm)。

?

例题

(转载自http://blog.csdn.net/booirror/article/details/7707551/):

【1】如果算法的执行时间不随着问题规模n的增加而增长,即使算法中有上千条语句,其执行时间也不过是一个较大的常数。此类算法的时间复杂度是O(1)。

x=91; y=100;
while(y>0) if(x>100) {x=x-10;y--;} else x++;
解答: T(n)=O(1),
这个程序看起来有点吓人,总共循环运行了1100次,但是我们看到n没有?
没。这段程序的运行是和n无关的,
就算它再循环一万年,我们也不管他,只是一个常数阶的函数

?

【2】当有若干个循环语句时,算法的时间复杂度是由嵌套层数最多的循环语句中最内层语句的频度f(n)决定的。

?x=1;?

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

? ? ? ? for(j=1;j<=i;j++)

? ? ? ? ? ?for(k=1;k<=j;k++)

?? ? ? ? ? ? ? x++;   

该程序段中频度最大的语句是(5),内循环的执行次数虽然与问题规模n没有直接关系,但是却与外层循环的变量取值有关,而最外层循环的次数直接与n有关,因此可以从内层循环向外层分析语句(5)的执行次数:??则该程序段的时间复杂度为T(n)=O(n3/6+低次项)=O(n3)

?

【3】算法的时间复杂度不仅仅依赖于问题的规模,还与输入实例的初始状态有关。

在数值A[0..n-1]中查找给定值K的算法大致如下:???

i=n-1; ? ? ? ? ? ?

while(i>=0&&(A[i]!=k))?? ? ??

? ? ? i--; ? ? ? ?

return i;????????

此算法中的语句(3)的频度不仅与问题规模n有关,还与输入实例中A的各元素取值及K的取值有关: ①若A中没有与K相等的元素,则语句(3)的频度f(n)=n;
②若A的最后一个元素等于K,则语句(3)的频度f(n)是常数0。

时间: 2024-10-10 03:01:39

算法简介及算法分析的相关文章

《算法导论》学习笔记一:课程简介及算法分析

MIT的算法导论公开课,很多年前就看到了,一直没有坚持去看,最近找暑假实习,面试基本都是算法,只好抽时间去狂刷leetcode,也借着这个机会希望把这个视频看完,把算法的基本功打扎实,这个公开课讲得还是挺不错的. 之前学习其他东西的时候,记了很多笔记,最后都丢了,想再翻看的时候已经找不到,于是想到把学习笔记放到博客上,这样方便以后自己查询. 公开课视频地址:http://open.163.com/special/opencourse/algorithms.html 第一节:课程简介及算法分析 第

[CRC32算法练习] CRC32CrackMe算法分析

[破文标题][CRC32算法练习] CRC32CrackMe算法分析[破文作者]静心学习[作者邮箱][email protected][作者主页]http://www.cnblogs.com/dacainiao/[破解工具]OD, DEDE, IDA[破解平台]xp sp3[软件名称]CRC32CrackMe[软件大小]40KB[原版下载]http://bbs.pediy.com/attachment.php?attachmentid=6579&d=1183561716[保护方式]无壳[软件简介

[MD5算法练习] MD5CrackMe算法分析

[破文标题][MD5算法练习] MD5CrackMe算法分析[破文作者]静心学习[作者邮箱][email protected][作者主页]http://www.cnblogs.com/dacainiao/[破解工具]OD[破解平台]xp sp3[软件名称]MD5CrackMe[软件大小]72KB[原版下载]http://pan.baidu.com/share/link?shareid=1620370201&uk=892352529[保护方式]无壳[软件简介]一个MD5算法练习的CrackMe[破

[SHA-1算法练习] sha1crackme算法分析

[破文标题][SHA-1算法练习] sha1crackme算法分析[破文作者]静心学习[作者邮箱][email protected][作者主页]http://www.cnblogs.com/dacainiao/[破解工具]OD, DEDE, IDA[破解平台]xp sp3[软件名称]sha1crackme[软件大小]66KB[原版下载]http://bbs.pediy.com/showthread.php?t=131765[保护方式]无壳[软件简介]一个sha1算法练习的crackme.[破解声

[SHA-1算法练习] SHACrackMe算法分析

[破文标题][SHA-1算法练习] SHACrackMe算法分析[破文作者]静心学习[作者邮箱][email protected][作者主页]http://www.cnblogs.com/dacainiao/[破解工具]OD[破解平台]xp sp3[软件名称]SHACrackMe[软件大小]148KB[原版下载]http://bbs.pediy.com/attachment.php?attachmentid=6581&d=1183561734[保护方式]无壳[软件简介]一个SHA-1的算法练习C

普林斯顿公开课 算法1-1:算法分析

为什么要分析算法 分析算法能够预測算法的性能,比較算法之间的优劣,保证算法的正确性,理解算法的理论基础. 成功算法的样例 离散傅立叶变换,假设使用暴力方法,那么算法的复杂度是是N^2,假设使用FFT高速傅立叶变换能够实现O(N logN)复杂度 N-body模拟:使用Barnes-hut算法能够将复杂度减少到N logN 顺便发一张N-body模拟的炫图 Barnes-Hut算法示意图 算法分析的步骤 观察问题的特征和想到得到的结果 依据观察结果提出如果 使用如果来预測可能发生的情况 检測预測结

TF-IDF算法简介

TF-IDF算法全称为term frequency–inverse document frequency.TF就是term frequency的缩写,意为词频.IDF则是inverse document frequency的缩写,意为逆文档频率. 该算法在信息处理中通常用来抽取关键词.比如,对一个文章提取关键词作为搜索词,就可以采用TF-IDF算法. 要找出一篇文章中的关键词,通常的思路就是,就是找到出现次数最多的词.如果某个词很重要,它应该在这篇文章中多次出现.于是,我们进行"词频"

最小生成树 kruskal算法简介

生成树--在一个图中的一个联通子图  使得所有的节点都被(访问) 最小生成树 (MST) 即联通子图的总代价(路程)最小 已知的一个图 有n个点 m条边 kruskal的算法如下 先对边从小到大排序 从最小的边起,不停的合并这条边的两个节点到一个集合,如果这条边的两个节点已经在一个集合里,则无视,否则形成回路(显然错误)直到所有的节点并到一个集合里 这里需要用到并查集来合并节点 1 int cmp(const int i,const int j) { 2 return w[i] < w[j];

AES算法简介

AES算法简介 一. AES的结构 1.总体结构 明文分组的长度为128位即16字节,密钥长度可以为16,24或者32字节(128,192,256位).根据密钥的长度,算法被称为AES-128,AES-192或者AE-256. 2.明文密钥组织方式 3.一些相关的的术语定义和表示 • 状态(State):密码运算的中间结果称为状态. • State的表示:状态用以字节为基本构成元素的矩阵阵列来表示,该阵列有4行,列数记为Nb. Nb=分组长度(bits)÷ 32.Nb可以取的值为4,对应的分组长