数据结构
读大话数据结构有感
MAX_VALUE
走在通往架构的路上
展开
-
LRU-最近最少使用算法
LRU:Least Recently Used也就是最近最少使用的意思,是一种内存管理算法,该算法最早应用于Linux操作系统。这个算法基于一种假设:长期不被使用的数据,在未来被用到的几率也不大。因此,当数据所占内存达到一定阈值时,我们要移除掉最近最少被使用的数据。 redis中的内存管理算法中也用到了LRU,LinkedHashMap中也对LRU进行的具体的实现。现在这里也进行简单的实现。...原创 2021-08-10 18:48:41 · 903 阅读 · 0 评论 -
抢红包算法
红包算法有很多,一般来说,需要满足的规则有以下几点: 1. 所有人抢到的金额之和要等于红包金额,不能多也不能少。 2. 每个人至少抢到1分钱。 3. 要保证红包拆分的金额尽可能分布均衡,不要出现两极分化太严重的情况。public class RedPackage { public static void main(String[] args) { RedPackage redPackage = new RedPa...原创 2021-08-05 17:14:42 · 1072 阅读 · 0 评论 -
位图bitmap
位图算法:bitmap是内存中连续的二进制位(bit)所组成的数据结构,位图算法主要用于对大量整数做去重和查询操作(交集、并集、差集)。因为使用的是位运算,因此性能也是很高的。 jdk中的BitSet就是位图算法的具体实现。public class BitSet implements Cloneable, java.io.Serializable { //一个long元素有64bit,需要移动6位 private final static int A...原创 2021-07-22 17:51:10 · 849 阅读 · 0 评论 -
寻找缺失的整数
位运算:如果一个问题能用到位运算,那么它的的运算性能可大大提升。场景一:在一个无序数组里有99个不重复的正整数,范围是1~100,唯独缺少1个1~100中的整数。如何找出这个缺失的整数? 问题分析:方法一,可双重遍历得到缺失值,时间复杂度为O(n^2)。方法二,可预先将全部的正整数放入到创建的map中,遍历数组时再删除map中对应的值,最后留下来的值即为确实的值。方法三,先将100内的正整数累加,再减去数组中的全部正整数。public class ...原创 2021-07-21 11:43:41 · 348 阅读 · 0 评论 -
如何实现大整数相加
给出两个很大的整数,要求实现程序求出两个整数之和。 将整数拆分成数组计算,这种思想在BigInteger中也有使用,数组中的一位可以存一个数字也可以存一个int值。BigInteger采用的是存一个int值,且使用位运算,效率能提到提升。public class BigNumberSum { public static void main(String[] args) { //给出两个很大的整数,要求实现程序求出两个整数之和,整数可能很大,超过lo...原创 2021-07-19 15:15:39 · 255 阅读 · 0 评论 -
删去k个数字后的最小值
依次求得局部最优解,最终得到全局最优解的思想,叫做贪心算法。public class RemoveKDigits { public static void main(String[] args) { //删去k个数字后的最小值 //等价于删除1个数字后的最小值,循环k次。 RemoveKDigits removeKDigits = new RemoveKDigits(); String num = "10023...原创 2021-07-19 13:41:41 · 146 阅读 · 0 评论 -
寻找全排列的下一个数
public class NearestNumber { public static void main(String[] args) { //寻找全排列的下一个数 如: //12345->12354 //12354->12435 //12435->12453 //对于一个整数来说,倒序排列时最大,顺序排列时最小 NearestNumber nearestNumber = new Ne.原创 2021-07-16 16:43:01 · 218 阅读 · 0 评论 -
使用栈来实现队列
栈的特性是先进后出,队列的特性是先进先处。使用的两个栈,两次先进后出=先进先出。public class StackQueue { //数据的入口 private Stack<Integer> stackA = new Stack<>(); //数据的出口,在stackB为空的前提下,将stackA数据导入 private Stack<Integer> stackB = new Stack<>(); ...原创 2021-08-11 10:47:36 · 140 阅读 · 0 评论 -
无序数组排序后的最大相邻差
public class MaxSortedDistance { public static void main(String[] args) { //无序数组排序后的最大相邻差 MaxSortedDistance maxSortedDistance = new MaxSortedDistance(); int[] array = {10, 11}; System.out.println(maxSortedDistance.getMa.原创 2021-07-09 17:55:09 · 242 阅读 · 1 评论 -
判断一个数是否是2的整数次幂
public class IsPowerOf2 { public static void main(String[] args) { //判断一个数是否为2的整数次幂 IsPowerOf2 isPowerOf2 = new IsPowerOf2(); System.out.println(isPowerOf2.isPowerOf2(64)); System.out.println(isPowerOf2.isPowerOf2ForMet.原创 2021-07-09 11:41:15 · 96 阅读 · 0 评论 -
求两数的最大公约数
public class GreatestCommonDivisor { public static void main(String[] args) { GreatestCommonDivisor divisor = new GreatestCommonDivisor(); System.out.println(divisor.getForMethodOne(15, 25)); System.out.println(divisor.getForM.原创 2021-07-08 16:01:36 · 119 阅读 · 0 评论 -
最小栈的实现
实现一个栈操作,包含入栈push,出栈pop,获取最小值getMin三种方法。且这三种方法的时间复杂度均为O(1)。原创 2021-06-18 10:29:15 · 447 阅读 · 0 评论 -
判断链表是否有环
判断链表是否有环的解法有很多,下面归纳几种常见算法。判断链表是否存在环方法一:通过双循环遍历完成,外层循环从头结点开始遍历,对于遍历到一个新节点newNode,内层循环都要从头结点遍历到该新节点的上一个节点head。如果链表无环,则newNode和head永不相等,否则就会相等。时间复杂度为O(n^2)。public class LinkListCycle { public static class Node { private int data; pr原创 2021-06-15 19:21:35 · 7941 阅读 · 3 评论 -
计数排序
计数排序适用于一定范围内的整数排序。在取值范围不是很大的情况下,它的性能甚至快过那些时间复杂度为O(nlogn)的排序。计数排序,理想情况下时间复杂度可为O(n),即每一个索引位只有一个元素。当数列最大和最小值差距过大时,并不适合用计数排序。当数列元素不是整数时,也不适合用计数排序。public class CountSort { public static void main(String[] args) { CountSort countSo...原创 2021-07-09 15:17:32 · 100 阅读 · 0 评论 -
快速排序
快速排序的算法思想是分治算法,分而治之,将对整体的排序转换成对部分的排序,当部分完成了排序,整体排序也就完成了。算法的时间复杂度为O(nlogn)。public class MyQuickSort { public static void main(String[] args) { //分治思想,分而治之 //从小到大排序 MyQuickSort myQuickSort = new MyQuickSort(); int[] arr原创 2021-06-11 10:42:35 · 85 阅读 · 0 评论 -
堆排序
堆排序是基于二叉堆实现的,时间复杂度为O(nlogn)。堆排序的算法步骤为:1 把无序数组构建成二叉堆。需要从小到大排序,则构建成最大堆;需要从大到小排序则构建成最小堆。2 循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。public class HeapSort { public static void main(String[] args) { HeapSort heapSort = new HeapSort(); int[] array =原创 2021-06-08 17:16:24 · 89 阅读 · 0 评论 -
冒泡排序
冒泡排序的时间复杂度为O(n^2)。算法思想是通过相邻元素的比较交换,将最小元素上浮到最上层。public class BubbleSort { public static void main(String[] args) { //冒泡排序,从小到大 BubbleSort bubbleSort = new BubbleSort(); int[] array = {2, 1, 5, 8, 3, 6}; bubbleSort.sort原创 2021-06-08 14:43:03 · 79 阅读 · 0 评论 -
二分查找
二分查找的时间复杂度为O(logn),操作次数和二叉树的高度相关。使用前提:1.线性表采用顺序存储 2.线性表必须有序(如从小到大)。public class BinarySearch { public static void main(String[] args) { int[] array = {1, 2, 4, 5, 6}; BinarySearch binarySearch = new BinarySearch(); System.原创 2021-06-07 16:28:17 · 149 阅读 · 0 评论 -
优先队列的实现
优先队列的实现是基于最大/最小堆的,队列的特性是先入先出(FIFO)。最大优先队列指的是不管入队顺序如何,队列中的最大元素先出列。最小优先队列指的是不管入队顺序如何,队列中的最小元素先出列。public class PriorityQueue { private int[] array; private int size; public PriorityQueue(int capacity) { this.array = new int[capacit原创 2021-06-07 15:34:53 · 378 阅读 · 0 评论 -
二叉堆的实现
二叉堆本质上是完全二叉树,分为最大堆和最小堆,二叉堆的根节点称为堆顶。最大堆:任意父节点值大于或等于左右孩子节点的值。堆顶为整个堆的最大元素最小堆:任意父节点值小于或等于左右孩子节点的值。堆顶为整个堆的最小元素...原创 2021-06-04 14:32:25 · 214 阅读 · 0 评论 -
二叉树遍历-栈实现
非递归方式实现二叉树的遍历,借助栈或者队列辅助完成。public class MyBinaryTree { public static class TreeNode { private int data; private TreeNode left; private TreeNode right; public TreeNode(int data) { this.data = data;原创 2021-06-04 14:16:29 · 1164 阅读 · 0 评论 -
二叉树的遍历-递归实现
二叉树是一种非线性结构,它的每个节点最多只包含两个孩子节点。常见的二叉树有满二叉树,完全二叉树,二叉查找树。public class MyBinaryTree { public static class TreeNode { private int data; private TreeNode left; private TreeNode right; public TreeNode(int data) {原创 2021-06-03 09:50:49 · 115 阅读 · 0 评论 -
队列的实现
队列是一种先入先出(FIFO)的数据结构,可以使用数组或者链表实现,入队和出队的时间复杂度为O(1)。队列的应用在于重演历史。多线程中争夺公平锁的等待队列,按照优先级出队的优先队列等。循环队列的实现为了维持队列容量的恒定,可以用数组来实现循环队列,此时队列的容量为数组容量-1。public class MyQueue { //队列使用数组存储,队列的容量为数组容量-1 private int[] array; //队头下标 private int front原创 2021-06-02 10:34:47 · 88 阅读 · 0 评论 -
栈的实现
栈是一种先入后出(FILO)的数据结构,其出栈和入栈的时间复杂度均为O(1),实现方式可以是数组或者链表。数组实现方式public class MyArrayStack { private int[] array; private int size; public MyArrayStack(int capacity) { array = new int[capacity]; size = 0; } public stati原创 2021-06-01 16:35:09 · 454 阅读 · 0 评论 -
链表基本操作
链表的查询操作事件复杂度为O(n),更新、插入、删除的事件复杂度(不考虑之前查询)为O(1)。下面以单链表为例public class MyLinkedList { //链表中的头结点 private Node head; //尾结点 private Node last; //链表中元素个数 private int size; private static class Node { private int data;原创 2021-06-01 16:03:27 · 114 阅读 · 0 评论 -
数组基本操作
public class MyArray { private int[] array; private int size; public MyArray(int capacity) { array = new int[capacity]; size = 0; } public static void main(String[] args) { //数组初始化 MyArray myArray = ne.原创 2021-05-31 14:46:24 · 154 阅读 · 0 评论 -
红黑树详解
红黑树是一种重要的数据结构,在jdk中有广泛的应用。Map的实现类中,如TreeMap,HashMap,ConcurrentHashMap等都是使用红黑树作为其底层数据结构。红黑树的查找、插入、删除都有着固定的算法,不管是哪一种编程语言,都是对这种算法的实现。因此掌握红黑树的这些算法思想,在阅读源码的时候对照着流程看会起到事半功倍的效果。在讲红黑树之前,先简单了解下其他树结构的定义。二叉树...转载 2020-01-16 14:26:22 · 372 阅读 · 0 评论