算法图解第十一章笔记(接下来如何做)

算法图解第十一章笔记(接下来如何做)


算法图解pdf百度云链接,提取码:jttg


11.1 树

对于一个经常需要进行修改的有序对象来说,数组不是一个好的选择,因为它的插入和删除太耗时了,同时可能还需要常常重新排序。为此,有人设计了二叉查找树(binary search tree),一种将新的数据直接有序插入的数据结构。

对于二叉查找树而言,其中的每一个节点,左子节点的值都比它小,而右子节点的值都比它大。相比于数组而言,它的插入和删除操作快的多。但它也有一个缺点,即不能随机访问,如不能以第几个元素的形式来访问。

另外还有很多有趣的树的结构,如:B树,红黑树,堆,伸展树等。

树是一种非常常见且常用的数据结构,必须被良好的掌握。


11.2反向索引

反向索引(inverted index)常用于搜索引擎之中。它是一种以散列表构建的数据结构。

反向索引可以根据网页中包含的特定内容来映射它的网址。如"google":www.google.cn,包含"google"字符串的网址有www.google.cn等,这样的形式。


11.3 傅里叶变换

傅里叶变换可以将一个对象根据频率分解为多个不同的成分(自己的理解)。由于它的特性,傅里叶变换的应用极其广泛,如它可以将歌曲分解为不同的频率部分,就可以强化关心的部分,抑制不关心的部分,如强化低音并隐藏高音等。另外,傅里叶变换也非常适合用于处理信号,可以用来压缩音乐。为此,首先需要将音频文件分解为音符。傅里叶变换能够准确地指出各个音符对整个歌曲的贡献,让你能够将不重要的音符删除。这就是MP3格式的工作原理!

数字信号不只有音乐一种,图像也是,JPG用的也是同样的压缩原理。


11.4 并行算法

单核处理现在已经越来越难以满足数据的增长,因此需要使用并行算法来进行多核心的同时处理,来提高计算的效率。

并行算法可以通过多核心加速处理的进程,但并不是线性增加的,原因如下:

  • 并行性管理开销。并行计算时,需要额外的开销来统筹。
  • 负载均衡。并行计算时,会将任务分配给各个核心进行处理,但很难做到完美的均衡。因此一定出现一部分核心还在工作,另一部分核心已经完成任务的情况。

11.5 MapReduce

分布式算法是现在越来越流行的并行算法。它可以令算法在多台计算机上运行。其中MapReduce是一种流行的分布式算法,在Hadoop平台上运行。

身处大数据时代,单机很难处理巨量的数据,但可以通过MapReduce来帮忙用多台计算机同时处理。

分布式算法非常适合用于在短时间内完成海量工作,其中的MapReduce基于两个简单的理念:映射(map)函数和归并(reduce)函数。

映射指的就是将一个巨大的任务分配给许多计算机来同时运行。

归并指的就是将这些任务的结果归并重新呈现成一个结果。

将一个任务分成许多小任务,映射给多台计算机进行处理,最后将多台计算机的小结果归并成一个结果。这就是MapReduce。


11.6 布隆过滤器和HyperLogLog

给定一个元素,需要判断它是否在一个集合中。为了快速的得到结果,可以使用散列表。但当集合中的数据非常庞大时,需要占用大量的空间。对于GOOGLE这样的需要存储大量的URL的公司而言,新的URL是否已被存储的判断将十分困难,因为它已经保存了大量的URL。这时候可以使用布隆过滤器。

布隆过滤器是一种概率型数据结构,它提供的答案可能不对,但很可能是正确的。它可能会出现误报,但绝不会漏报。即它说该元素不在这个集合中,就一定不在这个集合中。

布隆过滤器的优点在于它占用的存储空间很小,在集合中元素过多的情况下,使用布隆过滤器是一种有效的选择。布隆过滤器非常适用于不要求答案绝对准确的情况

HyperLogLog是一种类似于布隆过滤器的算法。它用于判断日志文件是否已被记录。它同样不能提供绝对准确的解答,但能够大量减小占用的空间,并提供很可能正确的解答。

面临海量数据且只要求答案八九不离十时,可考虑使用概率型算法!


11.7 SHA算法

SHA(secure hash algorithm)算法可以计算输入对象的hash值。对于不同的对象,它会生成不同的hash值。

根据这个特性,可以将SHA算法用于判断两个文件是否相同,也可以用于验证密码是否正确。使用SHA算法验证密码时,就可以不用将密码明文保存在数据库中了,而是保存其hash值。这样可以有效地保护用户密码的安全。因为SHA是不能由hash值反向推导其索引的对象的。


11.8 局部敏感的散列算法

SHA算法有一个重要的特征是其对局部不敏感。假设你有一个字符串,并计算了其散列值。如果你修改其中的一个字符,再计算其散列值,结果将截然不同!

这样的特性使得人们无法通过比较散列值是否类似来破解密码。

有时候,你希望结果相反,即希望散列函数是局部敏感的。在这种情况下,可使用Simhash。如果你对字符串做细微的修改,Simhash生成的散列值也只存在细微的差别。

需要检查两项内容的相似程度时,Simhash很有用。


11.9 Diffie-Hellman 密钥交换

Diffie-Hellman 密钥交换是一种加密算法,它使用两个密钥:公钥和私钥。

一个用户的公钥是对外公开的,而其私钥是只有自己知道的。这样的情况下,其他人向他发消息需要使用公钥加密。而加密过后的密文,只有该用户的私钥才能进行解密。这样就好处是:

  • 双方无需知道加密算法。他们不必会面协商要使用的加密算法。
  • 要破解加密的消息比登天还难。

RSA算法是Diffie-Hellman 密钥交换的替代者。


11.10 线性规划

所有的图算法都可
使用线性规划来实现。线性规划是一个宽泛得多的框架,图问题只是其中的一个子集。

线性规划使用Simplex算法。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值