算法概念与描述
这很明显是一个百度的东西。。。
所以目录我都懒得整了。。。
算法就是准确描述解决一类问题的方法
比如解决鸡兔同笼问题
这个算法首先就是输入
然后就运算
然后输出
这样输入,运算,输出,就可以称为一个简单的算法。
一个合格的算法应该满足以下5个条件
- 确切性
你能确切描述这个算法,不存在任何含糊和二义性 - 有穷性
经过有限次数的执行之后可以求出问题的解
怎么算是无穷呢?
输出\(\frac{1}{3}\)的小数形式
无限循环小数怎么有限次输出解决嘛。。。 - 可行性
你的程序是可以运行的
什么叫做不可行呢?
比如输出\(\pi\)就很不可行
(无限不循环小数输出个鬼) - 输入项
任意个合法输入项。如果输入项为0表示输入已经给出(默认)。
不会有程序不存在输入项(输入项为0项也叫作存在,那个叫做初始条件)
合法的输入项表示这个输入项是会影响输出的,而且这个输入项对于问题来说是合理的。
如果这个输入项无论输入什么问题的结果都不变,那么这个输入项没有意义。 - 输出项
必须有输出,表示问题的结果
输出爱有几个就输几个,你管不着。
如何评价一个算法
首先我们从从正确性来说
正确性就是指在算法具备上述五个条件的前提下,对于每一个输入,都能得到确定的,正确的输出。
比如我计算鸡兔同笼问题,给我整出了\(-1\)只鸡,\(1.5\)只兔子
这叫做不正确
然后就是时空复杂度
是的我时间空间是一起分析的
时间复杂度就表示执行算法所需要的计算工作量。一般来说,时间复杂度问题规模的递增函数。
问题的规模越大,时间复杂度越高。
比如说我用枚举法解决鸡兔同笼问题
有100个头的时候,我要枚举50次(不就全部都是鸡一直削减到没有鸡)
10000000000个头的时候,我要枚举5000000000次
随着头的个数的增长,问题的规模越来越大,时间复杂度也越来越高。
当然,如果你用解二元一次方程组的方法。。。时间复杂度就不变了
所以枚举法的时间复杂度高于解方程
至于空间复杂度,就是你解决这个问题的时候所用的内存
我们如果要开一棵线段树,那么空间复杂度就是\(O(4n)\),这个也是随着问题的规模越大,空间复杂度越大的典例。
但是为了我们开全局变量的方便,我们一般都会在不知道n的时候直接开到\(4n_{max}\),但是实际上解决问题所用的空间复杂度只是\(4n\)
接着就是可读性
算法的可读性就是指。。。就是指你读它的难易程度。
比如说当你在做数学题
不可读的过程是长成这样的:
可读的过程。。。不知道真的不知道
最后就是鲁棒性
(emmm竞赛中没有遇见过)
就是指你的程序应对非法输入的应变能力
比如说我鸡兔同笼
1.5个头,-1只脚,叫做非法输入。
在比如说我计算a/b,输入b=0,这叫做非法输入
鲁棒性是指一个算法对不合理数据输入的反应能力和处理能力,也称为容错性
算法的描述
怎么描述算法呢?我们可以用自然语言,流程图和伪代码
比如交换两个变量的值。
自然语言描述:我直接告诉你怎么做。先给我定义一个新的变量,保存其中一个变量的值。然后另一个变量覆盖这个变量。新定义的变量再赋值给另一个变量
(我都晕了)
流程图:自己画去
伪代码:由于这题太简单了。。。伪代码都变成代码了
int c=a; a=b; b=c;
伪代码其实就是用代码来描述一个程序的功能(注意不是实现)
因为不同语言在实现同一个功能时代码可能长得不一样
所以我们就用类似于英语的伪代码来描述这个模块的组成和功能。