版本记录
版本号 | 时间 |
---|---|
V1.0 | 2017.08.11 |
前言
将数据结构和算法比作计算机的基石毫不为过,追求程序的高效是每一个软件工程师的梦想。下面就是我对算法方面的基础知识理论与实践的总结。
算法是干什么的
当我们编写程序时,一般是实现一种先前设计好的、用来解决问题的方法。这种方法一般与使用的计算机无关,可能对多种计算机和多种语言同样适用,计算机里面算法(algorithm)用来描述适合用计算机程序实现的问题——解决方法。
大部分算法的重点在于计算中涉及的数据的组织方法,按照这种创建的对象被称为数据结构(data structure)
,也是计算机科学中的研究对象。一般认为数据结构是算法的最终产品。想学好算法也要学习数据结构,简单的算法可能导致复杂的数据结构,复杂的算法也可能使用简单的数据结构。
算法的重要性
学习算法设计的主要原因是,设计原理赋予我们节省巨大开销的潜力,甚至可以完成那些原本无法完成的任务,足可见其重要性。当我们开发一个庞大的系统时,可以分解成很多的subTask
,分解之后的算法是很好实现的,但是一定要选择好算法,不好的算法会额外消耗很多的资源。
执行特定任务的算法选择是一个很复杂的过程,这里包括复杂的数学分析,甚至包含计算机科学的分支算法分析(analysis of algorithms)
,通过详细理性的科学分析,找到科学的实现方法。
如何学习算法
算法的学习是一个循序渐进的过程,这主要有两个方面的因素。
- 其一是计算机相关基础知识是否扎实。
- 其二是思维逻辑的强化和算法实践需要时间。
如果要学习算法,找到合适的书籍是很重要的,比较推荐算法导论
这本书,下面会给出这本书的链接大家可以买或者在网上找电子免费版。
学习算法一般都是按照下面流程进行学习的:
1. 基础数学知识储备要过硬
学习算法数学一定要好,数学中与算法相关的有微积分
、线性代数
、概率论
、离散数学
、图论
。
- 微积分:可以帮助你理解算法中时间复杂度、空间复杂度的概念。
- 线性代数:帮助你理解矩阵算法中的图算法。
- 概率论:帮助你理解随机算法,估计时间复杂度等。
- 离散数学:离散数学里面有算法、计数和归纳等你需要知道的知识。
- 图论:有关树、图和流的基础知识你都可以在这里找到。
有了上面的数学知识做基础,我们才可以进入计算机方面算法的学习。
2. 计算机相关知识要精通
- 数据结构:它很重要,可以让你把树、图能用计算机语言表达出来。
- C语言:C语言是国内大部分高校工科生接触的第一门计算机语言,上手也会比较快,要比C++更好的让人理解。
3. 可以系统的啃算法了
有前面数学和计算机相关的基础,下面可以系统的开始啃算法了,比较推荐的书籍就是算法导论
和算法设计
。看算法导论看的头晕不知所云的时候,可以看这里。这里还有算法笔记。
在学习算法导论的时候还可以结合MIT的公开课进行学习。
4. 真正的实践可以开始了
有了前面对算法的系统学习,下面就可以实践了,我们平时可以在家里系统的实现一些小的算法,当然,如果你的项目里面经常用到很多大的算法,同事还有很多算法大牛的话,你的进步一定会快的飞起来,但是那是可遇不可求的事,毕竟自己如果技术不行,去的公司也十有八九也不会有技术大牛,总之,打铁还需自身硬,只有自己的技术到了一定层次,才会有机会和更高层次的人交流的机会。
还有就是学习算法不能一蹴而就,一定是厚积薄发,贯穿整个编程的职业生涯,不能急躁,程序 = 算法 + 数据结构,刚开始起步很难,不要贪多,但是一定要学的扎实。
几本推荐书籍
1. 编程之美
2. 数据结构与算法分析:C语言描述
3. 算法设计与分析基础
4. 算法引论
5. 编程的本质(英文版)
6. C语言接口与实现:创建可重用软件的技术 (这本书侧重算法的实现)
7. 编程语言实现模式
8. Algorithms on Strings, Trees, and Sequences: Computer Science and Computational Biology
9. Writing Efficient Programs
10. 算法导论(原书第2版)
11.算法设计
[12. 离散数学及其应用]
[13. 图论]
[14. Algorithms]
这些书不用全部都读,比较经典的就是算法导论,大家可以根据自己算法学习阶段,选择适合自己的参考书。找到一个好的书,多读多练,不要贪多,但是一定要精通。
后记
秋后面我会持续和大家分享我的学习成果,希望对大家有所帮助,也希望大家能和我一起探讨其中的问题,指出我的不足,一起进步,未完,待续~~~
网友评论
还可以关注下这个网站的数学和计算机课程,免费且有中文字幕