![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 88
Perkinl
但行好事,莫问前程
展开
-
红黑树(基于2-3树等价)
红黑树是一种常见的自平衡二叉查找树,经常使用于关联数组、字典,在各类语言的底层实现中被普遍应用,Java的TreeMap和TreeSet就是基于红黑树实现的。转载 2022-06-28 19:17:36 · 308 阅读 · 0 评论 -
2-3查找树
2-结点,含有一个键(及其对应的值)和两条链接,左链接指向的2-3树中的键都小于该结点,右链接指向的2-3树中的键都大于该结点。3-结点,含有两个键(及其对应的值)和三条链接,左链接指向的2-3树中的键都小于该结点,中链接指向的2-3树中的键都位于该结点的 两个键之间,右链接指向的2-3树中的键都大于该结点。...原创 2022-06-24 12:40:23 · 1041 阅读 · 3 评论 -
AVL平衡二叉搜索树
AVL树定义如下:是平衡二叉树或者是一棵空树,或者是具有以下性质的二叉排序树:1. 每个节点的平衡因子只可能是 1、0、-1(绝对值 ≤ 1,如果超过 1,称之为“失衡”)2. 每个节点的左右子树高度差不超过 13. 因为每个结点的高度差不超过1,AVL树搜索、添加、删除的时间复杂度是 O(logn)......原创 2022-06-22 21:25:20 · 303 阅读 · 0 评论 -
字典树(Tire)
字典树,又称单词查找树,Tire树,是一种树形结构,是一种的哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串)原创 2022-06-14 17:22:22 · 397 阅读 · 0 评论 -
线段树(SegmentTree)
线段树(segment tree)顾名思义, 是用来存放给定区间(segment or interval)内对应信息的一种数据结构。原创 2022-06-11 12:02:09 · 668 阅读 · 0 评论 -
最大索引堆(IndexMaxHeap)
索引堆是对堆这种数据结构的优化,是利用真正元素的索引值来组成一个堆,可以映射出一个最大堆或者最小堆,索引堆可分为最大索引堆 (IndexMaxHeap) 和最小索引堆 (IndexMinHeap)原创 2022-06-08 13:48:12 · 222 阅读 · 0 评论 -
优先队列和堆
什么是优先队列?听这个名字就能知道,优先队列也是一种队列,只不过不同的是,优先队列的出队顺序是按照优先级来的;在有些情况下,可能需要找到元素集合中的最小或者最大元素,可以利用优先队列ADT(Abstract Data Type)来完成操作,优先队列ADT是一种数据结构,它支持插入和删除最小值操作(返回并删除最小元素)或删除最大值操作(返回并删除最大元素);这些操作等价于队列的enQueue和deQueue操作,区别在于,对于优先队列,元素进入队列的顺序可能与其被操作的顺序不同,作业调度是优先队列的一个应转载 2021-08-03 10:45:57 · 992 阅读 · 1 评论 -
二叉树与二叉搜索树
本文将从二叉树、二叉搜索树的定义和性质入手,通过代码实现深度认识二分搜索树。什么是二叉树?在我们的现实场景中,比如图书馆我们可以根据分类快速找到我们想要找到的书籍。比如我们要找一本叫做《Java编程思想》这本书,我们只需要根据理工科 —> 计算机 —>Java语言分区就可以快速找到我们想要的这本书。这样我们就不需要像数组或者链表这种结构,我们需要遍历一遍才能找到我们想要的东西。再比如,我们所使用的电脑的文件夹目录本身也是一种树的结构。从上面的描述我们可知,树这种结构具备天然的高效性可以巧妙原创 2021-07-15 14:50:53 · 1639 阅读 · 0 评论 -
最基础的动态数据结构:链表
什么是链表?链表是一种线性结构,也是最基础的动态数据结构。我们在实现动态数组、栈以及队列时,底层都是依托的静态数组,靠resize来解决固定容量的问题,而链表是真正的动态数据结构。学习链表这种数据结构,能够更深入的理解引用(或者指针)以及递归。其中链表分为单链链表和双链链表,本文中所介绍的是单链链表。链表中的数据是存储在一个个的节点中,如下这是一个最基本的节点结构:class Node { E e; Node next; // 节点中持有下一个节点的引用}我们可以将链表想象成火车,每一节车转载 2021-07-13 13:15:59 · 797 阅读 · 0 评论 -
栈Stack和队列Queue
栈(Stack)栈是一种线性结构。相比数组,栈对应的操作是数组的子集,所以我们完全可以基于动态数组去实现它栈只能从一端添加元素,也只能从同一端取出元素,这一端称为栈顶栈是一种后进先出的数据结构(Last In First Out 简称为LIFO)栈最常见的应用场景:括号匹配-编译器无处不在的Undo操作(撤销),将我们每次的操作放入栈中,执行撤销操作时只需要把放入的元素出栈即可程序调用的系统栈,方法调用时所展现的调用层级,就是栈的结构,如下图:栈的基本结构我们将基于前面所实现的动转载 2021-07-01 22:46:14 · 187 阅读 · 1 评论 -
对Java静态数组的二次封装
数组的特点数组最大的优点是可以快速查询,因为数组直接通过索引查询很快:array[2],所以在随机访问时有一定的优势。其数据结构是简单的线性序列,这使得元素访问非常快速,并且按照索引遍历数组方便。数组最好应用于“索引有语意”的情况但并非所有有语意的索引都适用于数组,例如索引是身份证号这种长度的数字,就无法作为索引使用而数组也同样可以处理“索引没有语意”的情况数组的缺点:根据内容查找元素速度慢数组的大小一经确定不能改变数组只能存储一种类型的数据插入、指定删除元素效率低未封装任何方法,所转载 2021-07-01 13:06:01 · 198 阅读 · 1 评论 -
(五) 数据结构 - 归并排序
归并排序归并排序是一种基于分而治之的排序技术。最坏情况下的时间复杂度为O(nlogn),它是最受人尊敬的算法之一。归并排序首先将数组分成相等的两半,然后以排序的方式将它们合并。核心思想为了理解合并排序,我们采用未排序的数组,如下所示我们知道归并排序首先将整个数组迭代地分成相等的一半,除非获得原子值。我们在这里看到一个由8个项目组成的数组分为两个大小为4的数组。这不会...原创 2019-12-08 20:17:20 · 4330 阅读 · 0 评论 -
(五) 数据结构 - 归并排序
归并排序归并排序是一种基于分而治之的排序技术。最坏情况下的时间复杂度为O(nlogn),它是最受人尊敬的算法之一。归并排序首先将数组分成相等的两半,然后以排序的方式将它们合并。核心思想为了理解合并排序,我们采用未排序的数组,如下所示我们知道归并排序首先将整个数组迭代地分成相等的一半,除非获得原子值。我们在这里看到一个由8个项目组成的数组分为两个大小为4的数组。这不会更改原件中项目出现的顺序。现在我们将这两个数组分为两半。我们进一步划分这些数组,并获得无法再划分的原子值现在,我们将它原创 2021-01-05 23:23:15 · 4014 阅读 · 0 评论 -
(七) 数据结构 - 最大堆
最大堆堆是一种数据结构,一种叫做完全二叉树的数据结构。排序根据“堆属性”,其决定了树中节点的位置。堆的常用场景: 构建优先队列 支持堆排序 快速找出一个集合中的最小值(或者最大值) 二叉堆(Binary Heap) 二叉堆是一颗完全二叉树 堆中某个节点的值总是大于等于(或小于等于)其子节点, 对应的就是最大堆和最小堆 可以用数组存储二...原创 2019-12-28 20:41:51 · 4728 阅读 · 0 评论 -
(六) 数据结构 - 快速排序
快速排序快速排序是一种排序执行效率很高的排序算法,它利用分治法来对待排序序列进行分治排序,它的思想主要是通过一趟排序将待排记录分隔成独立的两部分,其中的一部分比关键字小,后面一部分比关键字大,然后再对这前后的两部分分别采用这种方式进行排序,通过递归的运算最终达到整个序列有序。核心思想快速排序(英语:Quicksort),又称划分交换排序(partition-exchange sor...原创 2019-12-11 09:12:59 · 5676 阅读 · 0 评论 -
(四) 数据结构 - 希尔排序
希尔排序希尔排序是一种高效的排序算法,它基于插入排序算法。如果较小的值在最右边并且必须移到最左边,则该算法避免了在插入排序的情况下的大移位。该算法对广泛分布的元素使用插入排序,首先对它们进行排序,然后对间距较小的元素进行排序。该间隔称为间隔。该间隔是根据Knuth的公式计算的(h = h * 3 +1其中-h是初始值为1的间隔)对于中等大小的数据集,此算法非常有效,因为该算法的平均复...原创 2019-11-06 13:32:51 · 4588 阅读 · 0 评论 -
(三) 数据结构 - 冒泡排序
冒泡排序冒泡排序是一种简单的排序算法。该排序算法是基于比较的算法,其中比较每对相邻元素,如果元素不按顺序交换。该算法不适用于大型数据集,因为其平均和最坏情况下的复杂度为Ο(n^2),其中n是项数。核心思想我们以未排序的数组为例。冒泡排序需要Ο(n^2)的时间,因此我们将其简短而精确。冒泡排序从头两个元素开始,然后比较它们以检查哪个更大。在这种情况下,值33大于14,...原创 2019-11-05 13:26:00 · 4177 阅读 · 0 评论 -
(二) 数据结构 - 插入排序
插入排序这是基于就地比较的排序算法。在此,将始终维护一个子列表。例如,数组的下部保持被排序。要“插入”此排序子列表中的元素,必须找到其适当的位置,然后将其插入到该位置。因此,名称,插入排序。依次搜索该数组,然后将未排序的项目移动并插入到已排序的子列表中(在同一数组中)。该算法不适用于大型数据集,因为其平均和最坏情况下的复杂度均为Ο(n^2),其中n是项数。但是在近乎有序的数组中,效率...原创 2019-11-05 12:45:08 · 3933 阅读 · 0 评论 -
(一) 数据结构 - 选择排序
选择排序选择排序是一种简单的排序算法。此排序算法是一种基于就地比较的算法,其中,列表分为两部分,左端为已排序部分,右端为未排序部分。最初,已排序部分为空,未排序部分为整个列表。从未排序的数组中选择最小的元素,并与最左边的元素交换,该元素成为排序数组的一部分。此过程继续将未排序的数组边界向右移动一个元素。该算法不适用于大型数据集,因为其平均和最坏情况下的复杂度均为Ο(n^2),其中n是...原创 2019-11-05 12:40:29 · 4086 阅读 · 0 评论 -
数据结构之循环队列(Java实现)
理论参考其他文章!!!我们假设一个队列有n个元素,则顺序存储的队列需建立一个大于n的数组,并把队列的所有元素存储在数组的前n个单元,数组下标为0的一端即是队头。所谓的入队列操作,其实就是在队尾追加一个元素,不需要移动任何元素,因此时间复杂度为0(1)。与栈不同的是,队列元素的出列是在队头,即下标为0的位置,那也就意味着,队列中的所有元素都得向前移动,以保证队列的队头(也就是下标为0的位置)不为空,...原创 2018-07-15 13:12:55 · 5766 阅读 · 2 评论