算法图解读后感(理解概念)贪婪算法动态规划K最近邻算法 其他有用的算法

Posted halulu.me

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法图解读后感(理解概念)贪婪算法动态规划K最近邻算法 其他有用的算法相关的知识,希望对你有一定的参考价值。

第八节、贪婪算法与NP完全问题

贪婪算法很简单:每步都采取最优的做法。用专业术语说,就是你每步都选择局部最优解,最终得到的就是全局最优解。
贪婪并非在任何情况下都适用,比如背包问题
贪婪算法易于实现、运行速度快,是不错的近似算法。

集合覆盖问题只能使用贪婪算法。
步骤一、选出覆盖最多未覆盖元素的子集,即便这个子集覆盖了一些已经覆盖的元素也没有关系
步骤二、重复第一步,直到覆盖了所有的元素
大O表示法,O(n^2)
幂集(power set) 集合A(有n个数)的子集的数量是 2^n ,也就是幂集。

NP完全问题

NP完全问题的简单定义是,以难解著称的问题,如旅行商问题和集合覆盖问题。很多非常聪明的人都认为,根本不可能编写出可快速解决这些问题的算法。(使用近似算法即可)
比如、集合覆盖问题和旅行商问题

在这里插入图片描述

NP完全问题旅行商问题和最短路径狄克斯特拉算法之间的区别

最短路径狄克斯特拉算法的起点和终点是确定的,旅行商问题的起点和终点是不确定的。


第九节、动态规划

背包问题
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

假设你在杂货店行窃,可偷成袋的扁豆和大米,但如果整袋装不下,可打开包装,再将背包倒满。在这种情况下,不再是要么偷要么不偷,而是可偷商品的一部分。如何使用动态规划来处理这种情形呢?
答案是没法处理。使用动态规划时,要么考虑拿走整件商品,要么考虑不拿,而没法判断该不该拿走商品的一部分。
但使用贪婪算法可轻松地处理这种情况!首先,尽可能多地拿价值最高的商品;如果拿光了,再尽可能多地拿价值次高的商品,以此类推。

注意:

1、使用动态规划,要么考虑拿走整件商品,要么不拿,而没办法判断该不该拿走商品的一部分。
2、动态规划功能强大,它能够解决子问题并使用这些答案来解决大问题。但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用。
3、最有解可能导致背包每装满。

最长公共子串

例子、比较fish和hish的最长公共子串

在这里插入图片描述
在这里插入图片描述在这里插入图片描述

在这里插入图片描述

需要注意的一点是,这个问题的最终答案并不在最后一个单元格中!对于前面的背包问题,
最终答案总是在最后的单元格中。但对于最长公共子串问题,答案为网格中最大的数字——它可 能并不位于最后的单元格中。

最长公共子序列

最长公共子串和最长公共子序列的区别
最长公共子串比较的是连续子串数量
在这里插入图片描述

最长公共子序列比较的都有的序列中包含的元素的数量

继承上次计算的最长公共子串
在这里插入图片描述在这里插入图片描述在这里插入图片描述


第十节、K最近邻算法

K最近邻(k-nearest neighbours,KNN)算法

分类算法
建立坐标,使用毕达哥拉斯公式计算方位距离
在这里插入图片描述在这里插入图片描述

在这里插入图片描述在这里插入图片描述
在这里插入图片描述

回归

在这里插入图片描述

机器学习简介

机器学习旨在让计算机更聪明。

OCR

OCR指的是光学字符识别(optical character
recognition),这意味着你可拍摄印刷页面的照片,计算机将自动识别出其中的文字。

在这里插入图片描述

创建垃圾邮件过滤器
在这里插入图片描述


第十一节、其他有用的算法

1、反向索引
在这里插入图片描述
2、傅里叶变换

在这里插入图片描述

3、并行算法

在这里插入图片描述

4、分布式算法

MapReduce是一种流行的分布式算法,你可通过流行的开源工具Apache Hadoop来使用它

在这里插入图片描述
映射函数

在这里插入图片描述在这里插入图片描述

归并函数
在这里插入图片描述在这里插入图片描述

5、布隆过滤器和 HyperLogLog

布隆过滤器是一种概率型数据结构,它提供的答案有可能不对,
但很可能是正确的。为判断网页以前是否已搜集,可不使用散列表,而使用布隆过滤器。使用散列表时,答案绝对可靠,而使用布隆过滤器时,答案却是很可能是正确的。
但是使用散列表的时候,如果数据量特别大,散列表需要占用大量的存储空间

布隆过滤器

1、可能出现错报的情况,即Google可能指出“这个网站已搜集”,但实际上并没有搜集。
2、不可能出现漏报的情况,即如果布隆过滤器说“这个网站未搜集”,就肯定未搜集。

HyperLogLog

HyperLogLog是一种类似于布隆过滤器的算法。

面临海量数据且只要求答案八九不离十时,可考虑使用概率型算法!

6、SHA算法

安全散列算法(secure hash algorithm,SHA)给定一个字符串,SHA返回其散列值。
用于创建散列表的散列函数根据字符串生成数组索引,而SHA根据字符串生成另一个字符串。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

SHA实际上是一系列算法:SHA-0、SHA-1、SHA-2和SHA-3。,SHA-0和SHA-1已被发现存在一些缺陷。如果你要使用SHA算法来计算密码的散列值,请使用SHA-2或SHA-3。当前,最安全的密码散列函数是bcrypt,但没有任何东西是万无一失的。

7、局部敏感的散列算法Simhash

SHA还有一个重要特征,那就是局部不敏感的。假设你有一个字符串,并计算了其散列值。如果你修改其中的一个字符,再计算其散列值,结果将截然不同!

如果你对字符串做细微的修改,Simhash生成的散列值也只存在细微的差别。这让你能够通过比较散列值来判断两个字符串的相似程度,这很有用!

在这里插入图片描述

8、Diffie-Hellman 密钥交换

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

以上是关于算法图解读后感(理解概念)贪婪算法动态规划K最近邻算法 其他有用的算法的主要内容,如果未能解决你的问题,请参考以下文章

《算法图解》[美] Aditya Bhargava(作者)epub+mobi

算法作业13——《算法图解》读书笔记

动态规划与贪婪算法

K-近邻算法简介

k-近邻算法理解

算法学习五个常用算法概念了解