本文纯粹是出自学习目的,根据个人理解,将文章进行了部分编排与修改。如侵权,请联系删除。
------@2017/04/19------
程序 = 数据结构 + 算法
先有数据,再有算法。所以在设计时,都是以数据结构为出发点进行设计的。
另一方面,如果有了具体的算法,也可根据具体情况对数据结构进行改进。
Set: 将一对散乱的东西存放在一个容器里
(原文此处有图,省略...)
然而数据本身是没有顺序的,如何保持顺序关系?
方法 1:array,将数据连续有序的排成一排
(原文此处有图,省略...)
方法 2:linkedlist,将各个数据之间用指针连接
数据存好以后,就来到了问题的核心部分:如何处理这些数据?算法
怎么计算这些数据就是算法部分所关注的内容。同一对数据(相同的 input),根据不同需求,要求得到不同的处理结果(output),那么我们就会使用不同的算法。
个人理解,算法就是处理计算数据的具体方法。课本中学到的各种排序算法,贪心,动态规划算法,都是别人的研究结果,可供直接使用。
最简单的离自己,要排序一堆数据,常用的就是 merge sort, quick sort 等。具体情况具体分析,各种算法各有优劣。其他的大致都在这个框架里,就像现在的流行语:** 这,都是套路 **。
但是,如果能把每个算法深入学习理解,还是可以从中学到很多思考以及解决问题的方法。
举个具体算法的例子:如何判断某些数据是否存在?
好比你要在一堆人里面,找出某一个人,那么我们一般会使用排查的方法,一个一个的挨着找。
对数据也是一样的道理,就是挨个排查搜索,遍历。
问题是,我们如何加速查找呢?
生活中的例子
继续用上面找人的例子,如果你知道要找的目标的身高,那么让所有人按照:从左到右,从矮到高顺序依次排列。
你可以先寻问,站在最中间的人的身高。如果他比你要找的人高,那么你的目标一定在此人的左边,此人右边的所有人都可排除掉了。
反之亦然,每次的搜索规模就能减小一般,大大的节约了搜索时间。
计算机中的数据例子
对于数据,是同样的道理。如果数据已排序,那么每次可以从有效区间的中间点,开始查找。如果正好等于要找的元素,直接返回。若小于要查找的元素,则有效区间可以缩小为该中间点的左边,反之中间点的右边。
这种方法是一种确定性贪心。
(原文此处有图,省略...)
这种算法,可以由两种不同的底层数据结构来支持:array 和 binary search tree.
如何快速判断 5 是否在其中?
二叉搜索树
(原文此处有图,省略...)
另外一个有趣的算法问题就是,如何遍历整个 Tree?
方法 1:DFS
方法 2:BFS
知识整合
算法题:input - 一个有向图; output - 从头部到叶子的最小路径;
(原文此处有图,省略...)
每个点,记录一个值 distance 代表,从根节点到达该点的最短距离,从可达到它的所有路径中,选择最短的路径长度。
以图中 2 点为例,分别可以从 3 和 5 达到它,distance(2) = min(distance(3)), distance(5)) + 2.
这就是我们常说的动态规划 (DP):由上一层的答案推导出下一层的答案,即 k + 1层答案是由 k 层答案得到的。
动态规划一共做了三件事:
- 解(将?)空间转换
以上题为例,每个点,除了它原本的数据值,还多存了一个额外的值 distance。此时,每个点的语义就和原来的语义有所不同。
BFS
贪心:确定性贪心