【算法】扩展算法介绍

扩展算法

二叉查找树(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算法

 

posted @ 2018-08-31 11:49  LiliP  阅读(786)  评论(0编辑  收藏  举报