数据结构
文章平均质量分 96
数据结构初阶讲解,蕴含代码实战,详细解析,知识点丰富
遇事问春风乄
长风破浪会有时,直挂云帆济沧海
展开
-
【数据结构】 Map和Set详解
一般把搜索的数据称为关键字(Key),和关键字对应的称为值(Value),将其称之为Key-value的键值对,所以纯 key 模型,比如:有一个英文词典,快速查找一个单词是否在词典中快速查找某个名字在不在通讯录中Key-Value 模型,比如:统计文件中每个单词出现的次数,统计结果是每个单词都有与其对应的次数:梁山好汉的江湖绰号:每个好汉都有自己的江湖绰号而Map中存储的就是key-value的键值对Set中只存储了Key。原创 2023-09-12 13:44:04 · 3433 阅读 · 66 评论 -
【数据结构】 二叉搜索树的实现
二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根节点的值它的左右子树也分别为二叉搜索树比如以下就为一个人二叉搜索树int[] array ={5,3,4,1,7,8,2,6,0,9};我们创建一个二叉树如下所示,方便后续操作:🚩查找关键字key若根节点不为空:否则,返回false🚩插入关键字key插入操作可以分为以下两种情况:🚩删除关键字key设待删除结点为原创 2023-09-10 14:52:50 · 1431 阅读 · 24 评论 -
【数据结构】 七大排序详解(贰)——冒泡排序、快速排序、归并排序
冒泡排序是一种非常容易理解的排序时间复杂度:O(N^2)空间复杂度:O(1)稳定性:稳定什么时候最快当输入的数据已经是正序时(都已经是正序了,我还要你冒泡排序有何用啊)。什么时候最慢当输入的数据是反序时(写一个 for 循环反序输出数据不就行了,干嘛要用你冒泡排序呢,我是闲的吗)。快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序时间复杂度:O(N*logN)空间复杂度:O(logN)稳定性:不稳定。原创 2023-09-08 20:08:40 · 2048 阅读 · 24 评论 -
【数据结构】 七大排序详解(壹)——直接插入排序、希尔排序、选择排序、堆排序
希尔排序是对直接插入排序的优化。当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。这样整体而言,可以达到优化的效果。我们实现后可以进行性能测试的对比。希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定,以下来自大佬的给出的解释《数据结构(C语言版)》— 严蔚敏《数据结构-用面向对象方法与C++描述》— 殷人昆稳定性:不稳定直接选择排序思考非常好理解,但是效率不是很好。原创 2023-09-07 16:28:48 · 2587 阅读 · 60 评论 -
【数据结构】堆的基础功能实现与PriorityQueue
此处只是列出了PriorityQueue中常见的几种构造方式。// 创建一个空的优先级队列,底层默认容量是11// 创建一个空的优先级队列,底层的容量为initialCapacity// 用ArrayList对象来构造一个优先级队列的对象// q3中已经包含了三个元素。原创 2023-09-06 15:17:18 · 1833 阅读 · 53 评论 -
【数据结构】 优先级队列(堆)与堆的建立
前面介绍过队列,队列是一种先进先出(FIFO)的数据结构,但有些情况下,操作的数据可能带有优先级,一般出队列时,可能需要优先级高的元素先出队列,该中场景下,使用队列显然不合适。比如:在手机上玩游戏的时候,如果有来电,那么系统应该优先处理打进来的电话;初中那会班主任排座位时可能会让成绩好的同学先挑座位。在这种情况下,数据结构应该提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象。这种数据结构就是优先级队列(Priority Queue)。为了模拟实现优先级队列的模拟实现,JDK1.8中的Pri原创 2023-09-04 21:01:35 · 2158 阅读 · 63 评论 -
【数据结构】 二叉树面试题讲解->叁
二叉树的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于二叉树的应用题目,马上要进行秋招了。希望对你们有帮助 _😀给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。🐱🐉示例:📌示例一我们可以使用递归的方法得到二叉树的前序遍历,并在递归时加上额外的括号。会有以下 4种情况:如果当前节点有原创 2023-09-03 16:01:03 · 2212 阅读 · 27 评论 -
【数据结构】 二叉树面试题讲解->贰
二叉树的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于二叉树的应用题目,马上要进行秋招了。希望对你们有帮助 _😀编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。输入包括1行字符串,长度不超过100。可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列原创 2023-09-02 15:40:04 · 3084 阅读 · 61 评论 -
【数据结构】 二叉树面试题讲解->壹
二叉树的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于二叉树的应用题目,马上要进行秋招了。希望对你们有帮助 _😀给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。🐱👓示例:📌示例一这道题我们利用递归的思想,遍历两棵树的每一个结点,分别对两棵树相对应结点进行判断对于结点的判断我们有如下几个情况整体思想,若两棵树左子树与右子树全部相等就返回true🌳另一棵树的子树🐱👤原创 2023-09-01 12:43:21 · 1770 阅读 · 19 评论 -
【数据结构】二叉树的存储与基本操作的实现
二叉树的存储结构分为:顺序存储和类似于链表的链式存储这里博主讲一下链式存储二叉树的链式存储是通过一个一个的节点引用起来的,常见的表示方式有二叉和三叉表示方式二叉表示:三叉表示:这里博主主要讲解一下孩子表示法在学习二叉树的基本操作前,需先要创建一棵二叉树,然后才能学习其相关的基本操作。由于现在大家对二叉树结构掌握还不够深入,为了降低大家学习成本,此处手动快速创建一棵简单的二叉树。创建如下:注意:上述代码并不是创建二叉树的方式,真正创建二叉树方式后序详解重点讲解在我们对二叉树进行基本操作之前,我们的先来原创 2023-08-30 16:16:05 · 3654 阅读 · 50 评论 -
【数据结构】树与二叉树
树是一种非线性的数据结构,它是由n(n>=0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:有一个特殊的结点,称为根结点,根结点没有前驱结点除根结点外,其余结点被分成M(M > 0)个互不相交的集合T1、T2、…、Tm,其中每一个集合Ti (1原创 2023-08-29 13:38:28 · 2508 阅读 · 38 评论 -
【数据结构】 栈与队列的相互实现
队列与栈的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于队列与栈的应用题目,马上要进行秋招了。希望对你们有帮助 _😀请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(push、top、pop 和 empty)。实现 MyStack 类:📌注意事项:你只能使用队列的基本操作 —— 也就是 push to back、peek/pop from front、size 和 is empty 这些操作。你所使用的语言也许不支持队列。 你可以使用 l原创 2023-08-28 22:10:13 · 1672 阅读 · 37 评论 -
【数据结构】详解环形队列
队列的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于队列的应用题目,马上要进行秋招了。希望对你们有帮助 _😀设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作原创 2023-08-28 19:09:27 · 1622 阅读 · 15 评论 -
【数据结构】 队列(Queue)与队列的模拟实现
队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有==先进先出FIFO(FirstIn First Out) ==入队列:进行插入操作的一端称为队尾(Tail/Rear) 出队列:进行删除操作的一端称为队头(Head/Front)在Java中,Queue是个接口,底层是通过链表实现的。队列在使用时有以下方法:注意:Queue是个接口,在实例化时必须实例化LinkedList的对象,因为LinkedList实现了Queue接口。使用如下:运行结果如下:队列中既然可原创 2023-08-28 14:18:49 · 1414 阅读 · 34 评论 -
【数据结构】 栈(Stack)的应用场景
栈(Stack)又名堆栈,作为一个== 先进后出== 的数据结构。它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。原创 2023-08-26 10:48:44 · 3678 阅读 · 57 评论 -
【数据结构】 栈(Stack)与栈的模拟实现
🎈栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。出数据在栈顶。比如下面数据的出栈与进栈就像枪的弹匣一样,先压进去的子弹,最后出来在java中,提供了这些方法用于操作栈使用如下:##🌳 栈的模拟实现从下图中可以看到,Stack继承了Vector,Vector和Ar原创 2023-08-25 21:53:47 · 1913 阅读 · 36 评论 -
【数据结构】 LinkedList的模拟实现与使用
LinkedList 的官方文档LinkedList的底层是双向链表结构(链表后面介绍),由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。// add(elem): 表示尾插 list . add(2);// 在起始位置插入0 list . add(0 , 0);原创 2023-08-23 18:15:26 · 3441 阅读 · 57 评论 -
【数据结构】 单链表面试题讲解->叁
🌏引言单链表的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _😀给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。注意,函数返回结果后,链表必须 保持其原始结构 。我们发现,两个链表如果相交那我们就可以让长链表先走等于它们之间差值的步数然后再同时出发,原创 2023-08-22 17:19:59 · 1828 阅读 · 36 评论 -
【数据结构】单链表面试题讲解->贰
单链表的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _😀将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。建立一个虚拟节点为newList;建立虚拟节点的目的:虚拟节点不便移动,需要记录当前位置,最后返回newList.next;那我们就需要一个指针可以向后移动,连接list1与list2比较的较小值合并思想:结束条件:当list1为null或者list2wei空时代码实现如下:原创 2023-08-21 16:36:06 · 1432 阅读 · 43 评论 -
【数据结构】链表的回文结构
单链表的操作算法是笔试面试中较为常见的题目。本文将着重介绍平时面试中常见的关于链表的应用题目,马上要进行秋招了。希望对你们有帮助 _😀对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。🚩🚩示例:🚩🚩思路解析:回文字符串的中间节点两边的元素,如果从两头两中间进行比对的话,每一个里面的元素完全相同我们先寻找到中间节点,然后将中间节点后的链表部分原创 2023-08-20 18:14:17 · 1644 阅读 · 38 评论 -
【数据结构】 单链表面试题讲解->壹
给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。数据范围: 0≤n≤1000要求:空间复杂度 O(1) ,时间复杂度 O(n) 。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:(1)定义两个指针: pser 和 sur ;sur 在前 pser 在后。(2)sur用于遍历,pser用于交换位置,并插入到头节点前面(3)将head里面的n原创 2023-08-19 18:26:54 · 1382 阅读 · 24 评论 -
【数据结构】 链表简介与单链表的实现
在【数据结构】 ArrayList简介与实战中我们已经熟悉了ArrayList的使用,并且进行了简单模拟实现。通过源码知道,ArrayList底层使用数组来存储元素由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,因此ArrayList不适合做任意位置插入和删除比较多的场景。 因此:java集合中又引入了LinkedList,即链表结构。链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引原创 2023-08-18 20:14:52 · 1852 阅读 · 46 评论 -
【数据结构】 ArrayList简介与实战
在集合框架中,ArrayList是一个普通的类,实现了List接口,具体框架图如下。原创 2023-08-17 20:38:56 · 1968 阅读 · 35 评论 -
【数据结构】 List与顺序表及接口的实现
在集合框架中,List是一个接口,继承自Collection。Collection也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:List 的官方文档站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。List中提供了好的方法,具体如下:注意:List是个接口,并不能直接用来实例化。原创 2023-08-17 12:13:08 · 1417 阅读 · 27 评论 -
【数据结构】 简单认识包装类与泛型
在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。除了 Integer 和 Character, 其余基本类型的包装类都是首字母大写。装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型,有了装箱拆箱,java可以根据上下文,自动进行转换,极大的简化相关编程。可以看到在使用过程中,装箱和拆箱带来不少的代码量,所以为了减少开发者的负担,java 提供了自动机制。当我们查看实现逻辑时,发现java原创 2023-08-16 17:39:05 · 1913 阅读 · 51 评论 -
【数据结构】 时间和空间复杂度
算法效率分析分为两种:第一种是==时间效率==,第二种是==空间效率==。==时间效率被称为时间复杂度==,==而空间效率被称作空间复杂度==。 时间复杂度主要衡量的是一个算法的运行速度,而空间复杂度主要衡量一个算法所需要的额外空间原创 2023-08-15 18:28:46 · 1529 阅读 · 46 评论 -
【数据结构】 初识集合框架
这里博主将简单介绍一下集合框架,想要详细了解的可以点击下方链接进行查看java集合官方教程Java 集合框架,又被称为容器container,是定义在 java.util 包下的一组接口interfaces和其实现类classes。其主要表现为将多个元素element置于一个单元中,用于对这些元素进行快速、便捷的存储store、检索retrieve、管理manipulate,即平时我们俗称的增删查改CRUD。原创 2023-08-14 20:24:41 · 1983 阅读 · 50 评论