Python算法入门
文章平均质量分 63
一些简单的Python算法,可用来熟悉Python语言特性。
NumLock桌
这个作者很懒,什么都没留下…
展开
-
递归——一种解决问题的优雅方法
循环和递归通常是解决问题的两种方法。很多问题都可以使用循环来完成,并且它的使用也很容易。但是,在面对问题的时候,或许我们可以考虑另一种优雅的解决问题的方法——递归。在某些问题上,递归虽然没有明显的性能优势,但可以给我们提供更清晰的解决问题的思路。下面我们对递归这种方法做一些简单的讨论。基线条件与递归条件递归很容易理解——就是一个函数调用自己。我们举个例子:def count(i): ...原创 2020-02-11 12:45:02 · 290 阅读 · 0 评论 -
字典背后是什么:散列表机制
0. 我们需要新工具在前面,我们学习了两种查找算法:顺序查找和二分查找(实际上是一种——顺序查找每个人都会用)。但假如我们是售货员,客人问我们某件商品的价格时,我们可能不想用这两种算法去查找价格——即使二分查找很快。我们希望客人报出商品时,我们立马能给出一个对应的价格(客人也希望如此)。为了实现我们的想法,我们需要新的工具:散列函数。1. 散列函数的作用:如何构建散列表散列函数是将输入映射...原创 2020-02-12 17:33:45 · 209 阅读 · 0 评论 -
背包问题与动态规划
我们在介绍贪婪算法时,曾提到过背包问题,并且我们也使用了贪婪算法找到了一个近似解。那么,我们能不能找到最优解呢?让我们先来看看这个问题:小偷有一个4公斤重的背包,他可盗窃的商品有商品价格重量音响3000元4公斤笔记本电脑2000元3公斤吉他1500元1公斤如何让盗窃的商品价值最高?为了寻找最优解,我们当然可以使用列出所有的商品组合,然后找...原创 2020-02-16 12:09:31 · 157 阅读 · 0 评论 -
二分查找以及大O表示法|Python实现
1. 二分查找简介不论是学习Python还是学习C语言,甚至是学习Matlab的时候,我都遇到过一个叫“猜数字”的题目。其实,这个问题就是一个查找问题,而解决它的最好办法就是我们都使用过的二分查找。仔细想想,不论是猜数字,还是猜字母,这类游戏的特点就是我们要查找的序列是有序的。在这种有序的序列上应用二分查找可以大大缩短查找时间。2. 二分查找的代码实现我们首先实现二分查找,def bin...原创 2020-02-08 17:40:53 · 174 阅读 · 0 评论 -
选择排序以及数组和链表|Python实现
0. 关于内存的Python小特点:内存就像是一些有编号的抽屉,你在使用这个抽屉时,管理抽屉的人会给你抽屉的编号,使用编号就可以放东西、取走东西或者简单的看看抽屉里东西的信息。在Python中,一个代码块内值相同的不可变类型,其内存值都是相同的。我们通过下面这些代码可以简单了解这种机制:>>> a = 10>>> b = 10>>> ...原创 2020-02-09 12:40:51 · 192 阅读 · 0 评论 -
加权图与狄克斯特拉算法|Python实现
在前面,我们讨论了图与广度优先搜索,解决了一个“找朋友”的问题。现在,让我们想一想,我们把问题换成了“找地方”——我们想从一个地方到达另一个地方,也按照最短路径到达——这样的问题中,我们使用图来建立模型时,会发现连接——也就是两个地方之间的路——是有权重,或者说长度的。这种情况下,广度优先搜索就不起作用了——它只能保证我们找到走过最少的连接数,而没有考虑这些连接有长度的情况。下面我们来考虑这个问...原创 2020-02-14 17:39:38 · 580 阅读 · 0 评论 -
如何分土地:欧几里得算法的证明
1. 如何分土地有这样一个问题:如何把一块1680×640的土地均匀的分成正方形,并且保证分出的正方形面积是最大的?思考一下,这个问题其实可以转变为一个我们十分熟悉的问题:求1680与640的最大公约数。当土地可以被分成正方形时,正方形的小土地边长一定是被划分的大土地两条边的公约数,这样就很明白了。在高中课程中我们就明白可以通过所谓的“辗转相除法”求得这个值,但是现在我们了解了一些的编程的概...原创 2020-02-11 19:39:13 · 845 阅读 · 0 评论 -
D&C与快速排序|Python实现
1. D&C:分而治之我们曾经在证明欧几里得算法的正确性时提出过一个可以抽象并用欧几里得算法解决的问题——分土地的问题。现在,我们从一个更加直观的角度来看看如何解决这个问题。在拿到一块1680×640的土地时,我们想要把它平均划分成正方形,并且试图保证正方形面积最大。我们首先将土地划分出最大的正方形,可以画出两块640×640的土地,剩下一块400×640的土地。之后我们对剩下的小长方...原创 2020-02-11 21:22:57 · 219 阅读 · 0 评论 -
快速排序的运行时间|大O表示法与Python实现的对比
我们之前在讨论快速排序时曾给出五种常见的运行时间:O(log n) —— 二分查找O(n) —— 顺序查找O(n log n ) —— 合并排序O(n^2) —— 选择排序O(n !) —— 旅行商问题对于我们要讨论的快速排序,其运行时间与基准值的选择有关。在最坏的情况下,快速排序与选择排序一样慢,运行时间是O(n^2)。但是,快速排序的平均运行时间却和合并排序一样块,为O(n ...原创 2020-02-12 11:32:23 · 872 阅读 · 0 评论 -
图与广度优先搜索|Python实现
1. 图的简介简单来说,图由节点和边组成,用来模拟不同的东西之间连接的方式。边1边2边3节点a节点b节点c节点d上面的图片直观的演示了一种简单的“图”。其中,节点a和节点b直接相连,互称为“邻居”。我们前面学习过的数据结构都是线性的,可以“一条路走完”,在进行查找的时候只需要考虑现在位置的元素是不是我们要找的元素,而不需要考虑下一步的走法。但是在图这种数据结构中,这种查找方法显然不可行—...原创 2020-02-13 18:07:39 · 340 阅读 · 0 评论 -
NP完全问题与近似算法:贪婪策略|Python实现
1. 集合覆盖问题假设我们创建了一个自己的电台,希望让整个市区的人都可以听到我们的节目。然而,这个城市有许多不同的广播公司,购买它们服务的电台可以让自己的节目覆盖某一块区域,并且这些区域常常是重叠的——这样,我们就面临 一个问题:如何找出可以覆盖全市的最少的广播台集合?我们使用一个简单的方法就可以得到完美的答案:列出所有的广播台集合;从这些集合中选择满足要求且最小的集合。我们来考察一...原创 2020-02-15 21:42:09 · 1770 阅读 · 0 评论 -
K最近邻算法
1. 关于这个系列这一系列笔记是我对下面这本书的阅读笔记:虽然里面的内容看起来很简单,但是我想,想要读懂的话至少还是需要大致了解一点相关知识的。我们从二分查找到选择排序,再到递归与快速排序,之后又了解了散列表与广度优先搜索,并且我们还了解了狄克斯特拉算法与贪婪算法、简单介绍了动态规划。之后,我们将了解K最近邻算法,之后简单介绍一些其他的算法,为进一步的学习做做铺垫。我们的这一系列文章几乎完全...原创 2020-02-16 17:53:21 · 333 阅读 · 0 评论 -
十种值得了解的算法简介
1. 二叉查找树我们曾经介绍过二分查找。在有序的数组中,二分查找是十分快速的,但当我们想新增几个元素时,我们就必须对新的序列进行排序——这使得插入操作变得很慢。为了解决这个问题,我们设计了一种新的数据结构:二叉查找树(binary search tree)。二叉查找树类似这样:DavidAditManningMaggieMike对于每个节点,左子节点都要小于它,而右子节点都要大于它。我们可...原创 2020-02-17 18:21:11 · 577 阅读 · 0 评论