八大基础算法思想
算法和数据结构是每个程序员都必须修炼的内功,在面试的时候或多或少都会被问到一些算法相关的问题。
算法的应用不单只体现在编程中。狭义的来讲,算法可看作是数据传递和处理的顺序、方法和组成方式,就像是各种排序算法等。广义的来讲,算法更像是一种事物运行的逻辑和规则。
算法其实是一种思维模式,本文就简单介绍一下八种常用算法思想,分别是枚举、递推、递归、分治、动态规划、贪心、回溯和模拟。
1.枚举算法
最简单的枚举算法,也被称为穷举,顾名思义就是穷尽列举。枚举思想的应用最为广泛,也最是通俗易懂。枚举思想是将问题的可能解依次全部列举,然后一一带入问题内检验,从而找到正确解。
枚举思想其实有一种兵分多路的意思,就是从多个样本中依次试错找到正确结果,当然弊端也是显而易见——试错成本。还存在一些容易叫人忽视的问题,比方说待解决问题的「可能解 / 候选解」的筛选条件,「可能解」之间相互的影响,穷举「可能解」的代价,「可能解」的穷举方式等等。
枚举思想用以下图形表示:
案例
百钱买百鸡问题
公鸡一个五块钱,母鸡一个三块钱,小鸡三个一块钱,现在要用一百块钱买一百只鸡,问公鸡、母鸡、小鸡各多少只?
2.递推算法
递推思想与枚举思想类似,都很符合人类的思维方式,人脑在面临未知问题时,第一反应是根基定性思维,从已知推导未知,从而得到解决问题的方法。
递推,顾名思义就是递次推导,递推思想的核心就是从已知的条件出发,逐步推算出问题的解。条件与结果中间存在着某种因果关系,这种条件关系可能人脑思维很容易想通,但是对于计算机而言,复杂的推导其实很难实现。计算机擅长的是执行高密度重复性高的工作,因此计算机在运用递推思想时,大多是重复性推理。举个例子,从「今天是 1 号」推出「明天是 2 号」,以此推导出以后的日期。这种推理的结构十分类似,往往可以通过继而往复的推理就可以得到最终的解。