-
树
二叉查找树对于其中每个节点,左边节点的值都比它小,而右边节点的值都比它大。
检查时,首先检查根节点,然后根据顺序检查子节点。
在二叉查找树中查找节点时,平均运行时间为O(log n),但在最糟的情况下所需时间为O(n)。但是二叉查找树的插入和删除操作的速度要快得多。 -
反向索引
创建一个散列表
THERE | A,C |
HI | A,B |
ADIT | B |
WE | C |
A页面中包含单词THERE,由THERE映射到包含它的页面即为反向索引。
-
傅里叶变换
(回归老本行zzzzzz) -
并行算法
并行算法设计起来很难,要确保它们能够正确地工作并实现期望的速度提升也很难。有一点
是确定的,那就是速度的提升并非线性的,因此即便你的笔记本电脑装备了两个而不是一个内核,
算法的速度也不可能提高一倍,其中的原因有两个。
并行性管理开销。假设你要对一个包含1000个元素的数组进行排序,如何在两个内核之
间分配这项任务呢?如果让每个内核对其中500个元素进行排序,再将两个排好序的数组
合并成一个有序数组,那么合并也是需要时间的。
负载均衡。假设你需要完成10个任务,因此你给每个内核都分配5个任务。但分配给内核
A的任务都很容易,10秒钟就完成了,而分配给内核B的任务都很难,1分钟才完成。这意
味着有那么50秒,内核B在忙死忙活,而内核A却闲得很!你如何均匀地分配工作,让两
个内核都一样忙呢? -
MapReduce
分布式算法非常适用于在短时间处理海量的工作,MapReduce基于映射(map)和归并(reduce)函数。
映射是将一个数组转换为另一个数组
归并是将一个数组转换为一个元素
映射函数
>>> arr1 = [1, 2, 3, 4, 5]
>>> arr2 = map(lambda x: 2 * x, arr1)
[2, 4, 6, 8, 10]
map函数用法
map(function, iterable, …)
function – 函数
iterable – 一个或多个序列
归并函数
>>> arr1 = [1, 2, 3, 4, 5]
>>> reduce(lambda x,y: x+y, arr1)
15
-
布隆过滤器和HyperLogLog
布隆过滤器是一种概率型数据结构,它提供的答案有可能不对,也有可能是正确的。 -
SHA算法
SHA还让你能在不知道原始字符串的情况下对其进行比较。例如,假设Gmail遭到攻击,攻
击者窃取了所有的密码!你的密码暴露了吗?没有,因为Google存储的并非密码,而是密码的
SHA散列值!你输入密码时,Google计算其散列值,并将结果同其数据库中的散列值进行比较。
这种散列算法是单向的。可以根据字符串算出散列值,但是无法根据散列值推断出原始的字符串。
abc123到6ca13d,但是无法从6ca13d推断出abc123 -
局部敏感的散列算法
-
Diffie-Hellman 密钥交换
-
线性规划
线性规划用于在给定约束条件下最大限度地改善指定的指标。