13、《算法图解》总结

第一章-大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算法的成败。

posted on 2018-07-06 09:12  lqxing  阅读(251)  评论(0编辑  收藏  举报

导航