《算法图解》学习笔记—第11章 10种算法简介

前言

罗列了一些以后可能会用到的算法,并简单介绍了一下,以后具体用到的时候再详细学习。


1. 树

二叉查找树(binary search tree),一种数据结构。

对于其中的每个节点,左子节点的值都比它小,而右子节点的值都比它大。
在这里插入图片描述
假设你要查找Maggie。为此,你首先检查根节点。
在这里插入图片描述

Maggie排在David的后面,因此你往右边找。
在这里插入图片描述

查找过程跟二分查找一样。在二叉查找树中查找节点时,平均运行时间为O( l o g n log n logn),但在最糟的情况下所需时间为O( n n n);而在有序数组中查找时,即便是在最糟情况下所需的时间也只有O( l o g n log n logn),因此你可能认为有序数组比二叉查找树更佳。然而,二叉查找树的插入和删除操作的速度要快得多。
在这里插入图片描述
二叉查找树也存在一些缺点,例如,不能随机访问某个元素。有处于平衡状态和不平衡状态的二叉查找树。

可以研究一下其他树相关的数据结构:B树红黑树伸展树

2. 反向索引

反向索引(inverted index) 也是一种数据结构,常用于创建搜索引擎。
搜索包含指定单词的页面,利用一个散列表,将单词映射到包含它的页面,这种数据结构被称为反向索引。
在这里插入图片描述

3. 傅里叶变换

傅里叶变换(Fourier transform)是一种线性的积分变换。傅里叶就是一种变换,从时间到频率的变化或其相互转化。

4. 并行算法

为提高算法的速度,你需要让它们能够在多个内核中并行地执行!

在最佳情况下,排序算法的速度大致为O( n l o g n n log n nlogn)。众所周知,对数组进行排序时,除非使用并行算法,否则运行时间不可能为O( n n n)!对数组进行排序时,快速排序的并行版本所需的时间为O( n n n)。

并行算法设计起来很难,要确保它们能够正确地工作并实现期望的速度提升也很难。有一点是确定的,那就是速度的提升并非线性的,因此即便你的笔记本电脑装备了两个而不是一个内核,算法的速度也不可能提高一倍,其中的原因有两个:

  • 并行性管理开销。假设你要对一个包含1000个元素的数组进行排序,如何在两个内核之间分配这项任务呢?如果让每个内核对其中500个元素进行排序,再将两个排好序的数组合并成一个有序数组,那么合并也是需要时间的。
  • 负载均衡。假设你需要完成10个任务,因此你给每个内核都分配5个任务。但分配给内核A的任务都很容易,10秒钟就完成了,而分配给内核B的任务都很难,1分钟才完成。这意味着有那么50秒,内核B在忙死忙活,而内核A却闲得很!你如何均匀地分配工作,让两个内核都一样忙呢?

要改善性能和可扩展性,并行算法可能是不错的选择!

5. MapReduce

有一种特殊的并行算法正越来越流行,它就是分布式算法。在并行算法只需两到四个内核时,完全可以在笔记本电脑上运行它,但如果需要数百个内核呢?在这种情况下,可让算法在多台计算机上运行。MapReduce是一种流行的分布式算法,可通过流行的开源工具Apache Hadoop来使用它。

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

映射是将一个数组转换为另一个数组。
在这里插入图片描述

归并函数是将很多项归并为一项。

在这里插入图片描述

6. 布隆过滤器和HyperLogLog

没看懂,名字太长,到时候需要再学习,哈哈哈哈哈

7. SHA 算法

安全散列算法(secure hash algorithm,SHA) 。给定一个字符串,SHA返回其散列值。

SHA是一个散列函数,它生成一个散列值——一个较短的字符串。用于创建散列表的散列函数根据字符串生成数组索引,而SHA根据字符串生成另一个字符串。

在这里插入图片描述

比较文件

可使用SHA来判断两个文件是否相同,这在比较超大型文件时很有用。假设你有一个4 GB的文件,并要检查朋友是否也有这个大型文件。为此,你不用通过电子邮件将这个大型文件发送给朋友,而可计算它们的SHA散列值,再对结果进行比较。
在这里插入图片描述

检查密码

假设Gmail遭到攻击,攻击者窃取了所有的密码!你的密码暴露了吗?没有,因为Google存储的并非密码,而是密码的SHA散列值!你输入密码时,Google计算其散列值,并将结果同其数据库中的散列值进行比较。
在这里插入图片描述

Google只是比较散列值,因此不必存储你的密码!SHA被广泛用于计算密码的散列值。这种散列算法是单向的。你可根据字符串计算出散列值。
在这里插入图片描述

但你无法根据散列值推断出原始字符串。
在这里插入图片描述

SHA实际上是一系列算法:SHA-0、SHA-1、SHA-2和SHA-3。

8. 局部敏感的散列算法

SHA还有一个重要特征,那就是局部不敏感的。假设你有一个字符串,并计算了其散列值。
在这里插入图片描述
如果你修改其中的一个字符,再计算其散列值,结果将截然不同!
在这里插入图片描述
这很好,让攻击者无法通过比较散列值是否类似来破解密码。

有时候,你希望结果相反,即希望散列函数是局部敏感的。在这种情况下,可使用Simhash。如果你对字符串做细微的修改,Simhash生成的散列值也只存在细微的差别。这让你能够通过比较散列值来判断两个字符串的相似程度。

9. Diffie-Hellman 密钥交换

Diffie-Hellman算法解决了如下两个问题:

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

Diffie-Hellman使用两个密钥:公钥和私钥。顾名思义,公钥就是公开的,可将其发布到网站上,通过电子邮件发送给朋友,或使用其他任何方式来发布。你不必将它藏着掖着。有人要向你发送消息时,他使用公钥对其进行加密。加密后的消息只有使用私钥才能解密。只要只有你知道私钥,就只有你才能解密消息!

Diffie-Hellman算法及其替代者RSA依然被广泛使用。

10. 线性规划

线性规划用于在给定约束条件下最大限度地改善指定的指标

例如,假设你所在的公司生产两种产品:衬衫和手提袋。衬衫每件利润2美元,需要消耗1米布料和5粒扣子;手提袋每个利润3美元,需要消耗2米布料和2粒扣子。你有11米布料和20粒扣子,为最大限度地提高利润,该生产多少件衬衫、多少个手提袋呢?在这个例子中,目标是利润最大化,而约束条件是拥有的原材料数量。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值