zoukankan      html  css  js  c++  java
  • 《图解算法》读书笔记(十一) 接下来如何做

    章节内容

    • 概述本书未介绍的10种算法
    • 根据兴趣选择接下来要阅读的内容

    第一章的二分查找中,虽然查找速度快,但是每次插入元素都要排序,因为二分查找仅在数组有序时有效。
    为此,有人设计了一种名为二叉查找树的数据结构。
    二叉查找树中的每个节点逗比左子节点大,比右子节点小。
    二叉查找树的插入和删除都很快,但是在最糟的情况下,需要时间为0(N)。
    为此,又有人设计了平衡树、红黑树、B树等数据结构。

    反向索引

    搜索引擎的工作原理就是反向索引。
    反向索引中使用的数据结构就是散列表。
    搜索引擎中将网页的内容根据分词系统拆分成一个个单词,再把这些单词映射到这个网页的地址。这就是反向索引。

    傅里叶变换

    傅里叶变换非常适合用于处理信号,通常用于处理音频和图像。
    傅里叶变换可以将信号中的频率进行分解,强化我们关心的部分。

    并行算法

    算法的时间复杂度是有上限的,如果我们只在一个处理器处理排序算法,目前已知的最快时间复杂度为O(nlogn)。
    但其实我们可以用多核处理器进行同时处理,平摊这O(nlogn)的工作量。
    但其实并行算法还需要一些其他开销,并不是处理器越多时间越少,原因有以下两个:

    1. 并行性管理开销
      如果两个处理器处理一个数组的排序,虽然每个处理器只需要处理一半的数组元素。但是我们还需要将排好序的两个数组在进行合并成一个有序的数组,这也需要时间
    2. 负载均衡
      我们需要平均每个处理器的工作,让所有处理器的处理时间都差不多,不会产生浪费。这在分布式系统中很常见。

    MapReduce

    MapRecuce是一种特殊的并行算法,它就是分布式算法。

    分布式算法为何很有用

    我们用的RMDB数据库比如Mysql在单表数量达到千万级别的时候查询速度明显变慢,处理复杂的查询更是吃力。
    这是用我们可以选择使用Hadoop来使用MapReduce
    MapReduce是基于两个简单的理念:映射map函数和归并reduce函数

    布隆过滤器和HyperLogLog

    我们前面说过检查数据是否重复可以用散列表,但如果是海量数据,这个散列表将非常大,需要大量的存储空间。为此我们需要创造性的解决方案。

    布隆过滤器

    布隆过滤器是一种概率性数据结构,存在一定的误差。
    布隆过滤器的有点在于占用的存储很少

    HyperLogLog

    HyperLogLog是一种类似于布隆过滤器的算法。
    HyperLogLog占用的空间更少,误差率可能更大一点。

    SHA算法

    我们之前学习散列表的时候说散列表需要一个好的散列函数,SHA算法就是一个好的散列算法。

    比较文件

    可以使用SHA来判断两个文件是否相同。

    检查密码

    数据库中存储的密码其实都是通过函数加密的,SHA算法是其中最常用的一种。
    PS:当前最安全的密码散列函数是bcrypt

    局部敏感的散列算法

    SHA算法对两个基本一样的字符串进行计算后,得到的值是完全不一样的。
    有时候我们需要散列函数是局部敏感的,这时候可以使用Simhash

    Diffie-Hellman密钥交换

    Diffie-Hellman算法解决了如何对消息进行加密。
    算法使用了两个密钥,公钥和私钥。

    线性规划

    线性规划使用Simplex算法。图算法只是线性规划的一个子集。

  • 相关阅读:
    部署kube-prometheus,添加邮件报警
    kubernetes1.8开启swagger-ui
    使用alien命令让deb包和rpm包互相转换
    debian开启cgroup memory子系统
    debian9使用systemd部署etcd集群
    装饰器
    mysql根据经纬度求两地距离
    使用rem编写自适应屏幕网页造成div被span撑高的解决办法
    java绘图合并图像AlphaComposite模式测试
    spring data jpa查询部分字段、多余附加字段
  • 原文地址:https://www.cnblogs.com/prelude1214/p/13654445.html
Copyright © 2011-2022 走看看