算法图解-----十种常用算法

10种算法
1、二叉查找树
节点:左子节点的值都比它小,而右子节点的值都比它大
插入后无需排序,

2、反向索引
搜索引擎的工作原理,创建一个散列表,键为“搜索词”,值为“包含搜索词的界面”;

3、傅里叶变换
“给它一杯冰沙,它能告诉你其中包含哪些成分”,例如:给定一首歌曲,傅里叶变换能够将其中的各种频率分离出来。使用傅里叶变换可创建类似于“酷狗”这样的音乐识别软件。

4、并行算法
为了提高算法的速度,我们需要让它们能够在多个内核中并行地执行。例如:对数组进行排序,在最佳情况下,排序算法的速度大致为O(nlongn)。但是在快速排序的并行版本所需的时间为O(n)。

并行算法设计的速度提升并非线性的,因此即便你的笔记本电脑装备了两个而不是一个内核,算法的速度也不可能提高一倍,其中的原因有两个:
a、并行性管理开销。假设你要对一个包含1000个元素的数组进行排序,如何在两个内核之间分配这项任务呢?如果让每个内核对其中500个元素进行排序,再将两个排好序的数组合并成一个有序数组,那么合并也是需要时间的。
b、负载均衡。假设你需要完成10个任务,因此你给每个内核都分配5个任务。但分配给内核A的任务都很容易,10秒钟就完成了,而分配给内核B的任务都很难,1分种才完成。这意味着有那么50秒,内核B在忙死忙活,而内核A去闲得很,你如何均匀地分配工作,让两个内核都一样忙呢?
要改善性能和可扩展性,并行算法可能是不错的选择!

5、MapReduce(Apache Hadoop)
分布式算法,可让算法在多台计算机上运行。
例如:你有一个数据库表,包含数十亿乃至数万亿行,需要对其执行复杂的SQL查询。在这种情况下,你不能使用MySQL,因为数据表的行数超过十亿后,它处理起来将很吃力。相反,你需要通过Hadoop来使用MapReduce!
分布式算法非常适合用于在短时间内完成海量工作,其中的MapReduce基于两个简单的理念:映射(map)函数和归并(reduce)函数。
映射函数:它接受一个数组,并对其中的每个元素执行同样的处理,是将一个数组转换为另一个数组。
例如:如果有100台计算机,而map能够自动将工作分配给这些计算机去完成就好了。这样就可同时下载100个页面。下载速度将快得多!
归并函数:将一个数组转换为一个元素。
MapReduce使用这两个简单概念在多台计算机上执行数据查询。数据集很大,包含数十亿行时,使用MapReduce只需几分钟就可获得查询结果,而传统数据库可能要耗费数小时。

6、布隆过滤器和HyperLogLog
恶意网站过滤(海量数据处理)。
布隆过滤器:概率型数据结构。它提供的答案有可能不对,有可能正确。使用散列表时,答案绝对可靠,使用布隆过滤器时,答案却是很可能是正确的,但是不可能出现漏报的情况,即如果布隆过滤器说“这个网站未搜集”,就肯定未搜集。
优点:在于占用的存储空间很少。

HyperLogLog:是一种类似于布隆过滤器的算法。HyperLogLog近似地计算集合中不同的元素数,与布隆过滤器一样,它不能给出准确的答案,但也八九不离十,而占用内存空间却少很多。

7、SHA算法
安全散列算法(SHA)函数。给定一个字符串,SHA返回其散列值(字符串)。用于创建的散列表的散列函数根据字符串生成数组索引。
“hello”——》2cf24·····
对于每个不同的字符串,SHA生成的散列值都不同;

a、比较文件: 根据文件的SHA散列值进行比较
b、检查密码:根据SHA散列值进行比较

8、局部敏感的散列算法
SHA还有一个重要特征,那就是局部不敏感的。有时候,希望散列函数是局部敏感的,在这种情况下,可使用Simhash。如果你对字符串做细微的修改,Simhash生成的散列值也只存在细微的差别。
例如:
Google使用Simhash来判断网页是否已搜索;
使用Simhash来判断论文是否是从网上抄的;
使用Simhash来检查上传的内容是否侵权;

9、Diffie-Hellman密钥交换
公钥与私钥

10、线性规划
线性规划用于在给定约束条件上最大限制地改善指定的指标(目标);
Simplex算法

猜你喜欢

转载自blog.csdn.net/heqiang2015/article/details/83988354
今日推荐