别人的《算法图解》笔记+自己的一些思考

前言:
这个笔记我大致浏览了一下 非常简略 但是有一些非常好的观察。也给出了不少需要注意的点。
正文:
- 仅当列表是有序的 二分查找才有效,但是要注意顺序是不是重要,如果重要我们才能预排序。而且要注意有时候反过来想:有时候我们需要查找一些东西,而且是顺序并不重要 这个时候我们要想起来用二分查找进行优化,而不是题目提示你用二分查找你才想起来。
- 每个递归函数都有两部分,基线条件(base case) 和 递归条件(recursive case)。递归条件指的是函数调用自己,基线条件指的是函数不再调用自己,从而避免形成无限循环。
- 优化递归的调用栈,有2种方法
重新编写代码,转而使用循环
使用尾递归。这是一个高级的主题,不在本书的讨论范围内,另外,并非所有的语言都支持尾递归。 - 散列表要避免冲突,需要有: better hashing function(当前最安全的密码散列函数是 bcrypt,但没有任何东西是万无一失的。) and low loading factor.
- 在无向图中,每条边都是一个环。迪杰斯特拉算法只能用于有向无环图(directed acyclic graph, DAG),如果有负权边,就不能使用迪杰斯特拉算法。
- 在有负权边的图中,要求最短路径,需要用到贝尔曼-福德算法(Bellman-Ford algorithm)
- 判断是否是 NP 完全问题
元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。
涉及“所有组合”的问题通常是 NP 完全问题。
不能将问题分成小问题,必须考虑各种可能的情况。这可能是 NP 完全问题。
如果问题涉及序列,(如旅行商问题中的城市序列)且难以解决,它可能就是 NP 完全问题。
如果问题涉及集合(如广播台集合),且难以解决,它可能就是 NP 完全问题。
如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是 NP 完全问题。 - NP完全问题目前没有办法直接找到最优解 只能用近似算法或者启发式算法。
- 没有放之四海皆准的计算动态规划的公式,动态规划是一门艺术。
- Fun fact: git diff 命令指出两个文件的差异,使用的就是动态规划实现的。
- 布隆过滤器是一个概率型数据结构,它提供的答案有可能不对,但很可能是正确的。可能出现错报的情况,但是不可能出现漏报的情况。布隆过滤器非常适合用于不要求答案绝对准确的情况。面临海量数据且只要求答案八九不离十时,可考虑使用概率型算法。
- SHA 散列函数是局部不敏感的,有一个字符变化,都会导致其散列值截然不同。有时候希望散列函数是局部敏感的。在这种情况下,可使用 Simhash。如果你对字符串做细微的修改,Simhash 生成的散列值也只存在细微的差别。这让你能够通过比较散列值来判断两个字符串的相似程度。需要检查两项内容的相似程序时,Simhash 很有用。
Google 使用 Simhash 来判断网页是否已搜集。
老师可以使用 Simhash 来判断学生的论文是否是从网上抄的。
Scribd 允许用户上传文档或图书,以便与人分享,但不希望用户上传有版权的内容。这个网站可使用 Simhash 来检查上传的内容是否与出版的小说类似,如果类似,就自动拒绝。

浙公网安备 33010602011771号