对于一个经常需要进行修改的有序对象来说,数组不是一个好的选择,因为它的插入和删除太耗时了,同时可能还需要常常重新排序。为此,有人设计了二叉查找树(binary search tree),一种将新的数据直接有序插入的数据结构。
对于二叉查找树而言,其中的每一个节点,左子节点的值都比它小,而右子节点的值都比它大。相比于数组而言,它的插入和删除操作快的多。但它也有一个缺点,即不能随机访问,如不能以第几个元素的形式来访问。
另外还有很多有趣的树的结构,如:B树,红黑树,堆,伸展树等。
树是一种非常常见且常用的数据结构,必须被良好的掌握。
反向索引(inverted index)常用于搜索引擎之中。它是一种以散列表构建的数据结构。
反向索引可以根据网页中包含的特定内容来映射它的网址。如"google":www.google.cn
,包含"google"
字符串的网址有www.google.cn
等,这样的形式。
傅里叶变换可以将一个对象根据频率分解为多个不同的成分(自己的理解)。由于它的特性,傅里叶变换的应用极其广泛,如它可以将歌曲分解为不同的频率部分,就可以强化关心的部分,抑制不关心的部分,如强化低音并隐藏高音等。另外,傅里叶变换也非常适合用于处理信号,可以用来压缩音乐。为此,首先需要将音频文件分解为音符。傅里叶变换能够准确地指出各个音符对整个歌曲的贡献,让你能够将不重要的音符删除。这就是MP3格式的工作原理!
数字信号不只有音乐一种,图像也是,JPG用的也是同样的压缩原理。
单核处理现在已经越来越难以满足数据的增长,因此需要使用并行算法来进行多核心的同时处理,来提高计算的效率。
并行算法可以通过多核心加速处理的进程,但并不是线性增加的,原因如下:
分布式算法是现在越来越流行的并行算法。它可以令算法在多台计算机上运行。其中MapReduce是一种流行的分布式算法,在Hadoop平台上运行。
身处大数据时代,单机很难处理巨量的数据,但可以通过MapReduce来帮忙用多台计算机同时处理。
分布式算法非常适合用于在短时间内完成海量工作,其中的MapReduce基于两个简单的理念:映射(map)函数和归并(reduce)函数。
映射指的就是将一个巨大的任务分配给许多计算机来同时运行。
归并指的就是将这些任务的结果归并重新呈现成一个结果。
将一个任务分成许多小任务,映射给多台计算机进行处理,最后将多台计算机的小结果归并成一个结果。这就是MapReduce。
给定一个元素,需要判断它是否在一个集合中。为了快速的得到结果,可以使用散列表。但当集合中的数据非常庞大时,需要占用大量的空间。对于GOOGLE这样的需要存储大量的URL的公司而言,新的URL是否已被存储的判断将十分困难,因为它已经保存了大量的URL。这时候可以使用布隆过滤器。
布隆过滤器是一种概率型数据结构,它提供的答案可能不对,但很可能是正确的。它可能会出现误报,但绝不会漏报。即它说该元素不在这个集合中,就一定不在这个集合中。
布隆过滤器的优点在于它占用的存储空间很小,在集合中元素过多的情况下,使用布隆过滤器是一种有效的选择。布隆过滤器非常适用于不要求答案绝对准确的情况。
HyperLogLog是一种类似于布隆过滤器的算法。它用于判断日志文件是否已被记录。它同样不能提供绝对准确的解答,但能够大量减小占用的空间,并提供很可能正确的解答。
面临海量数据且只要求答案八九不离十时,可考虑使用概率型算法!
SHA(secure hash algorithm)算法可以计算输入对象的hash值。对于不同的对象,它会生成不同的hash值。
根据这个特性,可以将SHA算法用于判断两个文件是否相同,也可以用于验证密码是否正确。使用SHA算法验证密码时,就可以不用将密码明文保存在数据库中了,而是保存其hash值。这样可以有效地保护用户密码的安全。因为SHA是不能由hash值反向推导其索引的对象的。
SHA算法有一个重要的特征是其对局部不敏感。假设你有一个字符串,并计算了其散列值。如果你修改其中的一个字符,再计算其散列值,结果将截然不同!
这样的特性使得人们无法通过比较散列值是否类似来破解密码。
有时候,你希望结果相反,即希望散列函数是局部敏感的。在这种情况下,可使用Simhash。如果你对字符串做细微的修改,Simhash生成的散列值也只存在细微的差别。
需要检查两项内容的相似程度时,Simhash很有用。
Diffie-Hellman 密钥交换是一种加密算法,它使用两个密钥:公钥和私钥。
一个用户的公钥是对外公开的,而其私钥是只有自己知道的。这样的情况下,其他人向他发消息需要使用公钥加密。而加密过后的密文,只有该用户的私钥才能进行解密。这样就好处是:
RSA算法是Diffie-Hellman 密钥交换的替代者。
所有的图算法都可
使用线性规划来实现。线性规划是一个宽泛得多的框架,图问题只是其中的一个子集。
线性规划使用Simplex算法。