算法启蒙

来源:互联网 发布:c语言实验转换字母 编辑:程序博客网 时间:2024/06/10 01:53
1.算法重要吗?先不说我找实习的时候被算法虐的窘样,咱先想想下面这个例子,让你计算1到100的和,
你会怎么做?相信我们都是从1遍历到100,逐一求和。这时候,我们换一个做法,我们写两个序列,
一个是1到100,另一个是100到1。我们用类似等差数列的方法把1+00,2+99,3+98......100+1,
然后求和除以2不就是我们要的结果吗?什么?管你什么算法,做出来不就行了吗?哈.....假如你把100换成一个数量级
的数字,你试试这两个方法各自的求和时间差,你会哎呀一声。算法重要,工作能不能用到?看你是不是有心要用,
用到了说明就不是只是写代码而是在创造代码。


2.算法是什么?对于我们来说就是一堆参杂着数学思想的代码,对于机器来说就是一堆指令序列。


3.算法具备的基本特性:比如我们写一个函数,会有参数有返回值,有返回值意味着有尽头,
有尽头意味着代码是可行的(不然不可行的代码能运行到右花括号?)总的来说,输入输出,确定性,又穷性和可行性。


4.算法应该追求的目标:基本的你设计的算法求出的答案要正确吧?其次,算法越简单越好,意味着可读性强,
不然半个月后你都不知道自己当初的逻辑思维是什么。既然是算法,那自然要追求高效率啦(时间复杂度要小,
空间复杂度也要小)。当然没必要特意追求完美的算法,因为算法本来就是多种多样的,尽自己能力就是最好的算法了。


5.算法效率的度量方法:普遍流传着两种版本,一种是算法设计前估算,一种是设计完后估算。哪种好呢?当然是前者。
试想,你花费了大量时间设计出来的一个算法,投入开发中,发现效率糟糕的不得了,你肯定要替换掉它的,那么你之前
的时间算是打水漂了。所以设计前我们可以写出个大概思路,估算出最糟糕的时间复杂度(其实时间复杂度默认的就是
在最糟糕状态下的运行时间)。


6.估算方法:
(1)设计完成后估算:根据你的开发语言,获取算法执行前的系统时间,和执行完后的系统时间,比较获得的时间差就是
一个估算标准。其实算法会因为不同的硬件配置和内存,cpu运行时所处状态,得到不同的时间差的。


(2)设计前估算:最简单的方法就是,你在一张纸上,勾勒出你的算法结构,找出循环执行的语句(往往来说是嵌套层数最多
的语句),就可以估算出大概的时间复杂度。根据时间复杂度的比较就可以知道算法的好坏。


7.算法复杂度的对比标准:一般来说我们可以按照o(1)<o(logn)<o(n)<o(nlogn)<o(n^2)<o(n^3)<o(2^n)<o(n!)<o(n^n)
来进行大概的对比。注意,当你出现估算出来的时间复杂度为o(2^n)之后的效率,那么你的算法是糟糕透顶的,赶紧扔掉吧。


8.空间复杂度能不能作为一个度量标准,答案是不可以的,因为我们对一个问题设计算法,那么这个算法在运行的时候是
需要辅助内存的(用于存放指令啊,常量啊...)但是我们一般都会假设在同样的数据规模下,求解一个算法本身的复杂度,
这样才有意义。那么不同的算法所需要的空间可以认为变化不大的(对于现在的硬件设备完全可忽略)所以我们关注时间复杂度就好。
0 0
原创粉丝点击