读书笔记《算法图解》

    算法图解,通过名字就可以了解到,这是一本通过图解的方式来讲解算法的书籍。

    首先需要明确的是,本书适用于对数据结构和算法感兴趣的初学者,如果想要深入研究某一算法,还需专门去看一下针对该算法的专业书籍或详细讲解。

    本书主要内容为:

    1)通用数据结构图文详解,看完就可以上手进行程序编写;

    2)动态规划、图、k最近邻算法等的原理介绍,没有算法实现,先要深入了解,需要在看些详细介绍该算法或数据结构的书籍;

    3)一些常用算法的讲解,例如布隆过滤器等,简单介绍适用场景,提供了一个学习的方向。

    最后要说的一点是,请注意看书的目录,注意各章的练习题答案在书的末尾,可参考进行练习。

    本书⭐⭐⭐⭐⭐推荐,对于有基础的同学,大概5~6个小时即可。

    下面是我阅读本书的一些摘要和思考,想了解详情,请阅读原书:

1、分而治之

    分而治之是一种通用的处理问题的解决方法,通过递归来进行实现,分治法在分解大问题为小问题后,分别求解所有小问题,减治法咋分解大问题为小问题后求解某个小问题。

    分治法的工作原理,找到简单的基线条件,确定如何缩小问题的规模,使其符合基线条件。这个就是递归的思想,和动态规划思想的相同之处在于想要把问题分解成更小的问题,不同之处在于分而治之是自上而下求解,动态规划是自下而上求解。

    归纳证明是一种证明算法行之有效的方式,它分为两步:基线条件和归纳条件。

2、散列表

    散列表适合用于模拟映射关系,防止重复,缓存/记录数据,以免服务器再通过处理而生成它们。

    散列表是以键值对的方式实现的,通过散列函数在键和值之间形成映射关系。由于散列表的键是唯一的,再次插入键相同的键值对会覆盖之前的键值对,有去重的效果。散列表在平均情况下的查找、添加、删除是O(1) 的时间,这种效率的数据结构可以用作服务器的缓存,快速返回重复使用的数据。散列表的本质是链表和数组的结合体,其高效的实现需要良好的散列函数和较低的填装因子。填装因子等于存储的数据量/存储空间,值越小,冲突越小。如果值超过一定阈值,需要增大存储空间,伴随着开链表。

    一个不错的经验规则是,一旦填装因子大于0.7,就调整散列表的长度。

    散列表中处理冲突的方式有很多,最简单的办法就是,如果两个键映射到了同一个位置,就在这个位置存储一个链表。

3、广度优先搜索

    广度优先搜索处理的问题是在非加权图中查找最短路径。

    广度优先搜索通常使用队列实现,队列是一种先进先出的数据结构,而栈是一种先进后出的数据结构。

    关于拓扑排序,如果任务A依赖于任务B,在列表中任务A就必须在任务B后面,这被称为拓扑排序,使用它可根据图创建一个有序列表。

    拓扑排序是一个有向无环图(DAG) 的所有顶点的线性序列。且该序列必须满足下面两个条件:

    1)每个顶点出现且只出现一次;

    2)若存在一条从顶点A到顶点B的路径,那么在序列中顶点A出现在顶点B的前面。

4、Dijkstra’s algorithm

    该算法主要处理的问题是在加权图中查找最短路径,处理不了带有负权边的问题,如果有负权边,使用Bellman-Ford algorithm。

    主要包含下面四个步骤:

    1)找出最便宜的节点,即可在最短时间内前往的节点;

    2)对于该节点的邻居,检查是否有前往它们的刚短路径,如果有,就更新其开销;

    3)重复这个过程,直到对图中的每个节点都这样做了;

    4)计算最终路径。

5、贪婪算法

    贪婪算法寻找局部最优解,通过局部最优解逼近全局最优解。

    对于NP完全问题,目前还没有找到快速的解决方案,如果遇到该问题可以通过近似的方式求解。

    判断可能是NP完全问题的方法主要有以下几点:

    1)元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢;

    2)涉及所有组合的问题通常是NP完全问题;

    3)不能将问题分解成小问题,必须考虑各种可能的情况。

6、动态规划

    动态规划和贪婪算法一样都是自下而上分析问题的算法,但是动态规划着眼于全局最优解,而贪婪算法着眼于局部最优解。

    动态规划和分治策略的区别在于动态规划是自下而上分析问题,现着眼于小问题,再解决大问题。而分治法是自上而下分析问题,先拆分大问题为小问题,解决小问题后大问题自然就解决了。

    动态规划可帮助你在给定约束条件下找到最优解,但仅当每个子问题都是离散的,即不依赖其他子问题时,动态规划才管用。

7、K最近邻算法

    该算法主要用于对东西进行分类。常做两种基本工作,分类编组和回归预测。

    计算两个用户的距离的公式,可以使用余弦相似度。余弦相似度用向量空间中两个向量夹角的余弦值,作为衡量两个个体间差异的大小。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似。

8、常用算法

    二叉查找树,对于其中的每个节点,左子节点的值都比它小,右子节点的值都比它大。二叉查找树中查找节点时,平均时间为O(logn),但在最糟的情况下所需时间为O(n)。

    MapReduce是一种流行的分布式算法。映射和归并是它的两个基本理念。

    布隆过滤器是一个bit 向量或者说 bit 数组。如果我们要映射一个值到布隆过滤器中,我们需要使用多个不同的哈希函数生成多个哈希值,并对每个生成的哈希值指向的bit 位置 1。所以可能有两个值置同一个位为1,所以布隆过滤器只能是用于判定不存在或者可能存在的概率算法。且不可删除。

你可能感兴趣的:(互联网,python)