本人大四上即将结束,于2018年12月18日购《算法导论》这本书,慢慢看,第一阶段先主要理解各个章节说的算法都是什么意思,书上的课后习题先不做,用得上什么算法我再详细学习。这是官方课后答案的链接。
放在开头:没有好的算法,坏的算法之说,重点是针对不同的情况,针对不同的数据,针对不同的需求,去选择算法,改良算法。我的数学功底不强,太难的公式我看不懂,太高深的思想我理解不了,我主要以应用为主,不以解释数学公式为主。
本章介绍了一种堆排序的排序方法。这个方法比插入排序方法快(插入排序是O(n^2)),比分治,也就是归并排序方法节省空间(归并算法,子问题的解决需要多余的空间,这对内存小的机器是致命的)
这个图,就是堆排序的最重要的思想。绿的是第0层,有一个元素,蓝色是第1层,有两个元素,当然了,下面还有很多层,每层元素的个数是2^n。这两个蓝色的结点叫这个绿色结点的孩子(书上是起这个名字,不是我起的)。每个元素代表一个值,这个“堆”,分为最大堆和最小堆,一般我们分析问题用最大堆,最大堆的性质就是我上面这个图中,绿色的值必须比两个蓝色的值中最大的值还大。每一层都是这个样子,每个结点都是这样。每个蓝色还有他的两个孩子,也得符合这个性质。
从这个性质,引出了一系列最大堆的操作方法:建堆,维护堆,堆排序,优先队列。这几个方法也是本章着重讲解的,很简单,不难,我看了伪代码后,说到底就是递归+三个数值找最大。其他的也没什么。
在本章的思考题中,在建堆的方法上,是从上向下还是从下向上建,讨论了一下,最终通过举例论证,从下向上的方法是最佳的,在最差情况下所用时间少。
在本章注记中,提到了Dijkstra算法,正好最近在研究全局规划的算法,感觉这些大方向都是挺相似的。继续研究吧。