算法启蒙
来源:互联网 发布: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.空间复杂度能不能作为一个度量标准,答案是不可以的,因为我们对一个问题设计算法,那么这个算法在运行的时候是
需要辅助内存的(用于存放指令啊,常量啊...)但是我们一般都会假设在同样的数据规模下,求解一个算法本身的复杂度,
这样才有意义。那么不同的算法所需要的空间可以认为变化不大的(对于现在的硬件设备完全可忽略)所以我们关注时间复杂度就好。
你会怎么做?相信我们都是从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
- 算法启蒙
- 算法启蒙
- 【学习记录】5.1 算法启蒙
- C语言学习-编程启蒙思想与算法初识
- 启蒙与非启蒙
- 【学习记录】5.3 递归算法启蒙 1)递归算法概念
- 创业启蒙
- 性启蒙
- 启蒙认知
- JAVA启蒙
- 学长启蒙
- SP业务新人启蒙
- 网络桥牌启蒙教程
- 古典国学启蒙
- 声律启蒙
- 实习启蒙(1)
- 实习启蒙(2)
- 咬文嚼字中医启蒙-性味
- 线性表实验
- android中的MVP模式
- 笔试题5. 将student a am i转化为i am a student
- LeetCode题解:Move Zeroes
- 安装Linux系统时默认
- 算法启蒙
- Android的ADT不能自动生成R.java
- 在浏览器中预览“首选参数中指定的浏览器位置已经不存在。请确认”首选参数“指向正确的文件
- HDOJ-2054(大数比较)(A == B ?)
- 可变参数宏 __VA_ARGS__
- 递归
- iOS多线程总结
- [note]linux和win7双系统下启动项丢失问题
- 数据库资料整理