《算法图解》
余欲与鱼语渔
纸得终潜,绝需躬行。
主要是做笔记,分享是其次。有问题欢迎讨论~
展开
-
笔记:《算法图解》第五章:散列函数、散列表(字典)
数组和链表都被直接映射到内存,但散列表更复杂,它使用散列函数来确定元素的存储位置。如果你将已投票者的姓名存储在列表中,这个函数的速度终将变得非常慢,因为它必须使用简单查找搜索整个列表。但这里将它们存储在了散列表中,而散列表让你能够迅速知道来投票的人是否投过票。使用散列表来检查是否重复,速度非常快。缓存是一种常用的加速方式,所有大型网站都使用缓存,而缓存的数据则存储在散列表中!散列表适合用于...原创 2020-05-10 22:02:10 · 452 阅读 · 0 评论 -
笔记:《算法图解》第十章:K最近邻算法(KNN算法)——分类、回归
KNN用于分类和回归,需要考虑最近的邻居:❑ 分类就是编组;❑ 回归就是预测结果(如一个数字)。特征抽取特征抽取意味着将物品(如水果或用户)转换为一系列可比较的数字。在挑选合适的特征方面,没有放之四海皆准的法则,你必须考虑到各种需要考虑的因素。使用KNN时,挑选合适的特征进行比较至关重要。所谓合适的特征,就是:❑ 与要推荐的电影紧密相关的特征;❑ 不偏不倚的特征(例如,如果只让用户给...原创 2020-05-10 21:14:18 · 593 阅读 · 0 评论 -
笔记:《算法图解》第九章:动态规划——在给定约束条件下优化某种指标
动态规划需要在给定约束条件下优化某种指标时,动态规划很有用。动态规划先解决子问题,再逐步解决大问题。问题可分解为离散子问题时,可使用动态规划来解决。在动态规划中,你要将某个指标最大化。动态规划功能强大,它能够解决子问题并使用这些答案来解决大问题。但仅当每个子问题都是离散的,即不依赖于其他子问题时,动态规划才管用。这意味着使用动态规划算法解决不了去巴黎玩的问题。❑ 动态规划可帮助你在给定约...原创 2020-05-10 20:49:30 · 2219 阅读 · 0 评论 -
笔记:《算法图解》第八章:NP完全问题、近似算法之贪婪算法
1.NP完全问题(Non-deterministic Polynomial Complete)NP完全问题(多项式复杂程度的非确定性问题)的简单定义是,以难解著称,没有快速算法的问题,如旅行商问题和集合覆盖问题。要判断问题是不是NP完全问题很难,易于解决的问题和NP完全问题的差别通常很小。为避免浪费时间去寻找解决它们的快速算法,如何识别NP完全问题:❑ 元素较少时算法的运行速度非常快,但随...原创 2020-05-10 11:03:11 · 1984 阅读 · 1 评论 -
笔记:《算法图解》第七章:狄克斯特拉算法——用于加权图的算法
1.狄克斯特拉算法(Dijkstra’s algorithm)——用于加权图的算法狄克斯特拉算法用于每条边都有关联数字的图,这些数字称为权重(weight)。带权重的图称为加权图(weighted graph),不带权重的图称为非加权图(unweighted graph)。❑ 广度优先搜索用于在非加权图中查找最短路径。❑ 狄克斯特拉算法用于在加权图中查找最短路径。在无向图中,每条边都是一...原创 2020-05-10 10:46:27 · 324 阅读 · 0 评论 -
笔记:《算法图解》第六章:图、队列、广度优先搜索
1.广度优先搜索(breadth-first search, BFS)解决最短路径问题的算法被称为广度优先搜索。1.图图模拟一组连接。用于模拟不同的东西是如何相连的。图由节点(node)和边(edge)组成。一个节点可能与众多节点直接相连,这些节点被称为邻居。2.广度优先搜索面临类似于寻找最短路径的问题时,可尝试使用图来建立模型,再使用广度优先搜索来解决问题。广度优先搜索是一种用于图的...原创 2020-05-10 10:27:24 · 313 阅读 · 0 评论 -
笔记:《算法图解》第四章:D&C算法、快速排序
1.分而治之的算法(Devide and Conquer)——将问题逐步分解D&C算法是递归的,使用D&C解决问题的过程包括两个步骤:(1) 找出基线条件,这种条件必须尽可能简单。(2) 不断将问题分解(或者说缩小规模),直到符合基线条件。提示:**编写涉及数组的递归函数时,基线条件通常是数组为空或只包含一个元素。**陷入困境时,请检查基线条件是不是这样的。D&C...原创 2020-04-19 21:16:16 · 633 阅读 · 0 评论 -
笔记:《算法图解》第三章:递归、栈
1.递归递归指的是调用自己的函数。1.1 递归与循环:如果使用循环,程序的性能可能更高;如果使用递归,程 序可能更容易理解。如何选择要看什么对你来说更重要。1.2 递归函数常见难点:由于递归函数调用自己,因此编写这样的函数时很容易出错,进而导致无限循环。编写递归函数时,必须告诉它何时停止递归。正因为如此,每个递归函数都有两个条件:基线条件(basecase)和递归条件(recursive...原创 2020-04-19 20:15:18 · 478 阅读 · 0 评论 -
笔记:《算法图解》第二章:数组、链表、选择排序
1.链表与数组1.1定义需要存储多个元素时,可使用数组或链表。数组链表定义数组的元素都在一起,使用数组意味着所有数据在内存中都是相连的,数组的元素带编号,编号从0开始。添加新元素在数组中添加新元素也可能很麻烦。如果没有了空间,就得移到内存的其他地方,因此添加新元素的速度会很慢。一种解决之道是“预留座位”:即便当前只有3个待办事项,也请计算机提供10个位置,以防需...原创 2020-04-19 19:16:17 · 316 阅读 · 0 评论 -
笔记:《算法图解》第一章:二分查找、大O表示法
1. 二分查找二分查找是一种算法,其输入是一个有序的元素列表。如果要查找的元素包含在列表中,二分查找返回其位置;否则返回None。二分查找的速度比简单查找快得多。#二分查找函数代码def binary_search(mylist,item): '''传入列表与需要查找的值''' low = 0 #最低位索引 high = len(mylist)-1 #最高位索引 w...原创 2020-04-08 23:10:44 · 381 阅读 · 0 评论