【算法】扩展算法介绍
扩展算法
树
二叉查找树(binary search tree)
特征
对于其中的每个节点,左子节点的值都比它小,而右子节点的值都比它大
运行时间
O(log n)
数组与二叉查找树运行时间对比
|
数组 |
二叉查找树 |
查找 |
O(log n) |
O(log n) |
插入 |
O(n) |
O(log n) |
删除 |
O(n) |
O(log n) |
缺点
不能随机访问
应用场景
B树是一种特殊的二叉树,数据库常用它来存储数据。
反向索引(inverted index)
常用于创建搜索引擎。
如:一个散列表,将单词映射到包含它的页面。用户通过搜索单词,即可获取包含这个单词的所有页面。
傅里叶变换
傅里叶变换非常适合用于处理信号,可使用它来压缩音乐。
并行算法
为提高算法的速度,需要让它们能够在多个内核中并行地执行!
速度的提升并非线性,其中的原因有两个:
- 并行性管理开销
- 负载均衡
MapReduce
即分布式算法(让算法在多台计算机上运行),MapReduce是一种流行的分布式算法
分布式算法非常适合用于在短时间内完成海量工作,其中的MapReduce基于两个简单的理念:映射(map)函数和归并(reduce)函数。
映射函数
接受一个数组,并对其中的每个元素执行同样的处理
>>> arr1=[1,2,3,4,5] >>> arr2=map(lambda x:2*x,arr1) >>> list(arr2) [2, 4, 6, 8, 10]
归并函数
将很多项归并为一项。
映射是将一个数组转换为另一个数组。而归并是将一个数组转换为一个元素。
>>> from functools import reduce >>> arr1=[1,2,3,4,5] >>> reduce(lambda x,y:x+y,arr1) 15
MapReduce使用这两个简单概念在多台计算机上执行数据查询
布隆过滤器和 HyperLogLog
给定一个元素,你需要判断它是否包含在这个集合中。为快速做出这种判断,可使用散列表。
但面临海量数据,占用空间很大
布隆过滤器
- 布隆过滤器是一种概率型数据结构,它提供的答案有可能不对,但很可能是正确的。
- 布隆过滤器的优点在于占用的存储空间很少。
- 布隆过滤器非常适合用于不要求答案绝对准确的情况
HyperLogLog
HyperLogLog是一种类似于布隆过滤器的算法
HyperLogLog近似地计算集合中不同的元素数,与布隆过滤器一样,它不能给出准确的答案,但也八九不离十,而占用的内存空间却少得多。
面临海量数据且只要求答案八九不离十时,可考虑使用概率型算法!
SHA 算法
安全散列算法( secure hash algorithm, SHA)函数
原理
- 给定一个字符串, SHA返回其散列值。
- SHA是一个散列函数,它生成一个散列值——一个较短的字符串。
- 对于每个不同的字符串, SHA生成的散列值都不同
- SHA还有一个重要特征,那就是局部不敏感的。
应用
- 比较文件
可使用SHA来判断两个文件是否相同,比较超大型文件时很有用
通过判断散列值是否相同,判定是否是同一个文件
- 检查密码
能在不知道原始字符串的情况下对其进行比较
SHA被广泛用于计算密码的散列值。这种散列算法是单向的。你可根据字符串计算出散列值。但无法根据散列值推断出原始字符串。
局部敏感的散列算法
Simhash
如果对字符串做细微的修改, Simhash生成的散列值也只存在细微的差别。
可已通过比较散列值来判断两个字符串的相似程度。
Diffie-Hellman 密钥交换
Diffie-Hellman使用两个密钥:公钥和私钥。
过程:使用公钥对其进行加密。加密后的消息只有使用私钥才能解密
线性规划
应用
在给定约束条件下最大限度地改善指定的指标
所有的图算法都可使用线性规划来实现
线性规划使用Simplex算法