![](https://img-blog.csdnimg.cn/2019092715111047.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构与算法-python版
文章平均质量分 79
从基础到进阶,持续输出
笨猪起飞
这个作者很懒,什么都没留下…
展开
-
利用多线程和queue实现生产-消费者模式--消息队列
生产者消费者模式也是一种常见的设计模式,而消息队列是较好的实现方式之一,解耦和支持并发,还有其他不同的方式来实现消息队列,后面再继续补充。原创 2022-11-02 19:59:56 · 1196 阅读 · 0 评论 -
面向对象编程的5个原则--python实例
面向对象编程的5个原则--python实例面向对象的五个基本原则1、立杆见影的单一职责原则2、让代码稳定性飞升的开放封闭原则和依赖倒置原则3、挑肥拣瘦的接口隔离原则5、轻装上阵的合成复用原则作为一名开发工程师或者测试开发来说,掌握程序设计、编程技能已经是基本要求了,但如果你想进阶更高的层次,或者你想成为一名合格的测试架构师,除了要掌握如何实现以外,还得要学会如何实现好! 因为掌握功能编码的实现并不代表你能写出或者设计出“好”的代码、好的架构。想成为一名优秀的测试架构师,在程序设计这块需要掌握的一些开发技原创 2022-04-03 15:30:20 · 537 阅读 · 1 评论 -
【转载】Python第三方库资源合集
Python语言提供超过15万个第三方库,Python库之间广泛联系、逐层封装。汇总整理了常用的第三方库。Python社区:**https://pypi.org/**转载 2021-12-15 11:52:12 · 1639 阅读 · 0 评论 -
面向对象编程(OPP)思想的python初见
1初识 Python 面向对象Python 是一门面向对象的编程语言,所以在 Python 中所有的数据都是对象,例如之前学习到的整数、浮点数、字符串、列表都是对象,关于面向对象的概念不做过多的解释(毕竟现在解释也没啥用,具体等学到面向对象部分在进行说明)。我们可以给各种对象设计一些 方法,这些 方法 也是广义上的 函数,是不是听起来有些绕,在 Python 中已经为一些基本对象内置了一些方法,从列表开始我们将逐步接触对象的内置方法。对象方法的调用语法格式为:对象.方法()2. 快速获取系统内置方法原创 2021-05-07 00:08:27 · 253 阅读 · 0 评论 -
python常用库总结—requests库基本用法和高级特征
1.request简介Requests 完全满足今日 web 的需求。其功能特性:Keep-Alive & 连接池国际化域名和 URL带持久 Cookie 的会话浏览器式的 SSL 认证自动内容解码基本/摘要式的身份认证优雅的 key/value Cookie自动解压Unicode 响应体HTTP(S) 代理支持文件分块上传流下载连接超时分块请求支持 .netrcRequests 支持 Python 2.6—2.7以及3.3—3.7,而且能在 PyPy 下完美运行转载 2021-05-06 23:37:41 · 1457 阅读 · 0 评论 -
快速排序算法的python和C++实现及三种优化方法详解
这里写自定义目录标题快速排序算法介绍快排算法python实现快排的合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入快速排序算法介绍快速排序和冒泡排序一样,也是交换排序。不过它是一种不稳定的排序算法(因为关键字的比较和交换是跳跃进行的)。原创 2020-12-14 23:46:23 · 436 阅读 · 0 评论 -
Dijkstra算法的python实现及最短路径问题解析
背景:最短路径问题当我们通过网络浏览网页、电子邮件、发送qq消息时,数据会通过互联网在联网设备之间流动,抽象成如图所示,图中标注为“lnternet”的云状结构,实际上是一个由路由器连接成的网络,需要自动寻找最短路径。由于网络流量的状况会影响路径选择算法,在不同的时间,路径可能不同,因此将互联网路由器体系表示为一个带权边的图。如图所示:解决信息在路由器网络中选择传播速度最快路径的问题,就转变为在带权重上最短路径的问题。解决该类问题的经典算法是——Dijkstra算法,Dijkstra算法介绍及py原创 2020-07-02 16:54:28 · 2244 阅读 · 3 评论 -
深度优先算法(DFS)的python实现及骑士周游问题解析
背景: 骑士周游问题在棋盘格里,马走日,遍历所有网格点,找到每个网格都走过,且只有一次的路径。算法实现:用于解决骑士周游问题的图搜索算法是深度优先搜索(DFS),该算法是逐层建立搜索树,沿着树的单支尽量深入的向下搜索。连接尽量多的顶点,必要时可以进行分支。深度优先搜索同样要用到顶点的“前驱”属性,来构建树或森林。另外需要设置“发现时间”和“结束时间”属性。发现时间是在第几步访问到了这个顶点(设置灰色);结束时间是在第几步完成了此顶点的探索(设置黑色)。通用的深度优先搜索算法代码:# BFS采原创 2020-07-02 12:03:52 · 3379 阅读 · 1 评论 -
广度优先算法(BFS)的python实现与词梯问题
背景:词梯问题从一个单词演变为另一个单词,其中的过程可以经过多个中间单词,要求是相邻两个单词之间差异只能是1个字母。如FOOL变为SAGE:FOOL >> POOL >> POLL >> POLE >> PALE >> SALE >> SAGE。我们的目标是找到最短的单词变换序列,采用图来解决这个问题的步骤如下:将可能的单词之间的演变关系表达为图,采用广度优先搜索BFS,来搜寻从开始单词到结束单词之间的所有有效路径,选择其中最快到达原创 2020-06-30 21:21:46 · 1352 阅读 · 0 评论 -
图抽象数据类型的特点及python实现
图抽象数据类型:ADT GraphADT Graph 的实现方法:(1)邻接矩阵矩阵的每行和每列都代表图中的顶点,若两各顶点之间有边连接,设定行列值或权重。无权边则将分量标注为1。优点:简单,直观,但边数很少时效率低下。(2)邻接列表维护一个包含所有顶点的主列表,主列表中每个顶点,再关联一个与自身有边连接的所有顶点的列表,优点:存储紧凑、高效,很容易获得所有顶点及其连接边的信息。两种方法有其优劣势,需在不同应用中加以选择。ADT Graph 实现## 定义顶点vertex类,包含顶原创 2020-06-30 17:40:45 · 1022 阅读 · 0 评论 -
二叉查找树(Binary Search Tree)的python实现及算法分析
二叉查找树(BST)特点:比父节点小的key都出现在左子树,比父节点大的key都出现在右子树。二叉查找树的python实现class BinarySearchTree(object): def __init__(self, key): ##初始化 self.key = key self.left = None self.right = None def find(self, x): if x == s原创 2020-06-30 13:48:59 · 1114 阅读 · 1 评论 -
树的应用之优先队列和二叉堆的python实现
优先队列优先队列的出队与队列一样,均是从队首出队,但是在优先队列内部,数据项的次序是由“优先级”来确定:高优先级的数据在队首,低优先级的数据项则排在后面。优先队列的实现——二叉堆(Binary Heap)二叉堆逻辑结构上像二叉树,却是用非嵌套的列表来实现。二叉堆能够将优先队列的入队和出队复杂度都保持在O(log n)。用非嵌套列表来实现二叉堆(1)为了使堆操作能保持在对数水平上,就必须采用二叉树结构。(2)若要使操作始终保持在对数级别,就需要始终保持二叉树的“平衡”。:树根左右子树拥有数量相原创 2020-06-29 22:58:20 · 168 阅读 · 0 评论 -
树的定义与属性及python实现
树的定义:树由若干节点、以及两两连接节点的边组成,并有如下性质:(1)其中一个节点被设定为根;(2)每个节点n(除根节点)都恰连接一条来自节点p的边;(3)每个节点从根开始的路径是惟一的;另外一种定义(递归定义):树是空集,或者由根节点及多个字数构成,每个子树的根到根节点具有边相连。树的python实现方法一:嵌套列表实现#创建仅有根节点的二叉树def BinaryTree(r): return [r,[],[]]#将新节点插入树中作为其直接子节点def InsertLeft(原创 2020-06-28 21:30:02 · 1001 阅读 · 0 评论 -
“映射”抽象数据类型:ADT Map的python实现与散列冲突简介
python最有用的数据类型之一为“字典”,其是一种可以保存key-data键值对的数据类型。这种键值关联的无序集合称为“映射Map”映射特点:(1)关键码具有唯一性; (2) 通过关键码可以唯一确定一个数据值。映射支持以下操作:Map()创建一个空的映射,它返回一个空的映射集合。put(key, val)往映射中加入一个新的键-值对。如果键已经存在,就用新值替换旧值。get(key)返回key对应的值。如果可以不存在,则返回None。del 通过del map[key]这样的语句从映射中删原创 2020-06-28 12:43:52 · 461 阅读 · 0 评论 -
排序算法的python实现及算法分析——归并排序(merge sort)和快速排序(quick sort)
5 归并排序归并排序的思路是将数据表持续分裂成为两半,分别对两半进行归并排序,然后在合并,其过程为递归算法。每个步骤为:归并排序实例python实现源码## 归并算法def merge_sort (lst): if len(lst)<=1: #递归结束条件 return lst #分解问题,并递归调用 middle=len(lst)//2 left=merge_sort(lst[:middle]) right=merge_sor原创 2020-06-28 11:36:14 · 520 阅读 · 0 评论 -
排序算法的python实现及算法分析——插入排序(insertion sort)和谢尔排序(Shell Sort)
3 插入排序原理:插入排序维持一个已排好序的子列表,其位置始终位于列表的前部,然后逐步扩大这个子列表至全表。插入排序的比对主要是用来寻找“新项”的插入位置通过比对,移动,然后将新项插入合适位置python实现插入排序:##插入排序def insertionsort(alist): for index in range(1,len(alist)): currentvalue =alist[index] position=index w原创 2020-06-27 12:48:48 · 542 阅读 · 0 评论 -
排序算法的python实现与算法分析——冒泡排序(Bubble Sort)与选择排序(Selection Sort)
1 冒泡排序:对无序表进行多次比较排序,分别比较两两相邻的数据并互换逆序数据项,第一趟实现最大项就位,第二趟实现次大项就位,经过n-1次实现整表排序。第一趟排序过程:python实现源码:##冒泡排序 普通版def bubblesort(alist): for passnum in range(len(alist)-1,0,-1): for i in range(passnum): if alist[i] > alist[i+1]:原创 2020-06-27 11:05:35 · 458 阅读 · 0 评论 -
排序算法的python实现及算法分析——二分查找(Binary Search)
二分查找:在有序表的前提下采用分而治之(从中间项开始),这样对比范围就可以缩小为n/2,查找过程与实现原理:将问题分解为若干更小规模部分的问题,并将结果汇总得到原问题的解python实现代码:###二分查找 普通版def binarysearch(alist,item): first=0 last=len(alist)-1 found=False while first<=last and not found: midpoint=(f原创 2020-06-26 11:28:27 · 730 阅读 · 1 评论 -
排序算法的python实现与算法分析——顺序查找(Sequential Search)
引言原创 2020-06-26 10:04:12 · 593 阅读 · 1 评论 -
动态规划应用——盗贼选重物和硬币找零问题的python实现
算法定义:1.采用更为条理的方式得到问题的最优解2.从最简单问题的最优解开始,逐步叠加到问题的解法例如:找零兑换的动态规划解法就是在金额递加时,设法保证每一分钱的递加都是最优解,因此,待到求解金额数,自然得到最优解。3. 动态规划求解关键条件:问题的最优解包含了更小规模子问题的最优解,其实采用动态规划策略解决的必要条件。找零问题:动态规划解法def dpmakechange(coinvaluelist,change,mincoins): for cents in range(1,chan原创 2020-05-27 22:55:09 · 407 阅读 · 0 评论 -
递归应用——贪心策略解决找零问题的python实现
引言找零问题:兑换最少个数的硬币贪心策略:每次以最多数量的最大面值的硬币来迅速减少找零面值,若有余额,再到下一个最大面值的硬币,还用尽量多的数量,逐面值查找,直接面值为1结束。递归条件基本结束条件:需要兑换的找零,其面值正好等于某种硬币的数倍,没有余额。减小问题的规模:对每种硬币尝试一次,分别将找零减去1、5、10、25后,求兑换硬币的最少数量(递归调用自身)。代码实现一:def recMC(coinvaluelist,change): mincoins=change if c原创 2020-05-27 17:26:10 · 508 阅读 · 0 评论 -
常用线性结构——无序列表(Underedlist)的链表python实现
无续列表原创 2020-05-27 15:23:30 · 1358 阅读 · 0 评论 -
双端队列(Deque)的python实现与应用——回文词判定
何为双端队列(Deque)双端队列是一种有次序的数据集,数据项可以从队首加入,也可以从队尾加入,同时数据移除也可以从两端移除。注:双端队列不具有先进先出或者先进后出特性。Deque的python实现双端队列数据类型的定义为:class Deque: def __init__(self): self.items = [] #建立一个空双端队列 def...原创 2020-04-28 21:27:31 · 839 阅读 · 1 评论 -
队列(queue)应用及python实现——约瑟夫问题
何为队列(Queue)1.1 定义:队列是一种有次序的数据集合,其特征为:“先进先出”(1)新数据的添加总是从尾端发生(rear端)(2)新数据的移除总是在首端发生(front端)当数据加入队列是,首先在对尾,逐渐移除队首数据,它逐渐接近队首。1.2 生活中应用案例:(1)一台打印机面向多个用户/程序提供服务(2)操作系统核心采用多个队列对系统中同时运行的进程进行调度,原则为“先到先...原创 2020-04-28 18:25:01 · 1942 阅读 · 2 评论 -
栈的应用(3)——中缀表达式转后缀表达式并求值 python实现
引言输入运算表达式,仅由数字、+、-、*、/、()组成,没有空格,要求求其值,中缀表达式:通常看到的表达式中,操作符介于操作数中间的表示法,如A+B,BC,A+BC(容易混淆)。为了避免混淆,引入优先级或者括号来定义顺序。(A+B)C前缀表达式:将操作移动到前面的表示法,如+AB, * +ABC后缀表达式:将操作移动到后面的表示法,如AB+,AB+C因此,(A+B)*C转化为AB+C ...原创 2020-04-28 17:39:07 · 1456 阅读 · 1 评论 -
栈的应用(2)——十进制转换为任意进制算法python实现
引言进制转换是计算机数据处理的基础,二进制是计算机原理中最基本的概念,十进制是人类常用的数值概念,因此,进制的转换是人类与计算机交互的最基础的算法进制转换原理方法:除以K求余数转换过程中,得到的余数是从低到高的次序,而输出是从高到低的输出,所以需要一个栈来反转次序。十进制转换为二进制实现1.1 定义栈的各种属性class Stack(object): #定义栈 类 "...原创 2020-04-25 23:07:03 · 1920 阅读 · 0 评论 -
栈的应用(1)——通用括号匹配算法python实现
引言计算过程中可能包含大量的的括号,而且这些括号有优先级,因此在算法中需要检验括号是否平衡,正确的对括号进行匹配,是很多语言编译器的基础算法。算法原理正确匹配形式:(){} [] ({}) 等错误匹配形式:( [ )] { ( } ) 等匹配过程:(1)从左到右扫描括号串,最近打开的左括号,应该匹配最先遇到的右括号;(2)第一个打开的左括号(最早打开)...原创 2020-04-25 22:18:52 · 1819 阅读 · 0 评论