什么是算法,学习算法有什么用

什么是算法

任何一个问题的解决方案都并不是是凭空出现的,解决一个问题都须要选择一个合适的方法,并在此方法的引导下完成一系列的解答步骤,最终将问题转换为结果状态,对于计算机来讲,这样的方法就是算法。
算法有不少种分类,能够是一系列的数学计算,也能够是一系列的操做步骤,总之,它存在的意义就是为了有针对性地解决问题,之因此强调针对性解决问题,是由于这个世界上尚未一种能够解决一切的万能算法,每一个问题都有它独特的一面。
而对于这些特殊的需求,因而在这行业中出现了新的一批人,他们负责设计解决各类问题的算法。算法

不过也正所谓没有最好用的,只有最合适的方案,不一样的算法可以适配的是不一样的环境,就比如不一样的场景也要使用不一样的服务架构模式。

因此算法是什么,答案已经出来了 => 算法就是对问题一系列的分析得出的数据进行数学建模,用程序表达出来,来解决实际遇到的问题。

学习算法的用处

咱们在软件开发的领域中,不少东西都会由于时间的变迁而变化,编程语言也会不断地推陈出新,各类软件技术的更新换代更是突飞猛进,可是万变之中,有一种东西是不变的,那就是算法
数据结构,算法,计算机体系原理,远比编程语言,软件开发技术重要,由于算法和数据结构被称为软件的核心内容。编程

在现今软件开发的领域中,技术迭代速度飞快,掌握任意一个技术都有可能在第二年被技术的潮流所冲走,而算法,是一个应用程序中不可动摇的东西,不管语言怎么改变,算法的设计理念都是同样的。


包括在工做中遇到的算法也每每并不是是ACM那样的题目(因此说比赛误人子弟啊...咳),常见的问题好比说是:数据结构

  • 交换机中端口和VLAN的映射关系维护 (没据说过...附文)
  • 路由器带宽限速 (也没什么想法...附文)
  • ...

学习算法的目的是为了提升本身的软件编写,解决问题的能力,这种能力是在从此的工做或者项目开发过程当中所须要展示出来的关键能力,换句话来讲,就是:架构

自己学习算法,目的是培养出一套思惟框架,在将来能够真正改变本身作事的思惟,而不是为了算法而学习算法,那样只会让本身被封闭住,最终失去了本身的弹性。

秉承着这种原则去学习算法,更应该作的是找到方法,思考算法实现的设计和分析过程,而并不是是去死记硬背各类算法的实现方法,学会钓鱼的方法永远比鱼更受益不是么?

因此咱们学习算法不能死记硬背各类算法的实现方法,而是经过这些算法的学习,特别是算法实现的设计和分析的过程,培养咱们解决实际问题的能力,工做中遇到的问题是本身动手解决的问题,仍是处处贴吧发帖子求助,它的背后就是这种能力的体现,而这种能力,笼统的来讲,就是编程能力。框架


编程能力大体包括如下:编程语言

  • 逻辑思惟能力
  • 抽象建模能力
  • 编程的方法与技巧
  • ...

编程能力的培养,不是三五天能成的,也不是死记硬背就能会的,须要的是大量的实践(鄙人也在学绘画...二者感触颇深....)学习


学习算法自己,有几点是值得借鉴的:编码

  • 是可以比较直观的去提高本身编程能力的方法,掌握核心思想,可以在程序的道路中如虎添翼。
  • 一样是在写代码,可是在和别人思考一样的问题的时候,就会想的更细致些,好比时间复杂度,空间复杂度,计算效率问题的求解过程,对其它模块的影响等等(感触不能颇深,但有过的开发经验告诉我仍是有的)
  • 咱们常常会用代码堆出来一个功能,好比用户点击按钮的事件,这种流程化的动做机器也是能够作的,大量这样的场景都是能够避免去堆代码的

学习算法,有不少种方法,能够根据问题的类型采起不一样的方法,算法被权威人士大体分为三类,权威人士有多权威,我就不说了:翻译

  • 已知算法 (拥有成熟且高效的实现方法的算法) => { 这类算法,除非是这个领域的从业人员或是励志成为该领域的专家,不然了解下就好,不至于工做中一筹莫展 }
    • avl树和红黑树的插入 (附文 => 戳此)
    • 删除算法 (附文 => 戳此)
    • 二分图匹配的匈牙利算法 (附文 => 戳此)
    • 数据压缩
    • 视频编码
    • 编解码算法
    • ...
  • 理论算法 (没有固定的实现方法的算法) => { 理论中的内容是须要进行数学建模以后才会有结果的,抽象的方法自己是须要根据场景变更而变更,结合问题的数学模型,将算法原理翻译成算法是代码的实现 }
    • 遗传算法
    • 贝叶斯算法
    • 决策树算法
    • KN分类算法
    • ...
  • 实际问题或是算法比赛中的题目 (没有通用的答案) => { 要有对问题抽象建模的能力,转化为数据模型的能力,实现数据模型的能力,... } 须要堆积的算法经常使用模式:
    • 贪婪法
    • 穷举法
    • 分治法
    • 动态规划法
    • ...

对于后两类算法,门槛比较高,对抽象建模的能力和经验有要求,是须要时间来沉淀出来的。


其实,开篇也就这么多内容,所提倡的学习方法,也正是我想要学习的目的,抱着这种思想,选择了这么一条道路,简单讲讲今日这四小时的收获,以及将来短时间的规划和长期的规划。

  • 不管是什么技术,都不能为了技术而学技术,保持本身的弹性。
  • 学习算法,学的是算法思想,算法之禅,在各类场景中的灵活运用。
  • 虽然须要学习的是思惟框架,是编程思想,可是基础的东西仍是须要掌握的,好比贪婪法,穷举法等基本算法。

学习目标

  • 完成每日的代码案例
  • 温习一次过去写的案例
  • 每日至少一小时的思考,沉淀
  • 绘制应用程序流程图
  • 每日的博客,平常总结,打卡

短时间思想

  • 结束第一个月每周温习一次过去学过的全部内容
  • 至少一天完成一个课后习题
  • 结束第二个月每两周温习一次过去学过全部的内容
  • 一周完成至少一个课后习题
  • 结束后三个月之后,每个月复习一次学过的全部内容,周期持续到结束后六个月

长期改变

  • 重审本身的编程思想
相关文章
相关标签/搜索