![](https://img-blog.csdnimg.cn/20190927151101105.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
数据结构
文章平均质量分 54
数据结构与手撕代码
你们卷的我睡不着QAQ
学生党一枚,平时看Python和Java多一点。一般看到什么就记录什么,看到好的文章会给大家分享,希望能得到看官老爷的喜爱。
展开
-
优先队列与二叉堆
优先队列与二叉堆优先队列优先队列是队列的一种变型,它又有一个别名:堆我们大家肯定都知道队列,队列遵循FIFO的原则:先出先进。但是优先队列则不再遵循先入先出的原则,而是分为两种情况:最大优先队列,无论入队顺序如何,都是当前最大的元素优先出队最小优先队列,无论入队顺序如何,都是当前最小的元素优先出队例如有一个最大优先队列,其中的最大元素是8,那么虽然8并不是队头元素,但出队时仍然让元素8首先出队。那么如何实现呢?就用二叉堆来实现:二叉堆其实和完全二叉树类似二叉堆有两种:大顶堆(最大堆的任原创 2022-02-06 17:58:44 · 863 阅读 · 0 评论 -
基本数据结构之二叉排序树(用Java语言实现)
二叉排序树二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree)或二叉搜索树。二叉排序树为满足以下条件的树:◎ 若左子树不空,则左子树上所有节点的值均小于它的根节点的值;◎ 若右子树不空,则右子树上所有节点的值均大于或等于它的根节点的值;◎ 左、右子树也分别为二叉排序树。如图4-10所示便是一个二叉排序树。插入操作在二叉排序树中进行插入操作时只需找到待插入的父节点,将数据插入即可,具体流程如下。(1)将待插入的新节点与当前节点进行比较,如果两个原创 2022-01-30 19:57:38 · 1736 阅读 · 0 评论 -
基本数据结构之图
图图是由有穷非空集合的顶点和顶点之间的边组成的集合,通常表示为G(V,E),其中G表示一个图,V是图G中顶点的集合,E是图G中边的集合。在线性结构中,每个元素都只有一个直接前驱和直接后继,?要用来表示一对一的数据结构;在树形结构中,数据之间有着明显的父子关系,每个数据和其子节点的多个数据相关,?要用来表示一对多的数据结构;在图形结构中,数据之间具有任意关系,图中任意两个数据元素之间都可能相关,可用来表示多对多的数据结构。图根据边的属性可分为无向图和有向图。无向图与有向图无向图有向图:邻接矩原创 2022-01-29 22:08:19 · 692 阅读 · 0 评论 -
基本数据结构之红黑树
红黑树红黑树(Red-Black Tree,R-B Tree)是一种自平衡的二叉查找树。在红黑树的每个节点上都多出一个存储位表示节点的颜色,颜色只能是红(Red)或者黑(Black)。是根据AVL树进化而来的,由于AVL树每次插入都需要动态调整,这需要大量的时间,因此出现了红黑树。红黑树不会像AVL树那样,每次插入都需要动态调整。因此当数据经常变化的时候,红黑树的效率要比AVL树要高。红黑树的特性红黑树的特性如下。◎ 每个节点或者是黑色的,或者是红色的。◎ 根节点是黑色的。◎ 每个叶子节点(原创 2022-01-28 20:12:54 · 1623 阅读 · 0 评论 -
基本数据结构之散列表
散列表散列表(Hash Table,也称作哈希表)是根据数据的关键码值(Key-Value)对数据进行存取的数据结构。散列表通过映射函数把关键码值映射到表中的一个位置,从而加快了查找的速度。对于散列表查询,其复杂度是O(1)给定表M,存在函数 f(key),对任意给定的关键字key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为散列表,称函数 f(key)为散列函数。具体的数据结构如图4-9所示:散列表算法通过在数据元素的存储位置和它的关键字(可用key表示)之间建立一个确定的对应关系原创 2022-01-28 16:59:42 · 501 阅读 · 0 评论 -
基本数据结构之链表(用Java语言实现)
链表链表是由一系列节点(链表中的每一个元素都叫作一个节点)组成的数据结构,节点可以在运行过程中动态生成。每个节点都包括两部分内容:存储数据的数据域;存储下一个节点地址的指针域。由于链表是随机存储数据的,因此在链表中插入数据的时间复杂度为O(1),比在线性表和顺序表中插入的效率要高。但在链表中查找一个节点时需要遍历链表中所有元素,因此时间复杂度为O(n);而在线性表和顺序表中查找一个节点的时间复杂度分别为O(logn)和O(1)。链表有 3种不同的类型:单向链表、双向链表及循环链表。链表的特点:链表原创 2022-01-27 22:28:23 · 857 阅读 · 0 评论 -
基本数据结构-队列(用Java语言实现)
队列队列是一种只允许在表的前端进行删除操作且在表的后端进行插入操作的线性表。其中,执行插入操作的端叫作队尾,执行删除操作的端叫作队头。没有元素的队列叫作空队列,在队列中插入一个队列元素叫作入队,从队列中删除一个队列元素叫作出队。因为队列只允许在队头插入,在队尾删除,所以最早进入队列的元素将最先从队列中删除,所以队列又叫作先进先出(FIFO) (first in first out)线性表。具体数据结构如下:方法功能描述add()向队列尾部加一个元素(入队)poll()原创 2022-01-26 21:24:49 · 715 阅读 · 0 评论 -
基础数据结构之栈(用Java语言实现)
栈栈又叫做堆栈;是允许在同一端进行插入与删除操作的特殊线性表。其中执行插入删除操作的一段叫栈顶(Top),另一端为栈底(Bottom)。栈底固定,栈顶浮动。当栈内没有元素时,该栈叫做空栈。插入过程叫做进栈(Push);删除过程叫做出栈(Pop);栈遵循FILO(First in Last Out),先入后出的原则。示意图如下:方法功能描述push()向栈内压入一个数据,在栈的最下面pop()弹出栈顶元素,出栈peek()返回当前栈顶数据首先定义栈的基原创 2022-01-25 22:25:11 · 564 阅读 · 0 评论 -
手撕代码(2)两个有序列表如何变成一个有序列表(Python实现)
首先说好,我这种方法,是最容易想到,但是可能是最降智的想法了这里要讲一下归并排序的归并操作。如果大家懂得归并排序是如何把很多个有序的小数组,归并成大数组的话。这道题就迎刃而解了。首先构造一个空数组作为result对于两个数组,构造两个指针,比较两个数大小,小的那个数进入result数组,然后,指针后移,再进行比较直至,有一个数组全部都被放进result里,那么另一个数组的剩余元素(本来就是有序的)直接放到result里的尾部就可以了废话不说,先上代码:'''leetcode两个有序数组合并原创 2021-06-08 15:19:29 · 296 阅读 · 1 评论 -
手撕代码(3)两数之和;三数之和等等。。。(Python实现)(最降智的实现方式!)
我这种方法只适合刚计算机入门的那种,纯入门。计算机大佬不要喷我!题目给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素示例:给定 nums = [2, 7, 11, 15], target = 9因为 nums[0] + nums[1] = 2 + 7 = 9所以返回 [0, 1]明眼人第一想就是两个for循环,但是复杂度很高 o(n²)''原创 2021-06-08 16:28:38 · 157 阅读 · 0 评论 -
手撕代码(1)快速排序算法Python实现
面试官:你知道什么是天下第一的排序算法吗?我:那肯定是快速排序啦面试官:那你手写一个吧我:。。。。面试官:好了,回家等通知吧!先上代码'''快速排序算法'''def quick_sqrt(array,start,end): mid_data=array[start] left=start right=end if start>=end: return while left<right : while原创 2021-06-08 15:11:48 · 396 阅读 · 0 评论 -
手撕代码(4)利用Python实现斐波那契数列
这也是一道面试经常考察的题首先应该知道什么叫斐波那契数列?1 2 3 5 8 13 。。。。a1=1 a2 =2a3 开始是a1+a2的和以此类推a4=a3+a2a5=a4+a3…这种问题又叫兔子生兔子问题那么怎么实现呢?'''利用python生成菲波那切数列'''item_num=int(input("请输入项数:"))#定义前两项a1=1a2=2count=2if item_num<1: print('请输入正整数')elif item_num=原创 2021-06-14 22:42:24 · 271 阅读 · 2 评论 -
基本数据结构栈
'''栈作为计算机基本数据结构之一,是经常用到的遵循“先进后出”的原则下面是栈的实现形式这个是让栈 底部作为 初值'''class stack: #付给一个初值 def __init__(self): self.item=[] #检验是否为空 def isempty(self): return self.item==[] #进栈操作 def push(self,item): return self..原创 2021-09-15 11:47:14 · 74 阅读 · 0 评论