第一章-大O表示法
1、一些常见的大O运行时间
(1)O(n),线性时间,如简单查找;
(2)O(log n),对数时间,如二分查找;
(3)O(n2),如简单排序;
(4)O(n×log n),如快速排序;
(5)O(n!),如旅行商问题。
2、大O表示法的特点
(1)算法的速度比较不是时间,而是操作数的增速;
(2)谈论算法的速度时,我们说的是随着输入的增加,其运行时间将以什么样的速度增加;
(3)算法的运行时间用大O表示法表示;
(4)O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多。
3、大O表示法小结
(1)二分查找的速度比简单查找的速度快得多;
(2)O(log n)比O(n)快,当需要搜索的元素越多时,前者比后者快得越多;
(3)算法运行时间不以秒作为单位;
(4)算法运行时间是从其增速的角度度量的;
(5)算法运行时间用大O表示法表示。
第二章-选择排序
(1)计算机内存就像一大堆抽屉;
(2)需要储存多个元素时,可使用数组或者链表;
(3)数组的元素都在一起;
(4)链表的元素是分开的,其中每个元素都储存了下一个元素的地址;
(5)数组的读取速度很快;
(6)链表的插入和删除速度很快。
第三章-递归
(1)递归指的是调用自己的函数;
(2)每个递归函数都有两个条件:基线条件和递归条件;
(3)栈有两种操作:压入和弹出;
(4)所有函数调用都进入调用栈;
(5)调用栈可能很长,这将占用大量的内存。
第四章-分而治之(D&C)
1、分而治之的工作原理:(1)找出简单的基线条件;(2)确定如何缩小问题的规模,使其符合基线条件。
2、分而治之小结
(1)分而治之将问题逐步分解。使用分而治之处理列表时,基线条件很可能是空数组或只包含一个元素的元组;
(2)实现快速排序时,请随机选择作用pivot的元素;
(3)快速排序的平均运行时间为O(n log n);
(4)大O表示法中的常量有时候事关重大,这就是快速排序比合并排序快的原因;
(5)比较简单查找和二分查找时,常量几乎无关紧要,因为列表很长时,O(log n)比O(n)快得多。
第五章-散列表
1、散列函数得特点
(1)散列函数总是将同样的输入映射到相同的索引;
(2)散列函数将不同的输入映射到不同的索引;
(3)散列函数直到数组有多大,只返回有效的索引。
2、散列表的应用
(1)模拟映射关系;(2)防止重复。
3、散列表小结
(1)你可以结合散列函数和数组来创建散列表;
(2)冲突很糟糕,你应该使用可以最大限度减少冲突的散列函数;
(3)散列表的查找、插入、删除的速度都很快。
第六章-广度优先搜索
1、广度优先搜索解决的两类问题
(1)从节点A出发,有无前往B的节点?
(2)从节点A出发,前往节点B的哪条路径最短?
2、广度优先搜索小结
(1)面临类似于寻找最短路径的问题时,可尝试使用图来建立模型,再使用广度优先搜索来解决问题;
(2)有向图中的边为箭头,箭头的方向指定了关系的方向;
(3)无向图中的边不带箭头,其中的关系是双向的;
(4)队列是先进先出(FIFO)的数据结构;
(5)栈是后进先出(LIFO)的数据结构;
(6)你需要按加入顺序检查搜索列表中的人,否则找到的就不是最短路径,因此搜索列表必须是队列;
(7)对于检查过的人,务必不要再去检查,否则可能导致无限循环。
第八章-贪婪算法
1、如何识别NP完全问题
(1)元素较少时算法运行速度很快,但随着元素数量的增加,速度会变得非常慢;
(2)涉及“所有组合”的问题通常是NP完全问题;
(3)不能将问题分成小问题,必须考虑各种可能情况。这可能是NP完全问题;
(4)如果问题涉及到序列(如旅行商问题中的城市序列)且难以解决,它可能是NP完全问题;
(5)如果问题涉及集合(如广播台集合)且难以解决,它可能是NP完全问题;
(6)如果问题可转换成集合覆盖问题或者旅行商问题,那它肯定是NP完全问题。
2、贪婪算法小结
(1)贪婪算法寻找局部最优解,企图以这种方式获得全局最优解;
(2)对于NP完全问题,最佳的做法是使用近似算法;
(3)贪婪算法易于实现、运行速度快,是不错的近似算法。
第九章-动态规划
1、动态规划问题带来的启示
(1)动态规划可帮助你在给定约束条件下找到最优解。在背包问题中,你必须在背包容量给定的情况下,偷到价值最高的商品;
(2)在问题可分解为彼此独立且离散的子问题时,就可使用动态规划来解决。
(3)每种动态规划解决方案都涉及网格;
(4)单元格中的值通常就是你要优化的值。在背包问题中,单元格的值为商品的价值;
(5)每个单元格都是一个子问题,因此你应考虑如何将问题分成子问题,这有助于你找出网格的坐标轴。
2、如何设计动态规划的网格?
(1)网格中的值是什么?
(2)如何将这个问题划分为子问题?
(3)网格的坐标轴是什么?
3、动态规划小结
(1)需要在给定约束条件下优化某种指标时,动态规划很有用;
(2)问题可分解为离散子问题时,可使用动态规划来解决;
(3)每种单元格中的值通常就是你要的优化值;
(4)每个单元格都是一个子问题,因此你需要考虑如何将问题分解为子问题;
(5)没有放之四海皆准的计算动态规划解决方案的公式。
第十章-K相近邻算法
1、KNN可以完成的两种基本工作——分类和回归:
(1)分类就是编组;(2)回归就是预测结果(如一个数字)。
2、KNN小结
(1)KNN用于分类和回归,需要考虑最近的邻居;
(2)分类就是编组;
(3)回归就是预测结果;
(4)特征抽取意味着将物品(如水果或用户)转换为一系列可比较的数组;
(5)能否挑选合适的特征事关KNN算法的成败。