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