《图解算法》读书笔记(十一) 接下来如何做

章节内容

  • 概述本书未介绍的10种算法
  • 根据兴趣选择接下来要阅读的内容

第一章的二分查找中,虽然查找速度快,但是每次插入元素都要排序,因为二分查找仅在数组有序时有效。
为此,有人设计了一种名为二叉查找树的数据结构。
二叉查找树中的每个节点逗比左子节点大,比右子节点小。
二叉查找树的插入和删除都很快,但是在最糟的情况下,需要时间为0(N)。
为此,又有人设计了平衡树、红黑树、B树等数据结构。

反向索引

搜索引擎的工作原理就是反向索引。
反向索引中使用的数据结构就是散列表。
搜索引擎中将网页的内容根据分词系统拆分成一个个单词,再把这些单词映射到这个网页的地址。这就是反向索引。

傅里叶变换

傅里叶变换非常适合用于处理信号,通常用于处理音频和图像。
傅里叶变换可以将信号中的频率进行分解,强化我们关心的部分。

并行算法

算法的时间复杂度是有上限的,如果我们只在一个处理器处理排序算法,目前已知的最快时间复杂度为O(nlogn)。
但其实我们可以用多核处理器进行同时处理,平摊这O(nlogn)的工作量。
但其实并行算法还需要一些其他开销,并不是处理器越多时间越少,原因有以下两个:

  1. 并行性管理开销
    如果两个处理器处理一个数组的排序,虽然每个处理器只需要处理一半的数组元素。但是我们还需要将排好序的两个数组在进行合并成一个有序的数组,这也需要时间
  2. 负载均衡
    我们需要平均每个处理器的工作,让所有处理器的处理时间都差不多,不会产生浪费。这在分布式系统中很常见。

MapReduce

MapRecuce是一种特殊的并行算法,它就是分布式算法。

分布式算法为何很有用

我们用的RMDB数据库比如Mysql在单表数量达到千万级别的时候查询速度明显变慢,处理复杂的查询更是吃力。
这是用我们可以选择使用Hadoop来使用MapReduce
MapReduce是基于两个简单的理念:映射map函数和归并reduce函数

布隆过滤器和HyperLogLog

我们前面说过检查数据是否重复可以用散列表,但如果是海量数据,这个散列表将非常大,需要大量的存储空间。为此我们需要创造性的解决方案。

布隆过滤器

布隆过滤器是一种概率性数据结构,存在一定的误差。
布隆过滤器的有点在于占用的存储很少

HyperLogLog

HyperLogLog是一种类似于布隆过滤器的算法。
HyperLogLog占用的空间更少,误差率可能更大一点。

SHA算法

我们之前学习散列表的时候说散列表需要一个好的散列函数,SHA算法就是一个好的散列算法。

比较文件

可以使用SHA来判断两个文件是否相同。

检查密码

数据库中存储的密码其实都是通过函数加密的,SHA算法是其中最常用的一种。
PS:当前最安全的密码散列函数是bcrypt

局部敏感的散列算法

SHA算法对两个基本一样的字符串进行计算后,得到的值是完全不一样的。
有时候我们需要散列函数是局部敏感的,这时候可以使用Simhash

Diffie-Hellman密钥交换

Diffie-Hellman算法解决了如何对消息进行加密。
算法使用了两个密钥,公钥和私钥。

线性规划

线性规划使用Simplex算法。图算法只是线性规划的一个子集。

posted @ 2020-09-11 21:29  無花無酒鋤作田  阅读(105)  评论(0编辑  收藏  举报