![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java数据结构
文章平均质量分 72
小小太空人w
未来可期,少年有梦!
展开
-
哈希桶的基本操作 || HashMap和HashSet介绍(手撕源码)
一棵搜索树的最快查找数据的时间复杂度是O(logN),虽然这个速度已经是相当快了。但是又提出了,查找数据时间复杂度为O(1)的数据结构。意味着我们要找哪个数据,直接就知道这个数据在哪一块,它就是哈希表。🪖哈希表的存储方式类似于我们之前学过的计数排序。每个数据会有自己相对应的哈希值,根据这个哈希值通过哈希函数计算其下标,存储到数组相应的位置。那么我们要找数据,只需通过哈希函数计算其下标就可在O(1)的时间复杂度内找到。注意:如果不同的数据通过哈希函数计算到了同一个下标怎么办?⚽。原创 2022-10-23 21:35:24 · 949 阅读 · 7 评论 -
二叉搜索树的基本操作 || TreeMap和TreeSet介绍
现在很多地方都需要去查找某个数据,那么查找的效率就显得尤为重要了。二叉搜索树是一颗左孩子比父亲小,右孩子比父亲大的一棵树。那么在这个基础上查找某个数据,一次比较就可以排除一半数据,效率是相当高的。TreeMap的底层是一颗红黑树,红黑树是建立在二叉搜索树结构上的。由于搜索树在极端情况下它的单分支会很长,这样就会增加查找的效率。在这个基础上提出的AVL树,将它的单分支进行旋转。由于可能旋转的次数会很多,又在这个基础上提出了红黑树。原创 2022-10-20 09:51:47 · 1186 阅读 · 14 评论 -
数据结构八大排序;快排、归并非递归 || 万字大总结
🎈排序的算法有很多,对于数据量和数据所存在的特点不同,排序算法的使用场景也会相应的改变,这样才会增加我们程序的效率。原创 2022-10-17 18:19:40 · 662 阅读 · 15 评论 -
模拟实现优先级队列
优先级队列可以很快找出一组数据中最小或者最大的数据,只需改正它建小堆或者大堆。它底层是用数组存储的(顺序存储),所以它是一颗完全二叉树,这样才不会浪费数组空间。这种数据结构对于一些数据的操作带来了很大的便利。这是一个大堆,父亲节点值是要大于它左右孩子值,对于每一个子树都要符合此条件。小堆就是父亲节点值是要小于它左右孩子值,同样的对于每一棵子树也要符合此条件。注意它左右孩子大小值是随机的。原创 2022-10-13 16:53:27 · 659 阅读 · 11 评论 -
二叉搜索树与双向链表
由于双向链表顺序和二叉树中序遍历顺序一致,其实就是在遍历的过程中改变指向,那么确定这个改变的时机就相当重要。要连接根节点和右子树之间的指向,是右子树的左子树递归完成的时候。由于头节点是第一个进行连接的,而头节点的前驱指向空,那么就初始化prev为null。由于需要将二叉树转为双向链表,我们要用每一个节点要去链接上一个节点,中序遍历是采取递归的方法去实现的,所以采用一个成员变量prev去记录上一个节点。复杂的问题,我们可以简单的去分析,当得到一定的结论时就可以全面去思考问题。返回链表中的第一个节点的指针。原创 2022-10-05 16:03:28 · 175 阅读 · 19 评论 -
LeetCode - 二叉树的最近公共祖先
从根节点开始,到这两个节点之间的路径是唯一的。由于这两个路径的长度不一定相等,我们先让元素个数大的栈出掉两个路径之间元素个数的差值,这样就可以保证两个栈的元素个数是相等的。根据题目提示,所有节点的val值都不一致,然后让两个栈同时出元素,它们肯定可以出到元素的val值相等的时候(栈不一定为空),这个节点就是最近的公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个节点 p、q,最近公共祖先表示为一个节点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。原创 2022-10-03 19:55:02 · 683 阅读 · 4 评论 -
二叉树的一些基本操作
二叉树是一颗结构非常特殊的树,每个节点的度都是小于等于2且大于等于0。树是用递归来定义的,而递归的核心思想是子问题思路,那么大多数处理树相关问题,也需这样去思考。前序遍历顺序:根-->左子树-->右子树。在理解子问题思路时,这张图就相当重要。当遍历完根的时候,递归左子树。左子树又是一颗全新的二叉树(左边黑色框框)。到B这个节点的时候,先访问根节点,然后又去递归左子树。到D这个节点,D作为根,又是一颗全新的二叉树(左边绿色框框),然后去递归D的左右子树,都为空,则返回。原创 2022-09-30 23:24:53 · 1258 阅读 · 13 评论 -
Java实现栈和队列
栈和队列是两种特有的存储数据的结构,栈是后进先出的一种结构,队列是先进先出的一种结构。由于这种特有的结构,在选择底层存储方式也有差异。由于栈是后进先出的结构,其实就是尾删,尾增操作,如果用顺序表来存储,尾删、尾增时间复杂度则是O(1)。链表则需考虑链表的结构,如果是单链表,找尾的时间复杂度就是O(n)。如果是记录尾的双向链表,时间复杂度是O(1)。Java中也封装了这样的集合结构(Stack),用的就是顺序表。由于队列是先进先出的结构,其实就是头删,尾增操作。原创 2022-09-29 16:06:08 · 609 阅读 · 3 评论 -
Java实现双向链表
不论是单链表还是双向链表,都有自己特殊的结构,由于单链表找尾节点,和找上一个节点的时间复杂度都是O(n),在这个基础上提出了双向链表的结构,并且有专门的引用去指向尾节点。双向链表具有前驱和后继引用,即每一个节点都可以找到上一个和下一个节点,那么对于链表的一些操作就变得简单起来。对于链表的释放,由于对象是没有被引用后,才会被JVM回收。这里的每一个节点都被两个引用所引用,那么就需要切断每一个节点间的引用,然后再将head和tail置空,这样整个链表都会被JVM回收。原创 2022-09-25 17:22:24 · 517 阅读 · 10 评论 -
LeetCode - 反转链表Ⅱ
对于链表的题目,首先要把握住它的结构特点。单链表,双向链表,不同的结构处理的方法则不同,但是不管怎样处理都需保证它原有的结构。原创 2022-09-20 23:16:20 · 468 阅读 · 6 评论 -
Java实现单链表
链式存储数据分为顺序存储和链表存储,链表就是存在多个节点,每个节点之间存在数据域和指向域(存储下一个节点的引用),这样的数结构可以保证每个节点之间相互关联,从而达到数据之间的关联。不同的数据结构,就会有不同优缺点。链表相对于顺序表,增加数据不需要挪动数据,只需要将新的节点插入即可,删除数据只需要删除相应的节点等等。顺序表是一块连续的内存,而链表是以节点构成数据相关联,内存都是分布开的,对于一些数据的访问顺序表优于链表,等等一些优点。各有所长,根据需求来选择合适的数据存储方式,以提高代码效率。原创 2022-09-17 16:40:36 · 495 阅读 · 14 评论 -
Java实现顺序表
数据结构是一门逻辑非常严谨的学科,当我们实际处理一些数据时,要考虑各种会出现的问题。比如在顺序表中增加数据时,首先要考虑容量够不够用,增加的位置是否合理,等等一些问题,然后才是具体增加数据。数据在内存中存储分为顺序存储(数组)和链式存储(链表),顺序存储就是在内存中分配一块连续的空间来存储一些数据。顺序表就是实现了操作这块内存数据的一些方法。}}}}}}原创 2022-09-11 21:05:13 · 495 阅读 · 14 评论