什么是算法,学习算法有什么用
什么是算法
任何一个问题的解决方案都并非是凭空出现的,解决一个问题都需要选择一个合适的方法,并在此方法的引导下完成一系列的解答步骤,最终将问题转换为结果状态,对于计算机来说,这样的方法就是算法。
算法有很多种分类,可以是一系列的数学计算,也可以是一系列的操作步骤,总之,它存在的意义就是为了有针对性地解决问题,之所以强调针对性解决问题,是因为这个世界上还没有一种可以解决一切的万能算法,每个问题都有它独特的一面。
而对于这些特殊的需求,于是在这行业中出现了新的一批人,他们负责设计解决各种问题的算法。
不过也正所谓没有最好用的,只有最合适的方案,不同的算法能够适配的是不同的环境,就好比不同的场景也要使用不同的服务架构模式。
所以算法是什么,答案已经出来了 => 算法就是对问题一系列的分析得出的数据进行数学建模,用程序表达出来,来解决实际遇到的问题。
学习算法的用处
我们在软件开发的领域中,很多东西都会因为时间的变迁而变化,编程语言也会不断地推陈出新,各种软件技术的更新换代更是日新月异,但是万变之中,有一种东西是不变的,那就是
算法
。
数据结构,算法,计算机体系原理,远比编程语言,软件开发技术重要,因为算法和数据结构被称为软件的核心内容。
在现今软件开发的领域中,技术迭代速度飞快,掌握任意一个技术都有可能在第二年被技术的潮流所冲走,而算法,是一个应用程序中不可动摇的东西,无论语言怎么改变,算法的设计理念都是一样的。
包括在工作中遇到的算法也往往并非是ACM
那样的题目(所以说比赛误人子弟啊...咳),常见的问题比如说是:
- 交换机中端口和VLAN的映射关系维护 (没听说过...附文)
- 路由器带宽限速 (也没什么想法...附文)
- ...
学习算法的目的是为了提高自己的软件编写,解决问题的能力,这种能力是在今后的工作或者项目开发过程中所需要展现出来的关键能力,换句话来说,就是:
本身学习算法,目的是培养出一套思维框架,在未来可以真正改变自己做事的思维,而不是为了算法而学习算法,那样只会让自己被封闭住,最终失去了自己的弹性。
秉承着这种原则去学习算法,更应该做的是找到方法,思考算法实现的设计和分析过程,而并非是去死记硬背各种算法的实现方法,学会钓鱼的方法永远比鱼更受益不是么?
所以我们学习算法不能死记硬背各种算法的实现方法,而是通过这些算法的学习,特别是算法实现的设计和分析的过程,培养我们解决实际问题的能力,工作中遇到的问题是自己动手解决的问题,还是到处贴吧发帖子求助,它的背后就是这种能力的体现,而这种能力,笼统的来说,就是编程能力。
编程能力大致包括以下:
- 逻辑思维能力
- 抽象建模能力
- 编程的方法与技巧
- ...
编程能力的培养,不是三五天能成的,也不是死记硬背就能会的,需要的是大量的实践(鄙人也在学绘画...两者感触颇深....)
学习算法本身,有几点是值得借鉴的:
- 是能够比较直观的去提升自己编程能力的方法,掌握核心思想,能够在程序的道路中如虎添翼。
- 同样是在写代码,但是在和别人思考同样的问题的时候,就会想的更细致些,比如时间复杂度,空间复杂度,计算效率问题的求解过程,对其它模块的影响等等(感触不能颇深,但有过的开发经验告诉我还是有的)
- 我们经常会用代码堆出来一个功能,比如用户点击按钮的事件,这种流程化的动作机器也是可以做的,大量这样的场景都是可以避免去堆代码的
学习算法,有很多种方法,可以根据问题的类型采取不同的方法,算法被权威人士大致分为三类,权威人士有多权威,我就不说了:
- 已知算法 (拥有成熟且高效的实现方法的算法) =>
avl
树和红黑树的插入 (附文 => 戳此)- 删除算法 (附文 => 戳此)
- 二分图匹配的匈牙利算法 (附文 => 戳此)
- 数据压缩
- 视频编码
- 编解码算法
- ...
- 理论算法 (没有固定的实现方法的算法) =>
- 遗传算法
- 贝叶斯算法
- 决策树算法
- KN分类算法
- ...
- 实际问题或是算法比赛中的题目 (没有通用的答案) => { 要有对问题抽象建模的能力,转化为数据模型的能力,实现数据模型的能力,... } 需要堆积的算法常用模式:
- 贪婪法
- 穷举法
- 分治法
- 动态规划法
- ...
对于后两类算法,门槛比较高,对抽象建模的能力和经验有要求,是需要时间来沉淀出来的。
其实,开篇也就这么多内容,所提倡的学习方法,也正是我想要学习的目的,抱着这种思想,选择了这么一条道路,简单讲讲今日这四小时的收获,以及未来短期的规划和长期的规划。
- 无论是什么技术,都不能为了技术而学技术,保持自己的弹性。
- 学习算法,学的是算法思想,算法之禅,在各种场景中的灵活运用。
- 虽然需要学习的是思维框架,是编程思想,但是基础的东西还是需要掌握的,比如贪婪法,穷举法等基本算法。
学习目标
- 完成每日的代码案例
- 温习一次过去写的案例
- 每日至少一小时的思考,沉淀
- 绘制应用程序流程图
- 每日的博客,日常总结,打卡
短期思想
- 结束第一个月每周温习一次过去学过的所有内容
- 至少一天完成一个课后习题
- 结束第二个月每两周温习一次过去学过所有的内容
- 一周完成至少一个课后习题
- 结束后三个月以后,每一个月复习一次学过的所有内容,周期持续到结束后六个月
长期改变
- 重审自己的编程思想