![](https://img-blog.csdnimg.cn/20201014180756922.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构(Python)
文章平均质量分 83
非计算机专业,通过B站自主学习数据结构的过程
别叫我派大星
哦豁,拐咯
展开
-
数据结构(python) —— 【13: 归并排序之一次归并】
归并排序之一次归并假设现在的列表分两段有序,将其合成为一个有序列表这种操作称为一次归并原理演示:代码原理很简单,代码也很简单:author: Bluetime: 2020-08-05QQ: 2458682080'''# 现在的列表分两段有序,将其合成为一个有序列表def merge(li, low, mid, high): i = low j = mid + 1 li_temp = [] while i <= mid and j <=原创 2020-09-22 16:51:33 · 448 阅读 · 0 评论 -
数据结构(python) —— 【35: 欧几里得算法】
欧几里得算法1. 概念介绍约数︰如果整数a能被整数b整除,那么a叫做b的倍数,b叫做a的约数。最大公约数(Greatest Common Divisor,GCD): 给定两个整数a,b,两个数的所有公共约数中的最大值例:12与16的最大公约数是4如何计算两个数的最大公约数:欧几里得:辗转相除法(欧几里得算法)《九章算术》: 更相减损术欧几里得算法:gcd(a,b)= gcd(b, a mod b)例: gcd(60,21)= gcd(21,18)= gcd(18,3)= gcd(3,0原创 2020-10-29 13:40:38 · 1025 阅读 · 0 评论 -
数据结构(python) —— 【34: 动态规划之钢条切割问题】
钢条切割问题1. 问题某公司出售钢条,出售价格与钢条长度之间的关系如下表:问题:现有一段长度为n的钢条和上面的价格表,求切割钢条方案,使得总收益最大。2. 思路思考: 长度为n的钢条的不同切割方案有几种?有2n−12^{n-1}2n−1种,因为有n−1n-1n−1个可以切割的地方,每个位置都有切与不切两种选择,所以是2n−12^{n-1}2n−1种,但是这种方法不太合适,因为如果n太大的时候,切割方案会指数爆炸,效率不高。2.1 最优子结构 昨天原创 2020-10-28 11:25:34 · 1874 阅读 · 1 评论 -
数据结构(python) —— 【33: 动态规划之用斐波那契数列表达动态规划思想】
斐波那契数列1. 介绍 斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1,F(n)=F(n−1)+F(n−2)(n≥3,n∈N∗)F(0)=0,F(1)=1, F(n)=F(n原创 2020-10-27 14:53:40 · 601 阅读 · 1 评论 -
数据结构(python) —— 【32: 贪心算法之活动选择问题】
贪心算法之活动选择问题今天来说说贪心算法之活动选择问题,这是我们讲的贪心算法的第四个例题,有兴趣的读者可以看看前面的几个例题:数据结构(python) —— 【29: 贪心算法之换钱问题】数据结构(python) —— 【30: 贪心算法之背包问题】数据结构(python) —— 【31: 贪心算法之数字拼接问题】1. 题目 假设有n个活动,这些活动要占用同一片场地,而场地在某时刻只能供一个活动使用。每个活动都有一个开始时间sis_isi和结束时间原创 2020-10-26 17:30:25 · 1027 阅读 · 1 评论 -
数据结构(python) —— 【31: 贪心算法之数字拼接问题】
贪心算法之数字拼接问题1. 问题有n个非负整数,将其按照字符串拼接的方式拼接为一个整数。如何拼接可以使得得到的整数最大?例: 32,94,128,1286,6,71可以拼接除的最大整数为947163212861282. 思路思路有很多,这里介绍一下我的。即遍历列表,选取两个当前拼接起来最大的数,再进行拼接。3. 代码'''TOPIC: 用贪心算法解决数字拼接的问题author: Bluetime: 2020-08-18QQ: 2458682080'''from functool原创 2020-10-25 11:52:33 · 1566 阅读 · 1 评论 -
数据结构(python) —— 【30: 贪心算法之背包问题】
贪心算法之背包问题上一博客我简单地介绍了用贪心算法来解决换钱问题,这一博客我简单地介绍一下背包问题。1. 问题2. 举例3. 代码1.问题一个小偷在某个商店发现有n个商品,第i个商品价值viv_ivi元,重wiw_iwi千克。 他希望拿走的价值尽量高,但他的背包最多只能容纳WWW千克的东西。他应该拿走哪些商品?0-1背包: 对于一个商品,小偷要么把它完整拿走,要么留下。不能只拿走一部分,或把一个商品拿走多次。 (比如商品为金条)分数背包: 对于一个商品,小偷可以拿走其中任意一部分。(比原创 2020-10-24 12:01:06 · 2189 阅读 · 0 评论 -
数据结构(python) —— 【29: 贪心算法之换钱问题】
贪心算法之换钱问题1. 概念贪心算法(又称贪婪算法)是指,在对问题求解时,总是做出在当前看来是最好的选择。也就是说,不从整体最优上加以考虑,他所做出的是在某种意义上的局部最优解。贪心算法并不保证会得到最优解,但是在某些问题上贪心算法的解就是最优解。要会判断一个问题能否用贪心算法来计算。2. 问题假设有个人需要零钱,但身上没有,所以商店老板商量用支付宝或者微信换n元,假设老板这里钱币的面额有: 100元、50元、20元、5元、1元(张数不限),如何给使得所需钱币的数量最少?比如,375元答: 老原创 2020-10-23 11:26:18 · 1063 阅读 · 1 评论 -
数据结构(python) —— 【28: AVL树】
AVL树上一篇博客说到二叉搜索树的效率在最坏的情况下可能十分偏斜:数据结构(python) —— 【27: 二叉搜索树】而AVL树是对二叉搜索树的优化,今天就来说说AVL树!1. 概念AVL树: AVL树是一棵自平衡的二叉搜索树。AVL树具有以下性质:根的左右子树的高度之差的绝对值不能超过1根的左右子树都是平衡二叉树其中高度之差我们用**balance factor(平衡因子)**来进行解释。平衡因子的正负号表示左右子树哪边的深度大,可以自己定义。这里我定义了左子树深度>右子树原创 2020-10-22 13:15:37 · 663 阅读 · 0 评论 -
数据结构(python) —— 【27: 二叉搜索树】
二叉搜索树二叉搜索树是一颗二叉树且满足性质:设x是二叉树的一个节点。如果y是x左子树的一个节点,那么y.key≤x.key; 如果y是x右子树的一个节点,那么y.key≥x.key。二叉搜索树任一节点的左边都比较它小,右边都比它大例:二叉搜索树的操作:查询、插入、删除,二叉搜索树——删除操作如果要删除的节点是叶结点: 直接删除要删除的节点只有一个孩子: 将此节点的父亲与孩子连接,然后删除该节点。如果要删除的节点有两个孩子:将其右子树的最小节点(该节点最多有一个右孩子)删除,并替换当前节原创 2020-10-21 11:11:21 · 318 阅读 · 0 评论 -
数据结构(python) —— 【26: 二叉树及其操作】
二叉树树是一种数据结构 比如:目录结构树是一种可以递归定义的数据结构树是由n个节点组成的集合:如果n=0,那这是一棵空树;如果n>0,那存在1个节点作为树的根节点,其他节点可以分为m个集合,每个集合本身又是一棵树。二叉树的基本概念可以看我前面的博客:数据结构(python) —— 【09: 树与二叉树】二叉树的链式存储: 将二叉树的节点定义为一个对象,节点之间通过类似链表的链接方式来连接。二叉树的遍历:简单用代码对二叉树实现一下:'''TOPIC: 二叉树的概念(节点的建原创 2020-10-18 16:38:11 · 437 阅读 · 2 评论 -
数据结构(python) —— 【25: 哈希表】
哈希表今天的内容没有代码,只是来简单介绍一下哈希表!1. 定义哈希表:哈希表(Hash Table,又称为散列表),是一种线性表的存储结构。哈希表由一个直接寻址表和一个哈希函数组成。哈希函数h(k)将元素关键字k作为自变量,返回元素的存储下标。例子:假设有一个长度为7的哈希表,哈希函数h(k)=k%7。元素集合{14,22,3,5}的存储方式如下图哈希表一个通过哈希函数来计算数据存储位置的数据结构,通常支持如下操作:insert(key, value): 插入键值对(key,v原创 2020-10-17 13:05:24 · 418 阅读 · 0 评论 -
数据结构(python) —— 【24: 链表】
链表1. 单链表链表是由一系列节点组成的元素集合。每个节点包含两部分,数据域item和指向下一个节点的指针next。通过节点之间的相互连接,最终串联成一个链表。创建链表:头插法: 新插入的节点变为头节点尾插法: 新插入的节点变为尾节点单链表节点的插入和删除:插入:删除:2. 双链表双链表的每个节点有两个指针: 一个指向后一个节点,另一个指向前一个节点。双链表节点的插入与删除:插入:删除:3. 单链表代码:'''TOPIC: 链表author: Bluetime:原创 2020-10-16 13:43:42 · 342 阅读 · 2 评论 -
数据结构(python) —— 【23: 用队列解决迷宫问题】
用队列解决迷宫问题1. 概述 昨天介绍了用栈解决迷宫问题,具体可以去看上一篇博客数据结构(python) —— 【22: 用栈解决迷宫问题】今天讲讲用队列解决迷宫问题。2. 思路队列——广度优先搜索思路:从一个节点开始,寻找所有接下来能继续走的点,继续不断寻找,直到找到出口。使用队列存储当前正在考虑的节点区别:用队列和栈解决迷宫问题最大的区别在于,栈利用了深度优先搜索的思想,而队列利用了广度优先搜索的思想具体的迷宫问题也可以去看上一博文,这里原创 2020-10-15 13:51:42 · 2745 阅读 · 0 评论 -
数据结构(python) —— 【22: 用栈解决迷宫问题】
用栈解决迷宫问题1. 问题迷宫问题:给一个二维列表,表示迷宫(0表示通道,1表示围墙)给出算法,求一条走出迷宫的路径。maze = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 1, 0, 0, 0, 1, 0, 1],[1, 0, 0, 0, 0, 1, 1, 0, 0, 1],[1, 0, 1, 1, 1, 0, 0, 0, 0, 1],[1, 0, 0, 0, 1, 0, 0, 0原创 2020-10-14 17:21:29 · 2937 阅读 · 4 评论 -
数据结构(python) —— 【21: 队列】
队列队列(Queue)是一个数据集合,仅允许在列表的一端进行插入,另一端进行删除。进行插入的一端称为队尾(rear),插入动作称为进队或入队进行删除的一端称为队头(front),删除动作称为出队队列的性质:先进先出(First-in, First-out)为了让队列可以循环使用,这里我们提出了环形队列环形队列:当队首指针front == Maxsize - 1时, 再前进一个位置就自动到0.队首指针前进1: front = (front + 1) % MaxSize队尾指针前进1: re原创 2020-10-12 17:25:02 · 291 阅读 · 0 评论 -
数据结构(python) —— 【20: 数据结构&栈】
数据结构&栈 今天来简单介绍一下啥是数据结构,啥是栈?1. 啥是数据结构?数据结构:指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。比如:列表、集合与字典等都是一种数据结构。N.Wirth:“程序=数据结构+算法”数据结构按照其逻辑结构可分为线性结构、树结构、图结构线性结构:数据结构中的元素存在一对一的相互关系树结构:数据结构中的元素存在一对多原创 2020-10-11 13:38:50 · 239 阅读 · 0 评论 -
数据结构(python) —— 【19排序: 基数排序】
基数排序1. 概述 国庆玩得太欢脱了,一篇博文都没写,而且国庆前还参加了一个面试,拿到了一个题目,需要我们去完成,这也是没写博客的原因之一。 闲话也不说了,今天来介绍介绍最后一个排序——基数排序。基数排序其实就是进行多关键字排序,比如对32,34,17,15,7,46,56,42排序,是否可以看做多关键字排序.2. 思路 先按个位数进行分桶,然后依次取出;再按十原创 2020-10-10 18:00:26 · 621 阅读 · 0 评论 -
数据结构(python) —— 【18排序: 桶排序】
桶排序上一博文讲了计数排序,那么在计数排序中,如果元素的范围比较大(比如在1到1亿之间),如何改造算法?桶排序(Bucket Sort): 首先将元素分在不同的桶中,再对每个桶中的元素排序桶排序的表现取决于数据的分布,也就是需要对不同的数据排序时采取不同的分桶策略平均情况复杂度: O(n+k)最坏情况时间复杂度: O(k * n^2)空间复杂度: O(nk)桶排序原理很简单,比如一个列表中元素最大值是max=100000,按照计数排序,我们需要一个100000大小的列表,但是如果使用桶排序,则原创 2020-09-27 12:24:41 · 383 阅读 · 0 评论 -
数据结构(python) —— 【17排序: 计数排序】
计数排序 今天来介绍介绍比较简单的计数排序。 计数排序原理非常简单,对于已知元素范围的列表,统计列表中各相同元素的个数。然后将这些元素从小到大放进新列表即可!是个时间复杂度为O(n)的算法。举例:比如列表: [1, 0, 3, 2, 0, 5, 6, 5, 7, 0, 1, 2, 5]先遍历列表,将每个值的个数放在值所对应的索引中!比如1的个数就放在新列表中索引为1的地方;0的个数放在新列表中索引为0的原创 2020-09-26 14:15:15 · 492 阅读 · 0 评论 -
数据结构(python) —— 【16排序: 希尔排序】
希尔排序希尔排序(Shell Sort)是一种分组插入排序算法希尔排序过程:首先取一个整数d1=n/2, 将元素分为d1个组,每组相邻量元素之间距离为d1,在各组内进行直接插入排序;取第二个整数d2=d1/2,重复上述分组排序过程,直到d1=1,即所有元素在同一组内进行直接插入排序。希尔排序每趟并不使某些元素有序,而是使整体数据越来越接近有序;最后-趟排序使得所有数据有序。示意GIF:GIF中我只展示了如何进行分组,比如d=4的时候,分为4组,即4个列表,每个列表中都用选择排序进行排序。原创 2020-09-25 12:47:39 · 425 阅读 · 0 评论 -
数据结构(python) —— 【15: NB三人组小结】
快速、堆、归并排序小结之前讲了Low B三人组,然后最近又讲了NB三人组的快速排序、堆排序和归并排序。数据结构(python) —— 【08排序: 快速排序】数据结构(python) —— 【11: 堆排序】数据结构(python) —— 【14: 归并排序】其中堆排序可能比较难理解,需要花费更多时间去结合图文进行理解。今天来把这三个排序进行小结一下。三种排序算法的时间复杂度都是O(nlog(n))一般情况下,就运行时间而言:快速排序 < 归并排序 < 堆排序三种排序算法的缺原创 2020-09-24 13:43:28 · 420 阅读 · 0 评论 -
数据结构(python) —— 【14: 归并排序】
归并排序上一博文讲了如何使用归并排序进行一次排序即一次归并(列表分两段有序,将其合成为一个有序列表这种操作称为一次归并)数据结构(python) —— 【13: 归并排序之一次归并】今天来讲讲,怎么利用归并排序将一个无序列表进行排序!代码:# _*_coding:utf-8_*_'''TOPIC: 归并author: Bluetime: 2020-08-05QQ: 2458682080'''import random# 一次归并def merge(li, low, mid, h原创 2020-09-23 12:38:11 · 341 阅读 · 0 评论 -
数据结构(python) —— 【12: topk问题(取出前k大或小的数)】
topk问题(取出前k大或小的数) 在我的上一篇博客中,我们讲了怎么利用堆进行排序,即堆排序。这节来说说topk问题, 即:现在有n个数,设计算法得到前k大的数(k<n).现在有三个思路或者说是解决方案:排序后切片 O(nlog(n))排序LOWB三人组 O(kn)堆排序 O(nlog(k))今天讲讲方法3:堆排序的解决思路:取列表前k个元素建立一个小根堆,堆顶就是目前第k大的数依次向后遍历原创 2020-09-21 18:39:47 · 1123 阅读 · 1 评论 -
数据结构(python) —— 【11: 堆排序】
堆排序 前面讲了堆的向下调整,今天来讲讲怎么利用堆进行排序即堆排序!1. 步骤先根据完全二叉树建立堆(农村包围城市)得到堆顶元素,为最大元素去掉堆顶,将堆最后一个元素放到堆顶,此时可通过一次调整使堆有序堆顶元素为第二大元素重复步骤3,直到堆变空简单点概括就是先建立堆,再根据前面所学的向下调整函数,将堆从下到上、从小到大依次调整就变为一个大根堆或者小根堆,最后挨个出数,就能排序了!2. 演示1. 建立堆拿以下这个完全二叉树举例:这个完全原创 2020-09-20 18:30:32 · 449 阅读 · 0 评论 -
数据结构(python) —— 【10: 堆的向下调整】
堆的向下调整1. 啥是堆?堆: 一种特殊的完全二叉树结构(完全二叉树:叶结点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边若干位置的二叉树),具体看我的上一篇博文: 数据结构(python) —— 【09: 树与二叉树】堆分为大根堆、小根堆:大根堆: 一颗完全二叉树,满足任一节点都比其孩子节点大小根堆: 一颗完全二叉树,满足任一节点都比其孩子节点小2. 堆的向下调整:什么是堆的向下调整?把不是堆的二叉树经过一个叫做【向下调整】的操作变为堆什么样的二叉树可以做向原创 2020-09-19 15:28:42 · 430 阅读 · 0 评论 -
数据结构(python) —— 【09: 树与二叉树】
树与二叉树1. 啥是树?树是一种可以递归定义的数据结构树是由n个节点组成的集合:如果n=0,那这是一颗空树如果n>0,那存在一个节点作为树的根结点,其他节点可以分为m个节点,每个集合本身又是一棵树2. 基本概念根结点: 根结点就是最开始的那个点,如上图根结点即A叶结点: 下面没有分叉的节点,如上图叶结点为L\M\N\O\P树的深度(高度): 最深有几层,如上图最深有4层(A-B-F-L、A-C-H-M…)节点的度: 每个节点分出的叉,如上图,A节点的度为4,B节点的度为2,原创 2020-09-18 13:18:43 · 407 阅读 · 0 评论 -
数据结构(python) —— 【08排序: 快速排序】
快速排序 昨天说完了Low B三人组的插入排序,今天来说说NB三人组的快速排序。1. 思路取一个元素p(第一个元素), 使元素P归位列表被p分为两部分, 左边都比p小, 右边都比p大递归完成排序这里我用自己做的GIF来简单演示下列表中一个数的归位的部分过程(由于大小限制,这里只展示了部分过程):这里整个列表刚开始都是无序表,那我们就取无序列表的第一个元素进行归位.2. 代码def partition(li, left, right):原创 2020-09-17 18:57:09 · 302 阅读 · 0 评论 -
数据结构(python) —— 【07排序: 插入排序】
插入排序1. 前言 前几天在打高教杯数学建模国赛,然后最近又在缓解数学建模通宵遗留下来后遗症,所以一直没有更新。 先简单说说这次2020高教杯数学建模国赛的感受吧。我们选的是B题——穿越沙漠。一道分析+代码的综合性路径规划题,其实我们刚开始走入了一个误区,以为这道题目应该是算法比重偏大,所以一开始就在那里写智能性算法,可是我写了一晚之后,发现算法过于复杂,所以第二天早上就有点崩溃了,甚至产生了换题的想法,好在队原创 2020-09-16 18:42:13 · 315 阅读 · 0 评论 -
数据结构(python)——【06排序: 选择排序】
数据结构——选择排序 选择排序与前面介绍的冒泡排序要简单一点,不管是思路还是代码。1. 思路: 将整个列表分为两个区域: 有序区和无序区,每次找出无序区中的最小值,放在有序区,直到无序区里没有值。 具体算法思想放在下面的算法讲解再仔细介绍。2. 代码1. 法一:具体思路: 这一算法的思路非常简单,我们开出了一个原创 2020-09-03 13:02:08 · 288 阅读 · 0 评论 -
数据结构(python)——【05 排序: 冒泡排序】
数据结构——冒泡排序1. 概念排序: 将一组无序的记录序列调整为有序的记录序列列表排序: 将无序列表变为有序列表Python内置排序函数: sort()常见排序算法排序LOW B 三人组: 冒泡排序、选择排序、插入排序排序NB三人组: 快速排序、堆排序、归并排序其他排序: 希尔排序、计数排序、基数排序… 2. 冒泡排序<1> 概念: 列表每两个相邻的数,如果前面比后面大,则交换这两个数一趟排序完成后,则无序区减少原创 2020-08-18 01:41:16 · 789 阅读 · 0 评论 -
数据结构(Python) —— 【04 递归】
递归递归应该放在汉诺塔问题之前讲的,因为汉诺塔问题就是用递归解决的,所以今天补上!递归是个很基础的知识点,我记得大学C语言的前面就讲了递归,可见递归是个简单却又重要的知识点!递归的具体文字解释,我就不说了,简单来说,递归就是不断调用自己,直到达到终止条件。所以, 递归的两个特点: 调用自身、结束条件我就简单句几个例子说明一下:1. def func1(x): print(x) func1(x-1)没有结束条件,我们都不直到递归什么时候结束,所以不是合法的递归2.原创 2020-08-09 01:41:22 · 282 阅读 · 0 评论 -
数据结构(Python) —— 【03 顺序查找、二分查找】
顺序查找以及二分查找今天简单介绍一下两个查找方法。先说说什么是查找:查找:在一些数据元素中,通过一定的方法找出与给定关键字相同的数据元素的过程。列表查找列表查找(线性表查找): 从列表中查找指定元素 输入: 列表、待查找元素 输出: 元素下标(未找到元素时一般返回None或-1)Python的内置列表查找函数: index()顺序查找顺序查找: 也叫线性查找,从列表第一个元素开始,顺序进行搜索,原创 2020-08-06 01:08:25 · 312 阅读 · 0 评论 -
数据结构(Python) —— 【02 汉诺塔问题】
汉诺塔问题数据结构中,有一题汉诺塔问题,我们今天就来看看。背景 大梵天创造世界的时候做了三根金刚石,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。移动完毕之日,就是世界毁灭之时。 我们来看看要求: &原创 2020-07-24 20:07:18 · 471 阅读 · 1 评论 -
数据结构(Python) —— 【01 估计算法运行效率与时间复杂度】
本人非计算机专业,通过在某站自学数据结构,进一步夯实自己今天说说【课程01:估计算法运行效率与时间复杂度】时间复杂度:用来评估算法运行效率的一个式子先说几个例子:print('Hello World') 时间复杂度: O(1) for i in range(n): 时间复杂度: O(n) print('Hello World')for i in range(n): 时间复杂度: O(n^2) for j原创 2020-07-21 01:39:34 · 548 阅读 · 0 评论