- 博客(17)
- 收藏
- 关注
原创 数据结构|用堆模拟实现优先级队列
1. 优先级队列概念提供两个最基本的操作,一个是返回最高优先级对象,一个是添加新的对象,这种数据结构就是优先级队列(Priority Queue)。2. Java 提供的优先级队列Java 框架提供了 Priority Queue 和 PriorityBlocking Queue 两种类型的优先级队列,前者是线程不安全的,后者是线程安全的。关于 Priority Queue 的使用要注意:Priority Queue 中放置的元素必须要能够比较大小,不能插入无法比较大小的对象,否则会抛出 Cla
2022-02-06 19:10:28 875
原创 数据结构|堆
1. 堆的概念把元素集合 k = {k0, k1, k2, …, kn-1} 按完全二叉树的顺序存储在一个一维数组中,并满足:ki <= k2i + 1 且 ki <= k2i + 2(ki >= k2i + 1 且 ki >= k2i + 2)i = 0, 1, 2, 3…,则称为小堆(或大堆)。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。堆的性质:堆中某个节点的值总是不大于或者不小于其父节点的值;堆总是一颗完全二叉树。大根堆小根堆
2022-02-06 18:29:46 734
原创 数据结构|二叉搜索树及其常用操作
1. 定义二叉搜索树是一种节点值之间具有一定数量级次序的二叉树,对于树中每个节点:若其左子树存在,则其左子树中每个节点的值都不大于该节点值;若其右子树存在,则其右子树中每个节点的值都不小于该节点值。2. 常用操作public class Node { public int key; public Node left; public Node right; public Node(int key){ this.key = key; }
2022-02-05 15:45:42 719
原创 数据结构|二叉树及其基本操作
二叉树1. 几种特殊的二叉树满二叉树:一个二叉树,如果每一层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为 k,且结点总数是 2 ^ k - 1,则他就是满二叉树。完全二叉树:完全二叉树是效率很高的数据结构,完全二叉树是由满二叉树而引出来的。对于具有n个结点的二叉树按层序编号,如果每个结点的编号与同样深度的满二叉树中对应编号的结点在二叉树中位置完全相同,则该二叉树称为完全二叉树。二叉搜索树(BSTree):一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空
2022-01-27 15:17:13 1629
原创 数据结构|队列(Queue)
1. 队列队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)。入队列:进行插入操作的一端称为队尾(Tail/ Rear)。出队列:进行删除操作的一端称为队头(Head/ Front)。2. Java中的组织关系创建队列LinkedList 实现了 Queue 接口。Queue<String> queue = new LinkedList<>();3. 实现自己的队列Queu
2022-01-26 21:14:49 449
原创 数据结构|栈及其Java实现
栈及其Java实现1. 栈栈:一种特殊的线性表,只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一段为栈顶,另一端称为栈底。栈中的元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈。出栈:栈的删除操作叫做出栈。2. Java中的组织关系常见操作Stack<String> stack = new Stack<>();stack.push(e); // 压栈e = stack.pop()
2022-01-26 20:59:18 346
原创 数据结构|链表及Java实现
线性表-链表1. 原理把结点看成对象,对象中有两个属性:这个结点中装的元素;下个结点的位置(指向下个结点对象的引用)。class Node { int val; // 保存元素 Node next; // 保存指向下一个结点的引用;其中尾结点的 next == null}我们通过链表的头结点,来代表一整条链表。2. 链表的常见操作2.1 链表的结点定义public class Node { public String val; public Node pr
2022-01-26 19:53:47 465
原创 剑指Offer|JZ24_反转链表
JZ24_反转链表描述给定一个单链表的头结点pHead(该头节点是有值的,比如在下图,它的val是1),长度为n,反转该链表后,返回新链表的表头。数据范围: n\leq1000n≤1000要求:空间复杂度 O(1)O(1) ,时间复杂度 O(n)O(n) 。如当输入链表{1,2,3}时,经反转后,原链表变为{3,2,1},所以对应的输出为{3,2,1}。以上转换过程如下图所示:题解反转链表总的思路是:需要该节点、前驱节点、后继节点,这三个节点的引用;在遍历节点的过程中,通过引用,控制
2022-01-24 16:35:32 352
原创 剑指Offer|JZ6_从尾到头打印链表
JZ6_从尾到头打印链表描述输入一个链表的头节点,按链表从尾到头的顺序返回每个节点的值(用数组返回)。如输入{1,2,3}的链表如下图:返回一个数组为[3,2,1]0 <= 链表长度 <= 10000示例1输入:{1,2,3}返回值:[3,2,1]示例2输入:{67,0,24,58}返回值:[58,24,0,67]题解一:栈利用栈先进后出机制,将所有元素压栈;依次出栈,保存在顺序表中。代码展示import java.util.Stack;import ja
2022-01-24 16:27:57 100
原创 数据结构|顺序表 vs 链表
顺序表 vs 链表顺序表:优点:空间连续、支持随机访问;缺点:1. 中间或前面部分的插入删除时间复杂度 o(n); 2. 增容代价大。链表缺点:以节点为单位存储,不支持随机访问;优点:1. 任意位置插入删除时间复杂度 o(1); 2. 没有增容问题,插入一个开辟一个空间。我们平时使用 List 的场景下,可以 ArrayList 作为默认选项。常见方法时间复杂度:...
2022-01-23 20:28:12 295
原创 为什么顺序表不能下标访问
为什么顺序表不能下标访问Java 中所有的引用类型,主要有三大类:接口类引用类类型引用数组类型引用(下标 [ ] 这种运算符,只能作用于数组类型的引用)
2022-01-23 20:05:29 131
原创 数据结构|顺序表及Java实现
数据结构|顺序表及Java实现1. 认识线性表和顺序表线性表(linear list)是n个具有相同特征的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、栈、队列、字符串…线性表在逻辑上是线性结构的,但是在物理结构上并不一定是连续的。1.1 顺序表逻辑上线性,在内存中存储时,也是严格按照逻辑上的次序保存起来的。1.2 链表逻辑上线性,在内存中存储时,不保证连续性。1.2 数组数组就是一种“不是非常完备”的顺序表。数组中存在的问题:a. 无法严格
2022-01-23 20:02:16 543
原创 多线程|sleep和wait的区别
Thread.sleep(5000) 和 o.wait(5000) 有何区别?根本区别:语义不同sleep: 休眠5秒,保证一定能休眠5秒;wait: 等待通知,最多等五秒,不保证一定能休眠够5秒,一旦被通知了,可以立即醒来。表象上的区别:sleep调用,不需要持有锁;wait调用,必须持有 o 这个锁;sleep休眠过程不会释放锁;wait休眠过程,会释放锁,但只会释放 o 这个对象锁,其他持有锁不释放。...
2022-01-23 15:36:44 633
原创 数据结构|排序(三)(归并排序)
9. 归并排序9.1 原理归并排序,是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一种非常典型的应用。将已有序的子序列合并,得到完全有序的序列:即先使每个子序列有序,再使子序列段有序。若将两个有序表合并成一个有序表,称为二路归并。9.2 实现public static void mergeSort(long[] array) { mergeSortRange(array, 0, array.length);}// [from, t
2022-01-22 18:52:49 319
原创 数据结构|排序(二)(快速排序)
8. 快速排序8.1 原理从待排序区间选择一个数,作为基准值(pivot);Partition:遍历整个待排序区间,将比基准值小的(可以包含相等的)放到基准值的左边(不要求任何顺序),将比基准值大的(可以包含相等的)放到基准值的右边;采用分治思想,对左右两个小区间按照相同的方法处理,直到小区间的长度 == 1,代表已经有序,或者小区间的长度 == 0,代表没有数据。8.2 实现public static void quickSort(long[] array) { quickSort
2022-01-22 17:23:55 199
原创 代码块执行顺序
1. 在没有继承关系上的执行顺序public class Person { public String name; public int age; public Person(String name, int age){ this.name = name; this.age = age; System.out.println("构造方法执行"); } { System.out.println("实例代
2022-01-22 13:52:16 457
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人