算法图解读后感(理解概念)贪婪算法、动态规划、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依然被广泛使用。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

halulu.me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值