Python版数据结构与算法课程
亥虫
做人如果没有梦想,那跟咸鱼有什么差别
展开
-
数据结构与算法(Python版)六十:图的应用(词梯问题)
词梯Word Ladder问题由 “ 爱 丽 丝 漫 游 奇 境 ” 的 作 者 LewisCarroll在1878年所发明的单词游戏从一个单词演变到另一个单词, 其中的过程可以经过多个中间单词要求是相邻两个单词之间差异只能是1个字母,如FOOL变SAGE:FOOL >> POOL >> POLL >> POLE >> PALE>> SALE >> SAGE我们的目标是找到最短的单词变换序列采用图来解决这个问题的步骤如下:原创 2020-07-03 16:17:43 · 1454 阅读 · 2 评论 -
数据结构与算法(Python版)五十九:图抽象数据类型的Python实现
ADT Graph的实现:实例ADT Graph的实现:顶点Vertex类Vertex包含了顶点信息, 以及顶点连接边信息class Vertex: def __init__(self, key): self.id = key self.connectedTo = {} def addNeighbor(self, nbr, weight=0): # nbr是顶点对象的key self.connectedTo[nbr]原创 2020-07-03 15:01:13 · 644 阅读 · 0 评论 -
数据结构与算法(Python版)五十八:图抽象数据类型
抽象数据类型: ADT Graph抽象数据类型ADT Graph定义如下:Graph():创建一个空的图;addVertex(vert):将顶点vert加入图中addEdge(fromVert, toVert):添加有向边addEdge(fromVert, toVert, weight):添加带权的有向边getVertex(vKey):查找名称为vKey的顶点getVertices():返回图中所有顶点列表in:按照vert in graph的语句形式,返回顶点是否存在图中True/Fal原创 2020-07-03 12:06:53 · 604 阅读 · 0 评论 -
数据结构与算法(Python版)五十七:图的基本概念及相关术语
图Graph的概念图Graph是比树更为一般的结构, 也是由节点和边构成实际上树是一种具有特殊性质的图图可以用来表示现实世界中很多事物道路交通系统、航班线路、互联网连接、或者是大学中课程的先修次序 一旦我们对图相关问题进行了准确的描述就可以采用处理图的标准算法来解决那些看起来很艰深的问题对于人来说,人脑的识别模式能够轻而易举地判断地图中不同地点的相互关联;但如果用图来表示地图,就可以解决很多地图专家才能解决的问题,甚至远远超越;互联网是由成千上万的计算机所连接起来的复杂网络,也可原创 2020-07-03 11:50:47 · 348 阅读 · 0 评论 -
数据结构与算法(Python版)五十六:树结构小结
本章总结本章介绍了“树”数据结构, 我们讨论了如下算法:用于表达式解析和求值的二叉树用于实现ADT Map的二叉查找树BST树改进了性能, 用于实现ADT Map的平衡二叉查找树AVL树实现了“最小堆”的完全二叉树: 二叉堆ADT Map的实现方法小结我们采用了多种数据结构和算法来实现ADT Map, 其时间复杂度数量级如下表所示:方法有序表散列表二叉查找树AVL树putO(n)O(1) -> O(n)O(log2n) -> O(n)O(log2原创 2020-07-03 11:03:57 · 140 阅读 · 0 评论 -
数据结构与算法(Python版)五十五:AVL树的Python实现
AVL树的Python实现既然AVL平衡树确实能够改进BST树的性能, 避免退化情形我们来看看向AVL树插入一个新key, 如何才能保持AVL树的平衡性质首先, 作为BST, 新key必定以叶节点形式插入到AVL树中叶节点的平衡因子是0, 其本身无需重新平衡但会影响其父节点的平衡因子:作为左子节点插入,则父节点平衡因子会增加1;作为右子节点插入,则父节点平衡因子会减少1。这种影响可能随着其父节点到根节点的路径一直传递上去, 直到:传递到根节点为止;或者某个父节点平衡因子被调整到0,不再影原创 2020-07-02 12:32:21 · 2490 阅读 · 2 评论 -
数据结构与算法(Python版)五十四:AVL树的定义和性能
平衡二叉查找树: AVL树的定义我们来看看能够在key插入时一直保持平衡的二叉查找树: AVL树AVL是发明者的名字缩写: G.M. AdelsonVelskii and E.M. Landis利用AVL树实现ADT Map, 基本上与BST的实现相同不同之处仅在于二叉树的生成与维护过程AVL树的实现中, 需要对每个节点跟踪“平衡因子balance factor”参数平衡因子是根据节点的左右子树的高度来定义的, 确切地说, 是左右子树高度差:balanceFactor = height(lef原创 2020-07-02 11:14:37 · 2276 阅读 · 0 评论 -
数据结构与算法(Python版)五十三:二叉查找树实现及算法分析
二叉搜索树的实现: BST.put方法put(key, val)方法:插入key构造BST首先看BST是否为空,如果一个节点都没有,那么key成为根节点root,否则,就调用一个递归函数_put(key, val, root)来放置key二叉搜索树的实现: _put辅助方法_put(key, val, currentNode)的流程如果key比currentNode小,那么_put到左子树但如果没有左子树,那么key就成为左子节点如果key比currentNode大,那么_put到右子树原创 2020-07-01 18:09:01 · 1483 阅读 · 0 评论 -
数据结构与算法(Python版)五十二:二叉查找树及操作
二叉查找树Binary Search Tree在ADT Map的实现方案中, 可以采用不同的数据结构和搜索算法来保存和查找Key, 前面已经实现了两个方案有序表数据结构+二分搜索算法,散列表数据结构+散列及冲突解决算法下面我们来试试用二叉查找树保存key,实现key的快速搜索在ADT Map的实现方案中, 可以采用不同的数据结构和搜索算法来保存和查找Key, 前面已经实现了两个方案有序表数据结构+二分搜索算法,散列表数据结构+散列及冲突解决算法下面我们来试试用二叉查找树保存key,实现key的快原创 2020-07-01 16:03:01 · 4488 阅读 · 0 评论 -
数据结构与算法(Python版)五十一:二叉堆的Python实现
二叉堆操作的实现二叉堆初始化采用一个列表来保存堆数据,其中表首下标为0的项无用,但为了后面代码可以用到简单的整数乘除法,仍保留它。class BinHeap: def __init__(self): self.heapList = [0] self.currentSize = 0insert(key)方法首先,为了保持“完全二叉树”的性质,新key应该添加到列表末尾。会有问题吗?insert(key)方法新key加在列表末尾,显然无法保持“堆”次序,原创 2020-07-01 12:48:07 · 2638 阅读 · 0 评论 -
数据结构与算法(Python版)五十:优先队列和二叉堆
优先队列Priority Queue前面我们学习了一种FIFO数据结构队列队列有一种变体称为“优先队列”。银行窗口取号排队, VIP客户可以插到队首,操作系统中执行关键任务的进程或用户特别指定,进程在调度队列中靠前优先队列的出队跟队列一样从队首出队;但在优先队列内部, 数据项的次序却是由“优先级”来确定:高优先级的数据项排在队首,而低优先级的数据项则排在后面。这样,优先队列的入队操作就比较复杂,需要将数据项根据其优先级尽量挤到队列前方。思考:有什么方案可以用来实现优先队列?出队和入队的复杂原创 2020-07-01 11:36:37 · 4142 阅读 · 0 评论 -
数据结构与算法(Python版)四十九:树的遍历
树的遍历Tree Traversals对一个数据集中的所有数据项进行访问的操作称为“遍历Traversal”线性数据结构中, 对其所有数据项的访问比较简单直接按照顺序依次进行即可树的非线性特点, 使得遍历操作较为复杂我们按照对节点访问次序的不同来区分3种遍历前序遍历(preorder):先访问根节点,再递归地前序访问左子树、最后前序访问右子树;中序遍历(inorder):先递归地中序访问左子树,再访问根节点,最后中序访问右子树;后序遍历(postorder):先递归地后序访问左子树,再后序原创 2020-06-30 18:38:02 · 1315 阅读 · 0 评论 -
数据结构与算法(Python版)四十八:树的应用(表达式解析)
树的应用:解析树(语法树)将树用于表示语言中句子, 可以分析句子的各种语法成分, 对句子的各种成分进行处理语法分析树主谓宾,定状补程序设计语言的编译词法、语法检查从语法树生成目标代码自然语言处理机器翻译、语义理解树的应用: 表达式解析我们还可以将表达式表示为树结构叶节点保存操作数,内部节点保存操作符全括号表达式((7+3)*(5-2))由于括号的存在,需要计算*的话,就必须先计算7+3和5-2,表达式层次决定计算的优先级越底层的表达式,优先级越高树中每个子树都表示一个子表达式原创 2020-06-30 17:08:39 · 1933 阅读 · 0 评论 -
数据结构与算法(Python版)四十八:树的链表实现
实现树:节点链接法同样可以用节点链接法来实现树每个节点保存根节点的数据项,以及指向左右子树的链接定义一个BinaryTree类成员key保存根节点数据项成员left/rightChild则保存指向左/右子树的引用(同样是BinaryTree对象)class BinaryTree: def __init__(self, rootObj): self.key = rootObj self.leftChild = None self.rig原创 2020-06-30 14:12:16 · 900 阅读 · 0 评论 -
数据结构与算法(Python版)四十七:树的嵌套列表实现
实现树:嵌套列表法首先我们尝试用Python List来实现二叉树树数据结构;递归的嵌套列表实现二叉树, 由具有3个元素的列表实现:第1个元素为根节点的值;第2个元素是左子树(所以也是一个列表);第3个元素是右子树(所以也是一个列表)。以右图的示例, 一个6节点的二叉树根是myTree[0],左子树myTree[1],右子树myTree[2]嵌套列表法的优点子树的结构与树相同,是一种递归数据结构,很容易扩展到多叉树,仅需要增加列表元素即可我们通过定义一系列函数来辅助操作嵌套列表原创 2020-06-30 12:19:30 · 1203 阅读 · 0 评论 -
数据结构与算法(Python版)四十六:树结构相关术语
树结构相关术语节点Node:组成树的基本部分每个节点具有名称,或“键值”,节点还可以保存额外数据项,数据项根据不同的应用而变边Edge:边是组成树的另一个基本部分每条边恰好连接两个节点,表示节点之间具有关联,边具有出入方向;每个节点(除根节点)恰有一条来自另一节点的入边;每个节点可以有多条连到其它节点的出边。根Root:树中唯一一个没有入边的节点路径Path:由边依次连接在一起的节点的有序列表如: HTML->BODY->UL->LI,是一条路径子节点Children:入原创 2020-06-29 18:31:30 · 5994 阅读 · 0 评论 -
数据结构与算法(Python版)四十五:什么是树
树的例子本章我们来讨论一种基本的“非线性”数据结构——树;树在计算机科学的各个领域中被广泛应用操作系统、图形学、数据库系统、计算机网络跟自然界中的树一样, 数据结构树也分为:根、 枝和叶等三个部分一般数据结构的图示把根放在上方,叶放在下方树的例子:生物学物种分类体系首先分类体系是层次化的树是一种分层结构,越接近顶部的层越普遍,越接近底部的层越独特界、门、纲、目、科、属、种分类树的第二个特征:一个节点的子节点与另一个节点的子节点相互之间是隔离、独立的猫属Felis和蝇属Musca下面都原创 2020-06-29 18:23:55 · 795 阅读 · 0 评论 -
数据结构与算法(Python版)四十四:排序与查找小结
本章小结在无序表或者有序表上的顺序查找, 其时间复杂度为O(n)在有序表上进行二分查找, 其最差复杂度为O(log n)散列表可以实现常数级时间的查找完美散列函数作为数据一致性校验, 应用很广区块链技术是一种去中心化的分布式数据库, 通过“工作量证明”机制来维持运行冒泡、 选择和插入排序是O(n2)的算法谢尔排序在插入排序的基础上进行了改进, 采用对递增子表排序的方法, 其时间复杂度可以在O(n)和O(n2)之间归并排序的时间复杂度是O(nlog n), 但归并的过程需要额外存储空间快速排原创 2020-06-29 18:16:52 · 4665 阅读 · 0 评论 -
数据结构与算法(Python版)四十三:映射抽象数据类型及Python实现
抽象数据类型“映射”:ADT MapPython最有用的数据类型之一“字典”字典是一种可以保存key-data键值对的数据类型其中关键码key可用于查询关联的数据值data这种键值关联的方法称为“映射Map”ADT Map的结构是键-值关联的无序集合关键码具有唯一性,通过关键码可以唯一确定一个数据值ADT Map定义的操作如下:Map():创建一个空映射,返回空映射对象;put(key, val):将key-val关联对加入映射中,如果key已存在,将val替换旧关联值;get(key原创 2020-06-29 18:04:52 · 891 阅读 · 0 评论 -
数据结构与算法(Python版)四十二:冲突解决方案
冲突解决方案如果两个数据项被散列映射到同一个槽,需要一个系统化的方法在散列表中保存第二个数据项, 这个过程称为“解决冲突”前面提到, 如果说散列函数是完美的, 那就不会有散列冲突, 但完美散列函数常常是不现实的解决散列冲突成为散列方法中很重要的一部分。解决散列的一种方法就是为冲突的数据项再找一个开放的空槽来保存最简单的就是从冲突的槽开始往后扫描,直到碰到一个空槽,如果到散列表尾部还未找到,则从首部接着扫描这种寻找空槽的技术称为“开放定址open addressing”向后逐个槽寻找的方法则是开原创 2020-06-29 17:26:45 · 892 阅读 · 0 评论 -
数据结构与算法(Python版)四十一:散列函数设计
散列函数设计:折叠法折叠法设计散列函数的基本步骤是将数据项按照位数分为若干段,再将几段数字相加,最后对散列表大小求余,得到散列值例如, 对电话号码62767255可以两位两位分为4段(62、 76、 72、 55)相加(62+76+72+55=265)散列表包括11个槽,那么就是265%11=1所以h(62767255)=1有时候折叠法还会包括一个隔数反转的步骤比如(62、 76、 72、 55)隔数反转为(62、 67、 72、 55)再累加(62+67+72+55=256)对11求原创 2020-06-29 17:13:24 · 700 阅读 · 0 评论 -
数据结构与算法(Python版)四十:区块链技术
散列函数的最酷应用:区块链技术区块链是一种分布式数据库通过网络连接的节点每个节点都保存着整个数据库所有数据任何地点存入的数据都会完成同步区块链最本质特征是“去中心化”不存在任何控制中心、协调中心节点,所有节点都是平等的, 无法被控制如何做到不需要相互信任和权威, 即可防止篡改和破坏?区块链区块链由一个个区块(block) 组成, 区块分为头(head) 和体(body)区块头记录了一些元数据和链接到前一个区块的信息生成时间、前一个区块(head+body)的散列值区块体记录了实际数原创 2020-06-29 16:36:22 · 4861 阅读 · 1 评论 -
数据结构与算法(Python版)三十九:完美散列函数
完美散列函数给定一组数据项, 如果一个散列函数能把每个数据项映射到不同的槽中, 那么这个散列函数就可以称为“完美散列函数”对于固定的一组数据,总是能想办法设计出完美散列函数但如果数据项经常性的变动, 很难有一个系统性的方法来设计对应的完美散列函数当然,冲突也不是致命性的错误,我们会有办法处理的。获得完美散列函数的一种方法是扩大散列表的容量, 大到所有可能出现的数据项都能够占据不同的槽但这种方法对于可能数据项范围过大的情况并不实用假如我们要保存手机号(11位数字),完美散列函数得要求散列表具有百原创 2020-06-29 16:11:45 · 5652 阅读 · 0 评论 -
数据结构与算法(Python版)三十八:什么是散列
散列: Hashing前面我们利用数据集中关于数据项之间排列关系的知识, 来将查找算法进行了提升如果数据项之间是按照大小排好序的话,就可以利用二分查找来降低算法复杂度。现在我们进一步来构造一个新的数据结构, 能使得查找算法的复杂度降到O(1), 这种概念称为“散列Hashing”能够使得查找的次数降低到常数级别, 我们对数据项所处的位置就必须有更多的先验知识。如果我们事先能知道要找的数据项应该出现在数据集中的什么位置, 就可以直接到那个位置看看数据项是否存在即可。由数据项的值来确定其存放位置,原创 2020-06-29 15:46:07 · 4953 阅读 · 2 评论 -
数据结构与算法(Python版)三十七:快速排序算法及分析
快速排序Quick Sort快速排序的思路是依据一个“中值”数据项来把数据表分为两半:小于中值的一半和大于中值的一半, 然后每部分分别进行快速排序(递归)如果希望这两半拥有相等数量的数据项,则应该找到数据表的“中位数”,但找中位数需要计算开销!要想没有开销,只能随意找一个数来充当“中值”,比如,第1个数。快速排序的递归算法“递归三要素”如下基本结束条件:数据表仅有1个数据项,自然是排好序的缩小规模:根据“中值”, 将数据表分为两半, 最好情况是相等规模的两半调用自身:将两半分别调用自身进行排序原创 2020-06-29 11:49:00 · 3535 阅读 · 0 评论 -
数据结构与算法(Python版)三十六:归并排序算法及分析
归并排序Merge Sort下面我们来看看分治策略在排序中的应用归并排序是递归算法, 思路是将数据表持续分裂为两半, 对两半分别进行归并排序递归的基本结束条件是:数据表仅有1个数据项,自然是排好序的;缩小规模:将数据表分裂为相等的两半,规模减为原来的二分之一;调用自身:将两半分别调用自身排序,然后将分别排好序的两半进行归并,得到排好序的数据表...原创 2020-06-28 22:02:17 · 276 阅读 · 0 评论 -
数据结构与算法(Python版)三十五:谢尔排序算法及分析
谢尔排序Shell Sort我们注意到插入排序的比对次数, 在最好的情况下是O(n), 这种情况发生在列表已是有序的情况下, 实际上, 列表越接近有序, 插入排序的比对次数就越少从这个情况入手, 谢尔排序以插入排序作为基础, 对无序表进行“间隔”划分子列表, 每个子列表都执行插入排序随着子列表的数量越来越少, 无序表的整体越来越接近有序, 从而减少整体排序的比对次数间隔为3的子列表, 子列表分别插入排序后的整体状况更接近有序谢尔排序:思路最后一趟是标准的插入排序, 但由于前面几趟已经将列表处原创 2020-06-28 17:07:19 · 238 阅读 · 0 评论 -
数据结构与算法(Python版)三十四:插入排序算法及分析
插入排序Insertion Sort插入排序时间复杂度仍然是O(n^2), 但算法思路与冒泡排序、 选择排序不同插入排序维持一个已排好序的子列表, 其位置始终在列表的前部, 然后逐步扩大这个子列表直到全表第1趟, 子列表仅包含第1个数据项, 将第2个数据项作为“新项”插入到子列表的合适位置中, 这样已排序的子列表就包含了2个数据项第2趟, 再继续将第3个数据项跟前2个数据项比对, 并移动比自身大的数据项, 空出位置来, 以便加入到子列表中经过n-1趟比对和插入, 子列表扩展到全表, 排序完成插原创 2020-06-28 16:53:32 · 181 阅读 · 0 评论 -
数据结构与算法(Python版)三十三:冒泡排序和选择排序算法及分析
排序:冒泡排序Bubble Sort冒泡排序的算法思路在于对无序表进行多趟比较交换,每趟包括了多次两两相邻比较, 并将逆序的数据项互换位置, 最终能将本趟的最大项就位经过n-1趟比较交换, 实现整表排序每趟的过程类似于“气泡”在水中不断上浮到水面的经过第1趟比较交换, 共有n-1对相邻数据进行比较一旦经过最大项,则最大项会一路交换到达最后一项第2趟比较交换时, 最大项已经就位, 需要排序的数据减少为n-1, 共有n-2对相邻数据进行比较直到第n-1趟完成后, 最小项一定在列表首位, 就无需再原创 2020-06-28 16:10:12 · 2888 阅读 · 0 评论 -
数据结构与算法(Python版)三十二:二分查找算法及分析
二分查找那么对于有序表, 有没有更好更快的查找算法?在顺序查找中, 如果第1个数据项不匹配查找项的话, 那最多还有n-1个待比对的数据项那么, 有没有方法能利用有序表的特性,迅速缩小待比对数据项的范围呢?我们从列表中间开始比对!如果列表中间的项匹配查找项,则查找结束如果不匹配,那么就有两种情况:列表中间项比查找项大,那么查找项只可能出现在前半部分列表中间项比查找项小,那么查找项只可能出现在后半部分无论如何,我们都会将比对范围缩小到原来的一半: n/2继续采用上面的方法查找每次都会原创 2020-06-28 15:34:47 · 294 阅读 · 0 评论 -
数据结构与算法(Python版)三十一:顺序查找算法及分析
顺序查找Sequential Search如果数据项保存在如列表这样的集合中,我们会称这些数据项具有线性或者顺序关系。在Python List中, 这些数据项的存储位置称为下标(index) , 这些下标都是有序的整数。通过下标, 我们就可以按照顺序来访问和查找数据项, 这种技术称为“顺序查找要确定列表中是否存在需要查找的数据项首先从列表的第1个数据项开始,按照下标增长的顺序,逐个比对数据项,如果到最后一个都未发现要查找的项,那么查找失败。顺序查找:无序表查找代码def sequential原创 2020-06-28 15:04:48 · 627 阅读 · 0 评论 -
数据结构与算法(Python版)三十:递归小结
在本章我们研究了几种递归算法, 表明了递归是解决某些具有自相似性的复杂问题的有效技术递归算法“三定律”递归算法必须具备基本结束条件递归算法必须要减小规模,改变状态,向基本结束条件演进递归算法必须要调用自身某些情况下, 递归可以代替迭代循环递归算法通常能够跟问题的表达自然契合递归不总是最合适的算法, 有时候递归算法会引发巨量的重复计算“记忆化/函数值缓存”可以通过附加存储空间记录中间计算结果来有效减少重复计算如果一个问题最优解包括规模更小相同问题的最优解, 就可以用动态规划来解决...原创 2020-06-28 11:50:03 · 184 阅读 · 0 评论 -
数据结构与算法(Python版)二十九:动态规划案例分析
讨论:博物馆大盗问题大盗潜入博物馆, 面前有5件宝物, 分别有重量和价值, 大盗的背包仅能负重20公斤, 请问如何选择宝物, 总价值最高?我们把m(i, W)记为:前i(1<=i<=5)个宝物中,组合不超过W(1<=W<=20) 重量,得到的最大价值m(i, W),应该是m(i-1, W)和m(i-1, W-Wi)+vi,两者最大值我们从m(1, 1)开始计算到m(5, 20)博物馆大盗问题:动态规划表格递归解法# 宝物的重量和价值tr = {(2, 3), (3原创 2020-06-28 11:16:48 · 299 阅读 · 0 评论 -
数据结构与算法(Python版)二十八:找零兑换问题的动态规划解法
找零兑换:动态规划解法中间结果记录可以很好解决找零兑换问题实际上, 这种方法还不能称为动态规划,而是叫做“memoization(记忆化/函数值缓存) ”的技术提高了递归解法的性能动态规划算法采用了一种更有条理的方式来得到问题的解找零兑换的动态规划算法从最简单的“1分钱找零”的最优解开始, 逐步递加上去, 直到我们需要的找零钱数在找零递加的过程中, 设法保持每一分钱的递加都是最优解, 一直加到求解找零钱数, 自然得到最优解递加的过程能保持最优解的关键是, 其依赖于更少钱数最优解的简单计算, 而更原创 2020-06-24 18:37:02 · 847 阅读 · 0 评论 -
数据结构与算法(Python版)二十七:找零兑换问题的递归解法
找零兑换问题:递归解法我们来找一种肯定能找到最优解的方法贪心策略是否有效依赖于具体的硬币体系首先是确定基本结束条件, 兑换硬币这个问题最简单直接的情况就是, 需要兑换的找零, 其面值正好等于某种硬币如找零25分,答案就是1个硬币!其次是减小问题的规模, 我们要对每种硬币尝试1次, 例如美元硬币体系:找零减去1分(penny)后,求兑换硬币最少数量(递归调用自身);找零减去5分(nikel)后,求兑换硬币最少数量找零减去10分(dime)后,求兑换硬币最少数量找零减去25分(quarter原创 2020-06-24 16:36:11 · 7146 阅读 · 2 评论 -
数据结构与算法(Python版)二十六:优化问题和贪心策略
优化问题计算机科学中许多算法都是为了找到某些问题的最优解例如,两个点之间的最短路径;能最好匹配一系列点的直线;或者满足一定条件的最小集合找零兑换问题一个经典案例是兑换最少个数的硬币问题假设你为一家自动售货机厂家编程序,自动售货机要每次找给顾客最少数量硬币;假设某次顾客投进$1纸币,买了ȼ37的东西,要找ȼ63,那么最少数量就是: 2个quarter(ȼ25)、 1个dime(ȼ10)和3个penny(ȼ1),一共6个贪心策略解决找零兑换问题人们会采用各种策略来解决这些问题, 例如最直观的“原创 2020-06-24 16:08:43 · 7948 阅读 · 0 评论 -
数据结构与算法(Python版)二十五:分治策略与递归
分治策略与递归解决问题的典型策略: 分而治之将问题分为若干更小规模的部分通过解决每一个小规模部分问题,并将结果汇总得到原问题的解递归算法与分治策略递归三定律:基本结束条件,解决最小规模问题缩小规模,向基本结束条件演进调用自身来解决已缩小规模的相同问题体现了分治策略问题解决依赖于若干缩小了规模的问题汇总得到原问题的解应用相当广泛排序、查找、遍历、求值等等...原创 2020-06-24 16:01:19 · 482 阅读 · 0 评论 -
数据结构与算法(Python版)二十四:递归的应用(探索迷宫)
探索迷宫将海龟放在迷宫中间,如何能找到出口首先, 我们将整个迷宫的空间(矩形)分为行列整齐的方格,区分出墙壁和通道。给每个方格具有行列位置,并赋予“墙壁”、 “通道”的属性迷宫的数据结构考虑用矩阵方式来实现迷宫数据结构采用“数据项为字符列表的列表”这种两级列表的方式来保存方格内容,采用不同字符来分别代表“墙壁+”、“通道 ”、“海龟投放点S”从一个文本文件逐行读入迷宫数据迷宫的数据结构: Maze Classclass Maze: def __init__(self, mazeF原创 2020-06-24 15:55:14 · 7248 阅读 · 0 评论 -
数据结构与算法(Python版)二十三:递归的应用(汉诺塔)
复杂递归问题:汉诺塔传说在一个印度教寺庙里, 有3根柱子, 其中一根套着64个由小到大的黄金盘片, 僧侣们的任务就是要把这一叠黄金盘从一根柱子搬到另一根, 但有两个规则:一次只能搬1个盘子大盘子不能叠在小盘子上汉诺塔问题:分解为递归形式假设我们有5个盘子, 穿在1#柱, 需要挪到3#柱如果能有办法把最上面的一摞4个盘子统统挪到2#柱,那问题就好解决了:把剩下的最大号盘子直接从1#柱挪到3#柱再用同样的办法把2#柱上的那一摞4个盘子挪到3#柱,就完成了整个移动汉诺塔问题:分析接下来问题就是解决原创 2020-06-23 15:09:00 · 5699 阅读 · 0 评论 -
数据结构与算法(Python版)二十二:递归可视化(谢尔宾斯基三角形)
谢尔宾斯基Sierpinski三角形分形构造, 平面称谢尔宾斯基三角形, 立体称谢尔宾斯基金字塔谢尔宾斯基三角形:作图思路根据自相似特性, 谢尔宾斯基三角形是由3个尺寸减半的谢尔宾斯基三角形按照品字形拼叠而成由于我们无法真正做出谢尔宾斯基三角形(degree->∞),只能做degree有限的近似图形。代码import turtledef sierpinski(degree, points): colormap = ['blue', 'red', 'green', 'white原创 2020-06-23 11:49:31 · 6008 阅读 · 0 评论