《算法神探》笔记
1 搜索问题:在可能的空间范围内,找到一个特定值。
2 一个好的算法取决于发现数据结构中的结果并善加利用。
3 高效的算法在于有用的信息。
4 线性搜索算法的优势:易实现。
5 二分法要点:总是将mid所指的数与目标数进行比较,直到end<begin为止。
6 在职业生涯中,上算法课不要只记住一堆公式,必须要理解算法背后的原理。
7 回退:回退永远比重新走高效的多。
8 广度优先搜索(使用队列):每一步,算法都会从当前队列的第一个状态开始尝试。当发现新的可能性时,就会将其加到队列的最后,以确保算法在尝试完所有已经发现的可能状态后才会去尝试这个新发现的状态。
广度优先搜索只有在相邻之间移动的代价都一样时才会给出最优的方案,即输出广度优先搜索后的最短路径。
9 深度优先搜索(使用栈):维护一个栈存放所有已知但未探索过的状态。每一步,算法都会从栈的顶部选出下一步要去探索的状态。栈用来存放当前走过的路径,倒退时退后到还有搜索状态未被搜索的节点处。
10 并行搜索:将问题分成数个小块,并同时在这些小块上执行计算,最后将结果组合起来。
注意点:
l 如何高效的将任务分割成相互独立的单元。
l 如何将结果组合起来。
11 迭代加深:即限制了每一次搜索的深度。综合深度优先搜索和广度优先搜索的算法。
优点:具有深度优先搜索节省内存的特点,又有广度优先搜索特点,找到的是最短路径。
12 逆向索引:运用时间和空间占用取舍的例子,加深一个逆向索引会占掉更多的内存,但它在一个新的维度上进行搜索的效率得到了提升。
13 搜索在不平衡的树算法会变得低效。构建树的时间成本将在多次搜索中平摊。
14 tired树(前缀树):用来搜索字符串而不是数值。一种对字符串集合进行高效搜索的数据结构。
15 最佳优先搜索:基于某种估值分数或者评价函数来选择接下来搜索哪个状态的算法。每一个新发现的状态也都将被赋予一个分数,这个分数就是算法对这个新发现状态的估值。往往与优先队列结合使用
16 最大堆:通过数组实现,其中数组中的每个元素对应了树中的一个节点,根节点位于索引0处,子节点索引可以通过父节点的索引计算得到。索引i处节点的子节点分别位于索引2*i+1和2*i+2处。