读书笔记:图解算法

读书笔记:图解算法

算法简介

二分查找 O(log n)

大O表示法

大O表示法 让你能够比较操作数,它指出了算法运行时间的增速

大O表示法 指出了最糟糕情况下的运行时间

下面按从快到慢的顺序列出了你经常会遇到的5种大O运行时间。

 O(log n),也叫对数时间,这样的算法包括二分查找。

 O(n),也叫线性时间,这样的算法包括简单查找。

 O(n * log n),这样的算法包括第4章将介绍的快速排序——一种速度较>快的排序算法。

 O(n 2 ),这样的算法包括第2章将介绍的选择排序——一种速度较慢的排序算法。

 O(n!),这样的算法包括接下来将介绍的旅行商问题的解决方案——一种非常慢的算法

 算法的速度指的并非时间,而是操作数的增速。

选择排序 O( n^2 )

先找最大,再找第二大…

数组和链表

数组: 内存中连续

链表: 随机

快速排序

O(n log n)

递归

两部分:基线条件(不在调用自己)、递归条件(调用自己)

快速排序

分而治之(divide and conquer,D&C)

这里重申一下D&C的工作原理:

(1) 找出简单的基线条件;

(2) 确定如何缩小问题的规模,使其符合基线条件。

[图片上传失败…(image-7e1b17-1515037467104)]

[图片上传失败…(image-46af14-1515037467104)]

散列表

散列函数

冲突

 较低的填装因子;散列包含的元素数/位置总数

 良好的散列函数。

广度优先搜索

breadth-first search,BFS 广度优先搜索:一种图算法

图由节点(node)和边(edge)组成。

 第一类问题:从节点A出发,有前往节点B的路径吗?

 第二类问题:从节点A出发,前往节点B的哪条路径最短?

队列

队列是一种先进先出(First In First Out,FIFO)的数据结构,而栈是一种后进先出(Last In

First Out,LIFO)的数据结构。

有向图(directed graph),其中的关系是单向的。

无向图(undirected graph)没有箭头,直接相连的节点互为邻居

如果任务A依赖于任务B,在列表中任务A就必须在任务B后面。这被称为拓扑排序,使用它可根据图创建一个有序列表。

树是一种特殊的图,其中没有往后指的边。

狄克斯特拉算法


狄克斯特拉算法包含4个步骤。

(1) 找出“最便宜”的节点,即可在最短时间内到达的节点。

(2) 更新该节点的邻居的开销,其含义将稍后介绍。

(3) 重复这个过程,直到对图中的每个节点都这样做了。

(4) 计算最终路径。

边 有权

带权重的图称为加权图(weighted graph),不带权重的图称为非加权图(unweighted graph)

狄克斯特拉算法只适用于有向无环图(directed acyclic graph,DAG)。

不能将狄克斯特拉算法用于包含负权边的图

在包含负权边的图中,要找出最短路径,可使用另一种算法——贝尔曼福德算法(Bellman-Ford algorithm)

贪婪算法

旅行商问题和集合覆盖问题有一些共同之处:你需要计算所有的解,并从中选出最小/最短

的那个。这两个问题都属于NP完全问题。

NP完全问题特点

 元素较少时算法的运行速度非常快,但随着元素数量的增加,速度会变得非常慢。

 涉及“所有组合”的问题通常是NP完全问题。

 不能将问题分成小问题,必须考虑各种可能的情况。这可能是NP完全问题。

 如果问题涉及序列(如旅行商问题中的城市序列)且难以解决,它可能就是NP完全问题。

 如果问题涉及集合(如广播台集合)且难以解决,它可能就是NP完全问题。

 如果问题可转换为集合覆盖问题或旅行商问题,那它肯定是NP完全问题。

动态规划

但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用

最长公共子序列:两个单词中都有的序列包含的字母数

K最近邻算法

使用KNN来做两项基本工作——分类和回归:

 分类就是编组;

 回归就是预测结果(如一个数字)

总结

 KNN用于分类和回归,需要考虑最近的邻居。

 分类就是编组。

 回归就是预测结果(如数字)。

 特征抽取意味着将物品(如水果或用户)转换为一系列可比较的数字。

 能否挑选合适的特征事关KNN算法的成败

MapReduce

映射( map )函数和归并( reduce )函数

布隆过滤器:

可能出现错报的情况,即Google可能指出“这个网站已搜集”,但实际上并没有搜集。

不可能出现漏报的情况,即如果布隆过滤器说“这个网站未搜集”,就肯定未搜集。

局部不敏感 SHA 局部改变整体改变(不会区分是否是局部的变化)

局部敏感 Simhash 局部改变整体细微变化(会区分是否是局部的变化)

Diffie-Hellman算法及其替代者RSA

    原文作者:炒饭大师
    原文地址: https://www.jianshu.com/p/84f477759adb
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞