![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 54
二哥不像程序员
公众号:数据山谷
展开
-
数据结构必会|图的基本概念及实现(Python)
图1. 图的定义 图(Graph)是由顶点的有穷非空集合和顶点之间边的集合组成,通常表示为:G(V,E),其中,G表示一个图,V是图G中顶点的集合,E是图G中边的集合。2. 图的基本概念无向图 如果图中任意两个顶点之间的边都是无向边(简而言之就是没有方向的边),则称该图为无向图。有向图 如果图中任意两个顶点之间的边都是有向边(简而言之就是有方向的边),则称该图为有向图。无向完全图 在无向图中,如果任意两个顶点之间都存在边,则称该图为无向完全图。有向完原创 2021-02-26 12:17:22 · 3239 阅读 · 2 评论 -
数据结构必会|二叉树及其遍历(Python)
二叉树1. 树的概念 在数据结构中,树可以看作是一种通过递归生成的数据结构,每棵树只有一个根结点(下图中的A)而其他的结点可以有很多个,树的结构如下图所示:2. 树的术语 在树结构中,有很多专业的术语,常见的术语及解释如下:根结点:A祖先结点:B和K子孙结点:K和B父结点:E和K子结点:K和E兄弟结点:K和L叶子结点:度等于0的节点,F、G等结点的度:树中一个结点的子结点个数,A有3个子结点树的度:结点最大度数3. 二叉树的定义 对于每个结点来说最原创 2021-02-26 12:13:27 · 3444 阅读 · 0 评论 -
面试必备算法|图解堆排序(Python)
堆排序堆排序的思想 堆排序是用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 以大顶堆为例,现将列表构造成一个大顶堆,此时,整个列表的最大值就是堆顶的值。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个元素重新构造成一个堆,这样会得到n个元素的次小值。如此反复执行,便能得到一个有序列表了。具体可以总结为下面的三个步骤:将无序列表构建成一个堆,根据升序降序需求选择大顶堆或小顶堆原创 2021-02-26 12:06:02 · 2411 阅读 · 1 评论 -
面试必备算法|图解基数排序(Python)
基数排序基数排序的思想 将所有待比较数值统一为同样的数位长度,数位较短的数前面补零。然后,从个位开始依次进行排序。这样从最低位排序一直到最高位排序完成以后,数列就变成一个有序序列。图解基数排序 进行基数排序的时候我们按照从低位到高位排序即可,直到最高位排序完成。基数排序的代码实现# 基数排序lst = list(map(int, input().split(',')))def RadixSort(alist): i = 0 n = 1 max_n原创 2021-02-26 12:03:08 · 2043 阅读 · 1 评论 -
面试必备算法|图解快速排序(Python)
快速排序快速排序的思想 快速排序通过一次排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。具体步骤如下:从数列中挑出一个元素,称为"基准"(pivot);重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区操作;递归地把小于基准值元原创 2021-02-26 12:01:57 · 2594 阅读 · 0 评论 -
面试必备算法|图解归并排序(Python)
归并排序归并排序的思想 归并排序主要使用了分治的策略进行排序,归并排序分为拆分和合并两个部分。拆分的时候我们需要递归的去执行把列表一分为二的操作(直到拆分成每个列表中只有一个元素),合并的时候我们同样使用递归的方法,不断地去比较列表中元素的大小并根据大小顺序进行合并(直到合并成一个列表)。图解归并排序 首先我们对整个列表进行不断的拆分(每次从中间拆开): 下一步就是对完全拆开的列表进行合并,合并的时候要比较元素之间的大小进行位置交换(每次递归都是如此): 完整原创 2021-02-26 11:59:26 · 2260 阅读 · 0 评论 -
面试必备算法|图解希尔排序(Python)
希尔排序希尔排序的思想 希尔排序是对插入排序的一种改进方法,它把原来的列表分成无数个子列表,然后对每个子列表来执行插入排序,希尔排序的关键就在于对步长的控制(可以看作是每间隔几个元素取元素作为子列表)。图解希尔排序 给定如下的列表: 我们使用2作为步长(每隔两个字符取一个元素),可以划分成如下的三个子列表。 有了三个子列表之后,我们分别对三个子列表进行插入排序 根据上图可以发现我们得到的组合结果并没有完全排序成功,最后我们还需要对这个列表进行一次插原创 2021-02-26 11:57:35 · 1213 阅读 · 0 评论 -
面试必备算法|图解插入排序(Python)
插入排序插入排序的思想 插入排序通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。图解插入排序插入排序的性质最优时间复杂度:O(n)O(n)O(n) (升序排列,序列已经处于升序状态)最坏时间复杂度:O(n2)O(n^2)O(n2)稳定性:稳定插入排序的代码实现lst = list(map(int, input().split(',')))d原创 2021-02-26 11:54:38 · 2010 阅读 · 1 评论 -
面试必备算法|图解选择排序(Python)
选择排序选择排序的思想 选择排序的思想比较直观:首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素都排序完毕。图解选择排序选择排序的性质最优时间复杂度:O(n2)O(n^2)O(n2)最坏时间复杂度:O(n2)O(n^2)O(n2)稳定性:不稳定(考虑升序每次选择最大的情况) 对考虑升序的情况进行说明:将下表中两个相同数据用(1)(2)进行区分,如果我们选择最原创 2021-02-25 17:03:01 · 2033 阅读 · 0 评论 -
面试必备算法|图解冒泡排序(Python)
冒泡排序冒泡排序的思想比较相邻的元素。如果第一个比第二个大(升序),就交换他们两个;对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数;针对所有的元素重复以上的步骤,除了最后一个;持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。图解冒泡排序(第一轮循环)冒泡排序的性质最优时间复杂度:O(n)O(n)%O(n)(表示遍历一次发现没有任何可以交换的元素,排序结束。)最坏时间复杂度:O(n2)O(n^2)O(n2)稳定性原创 2021-02-25 17:01:48 · 2091 阅读 · 0 评论 -
面试必备算法|二分查找的思想和实现(Python)
3.1.2 二分查找 二分查找是一种通过减少查找次数来提高效率的查找方法,它有一个重要的前提就是要保证被查找对象是一个有序列表,二分查找的步骤及图解如下:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表;重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。二分原创 2021-02-25 17:00:36 · 2079 阅读 · 0 评论 -
面试必备算法|顺序查找的思想和实现(Python)
查找 从原理上看,查找算法很简单,其核心就是从某个数组中找到某个元素是否存在,如果存在则返回True,不存在则返回False。顺序查找 存储于列表等集合中的数据项彼此存在线性或顺序的关系,数据项的位置就是他的下标,因为下标是有序的,所以能够顺序访问,因此可以进行顺序查找。无序列表的顺序查找 顺序查找的思想就是从头遍历到尾去找到列表中是否存在要查找的元素,当我们进行查找的列表是没有大小顺序的时候我们只能把整个列表都遍历一遍。 代码的实现方式如下:def seqS原创 2021-02-25 16:58:52 · 1354 阅读 · 0 评论 -
数据结构必会|一个例子弄懂动态规划(附万能Python代码)
动态规划 在前面的小节中我们了解了递归的基本思想,我们可以把复杂问题转换成极小的问题从而把复杂的问题简单化,我们可以对递归思想进一步的改造,当我们转换的小问题能够重复使用(调用)的时候,产生了一个新的思想——动态规划(Dynamic Programming)。举个例子 举个在生活中非常常见的例子来讲解一下动态规划:在纸币广泛流行的时代,我们使用纸币购物的时候总是会涉及到找零的问题,假设我们身上有足够的1、5、10、20、50元面值的纸币,我们的目标就是对于给定的找零数值n,使得我们使用原创 2021-02-25 16:56:05 · 2743 阅读 · 1 评论 -
数据结构必会|递归的思想和实现(Python)
递归1. 递归 递归是数据结构中也是我们平时写代码的时候非常常用的一种思想,通过递归可以将问题不断地分成更小的子问题,直到子问题能够用普通的方法解决,通常情况下,递归会使用一个不停调用自己的函数来实现。 有很多人会将循环和递归放在一起做比较,下面通过一个小案例来看一下递归和循环的差别。 举个例子:计算[1,2,3,4,5]的加和。使用循环count = 0numList = [1, 2, 3, 4, 5]for i in numList: count += ico原创 2021-02-25 16:53:08 · 2184 阅读 · 0 评论 -
数据结构必会|链表的思想和实现(Python)
链表1. 链表的概念 链表的结构就像平时生活中所见到的锁链一样,是一种一环套着一环的结构。在数据结构的链表中,每一环都由“数据域”和“指针域”两部分构成。具体结构如下图所示: 如图所示就是链表的结构,数据域用户存储当前结点的元素信息,指针域用于链接下一个结点,需要注意的是链表是无序的,也就是说我们只需要维持元素之间的相对位置,并不需要在连续的内存空间中维护这些位置信息。2. 链表的创建 链表的创建和它的原理一样,我们需要对每个结点进行初始化,结点中包含着数据域data和指原创 2021-02-25 16:49:05 · 2224 阅读 · 0 评论 -
数据结构必会|队列和双端队列(Python)
队列1. 队列是什么 队列的思想比较贴近于我们的生活,当我们在超市排队结账的时候,其实就是一个队列的实现,也就是先排队的人先结账,后排队的人后结账的思想。 和栈一样,队列也是一个有序的集合,添加操作发生在尾部,移除操作则发生在头部,新元素会从尾部进入队列,然后一直向前移动到头部,直到成为下一个被移除的元素。 队列的性质规定了最新添加的元素必须在队列的尾部等待,在队列中时间最长的元素排在头部,这种原则被称为FIFO(first-in first-out)2. 队列的实现 队列原创 2021-02-25 16:46:58 · 2422 阅读 · 0 评论 -
数据结构必会|栈的思想及实现(Python)
栈1. 栈是什么 首先举个生活中的例子:盛菜时使用的盘子叠在一起摆放时就是一种栈的结构,使用盘子的时候只能拿走最上面的那个,摆放时会把先洗好的那个放在最下面,这也就构成一种先放后拿的思想,也就是我们栈的思想。 栈是一个有序的集合,它的添加和移除操作总发生在“顶端”(另一端称为底端),栈中的元素离底端越近,代表其在栈中的时间越长,栈的排序原则被称作LIFO(last-in first-out),具体的实现方式如下图所示:2. 栈的实现 在使用Python实现栈的时候,可以原创 2021-02-25 16:44:18 · 2502 阅读 · 0 评论 -
数据结构必会|时间复杂度(附视频讲解)
1.1 数据结构是啥 数据结构是啥呢? 在平常的生活中,我们盖房子需要设计好房屋的钢架结构,去购物的时候有秩序的排队,这都是一种结构体系的体现,数据也是一样的,虽然它是虚拟世界里的东西,但是数据和数据之间也是有着结构和秩序存在的,我们便可以称之为数据结构了。 本文将会由简入繁的讲解算法中常用的各种数据结构。1.2 大O表示法 用盖房子来说,我们可以通过检验房屋抵抗风雨的能力来判断其钢架结构的好坏,对于数据结构和算法我们也有专门用来判断好坏的方式——大O表示法(Big原创 2021-02-25 16:41:58 · 2352 阅读 · 0 评论