![](https://img-blog.csdnimg.cn/20201014180756916.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构与算法
郝开
你可以是一本打开的书,但我要比那复杂一点。
展开
-
什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算
什么是ForkJoin、ForkJoin分支合并、ForkJoin工作窃取、ForkJoin大数据求和计算什么是ForkJoin?ForkJoin:分支合并ForkJoin特点:工作窃取如何让使用ForkJoinForkJoin求和计算Demo什么是ForkJoin?ForkJoin(分支合并)是jdk1.7之后出来的,并行执行任务,提高效率,用在大数据量场景下。大数据:Map Reduce(把大任务拆分成多个小任务,怎么拆分用到了二分算法),每个小任务得出自己的结果,之后再把结果汇总,汇总的过程就是原创 2022-04-05 06:15:00 · 592 阅读 · 0 评论 -
二分查找:在旋转有序的数组中查找元素
二分查找:在旋转有序的数组中查找元素旋转有序的数组代码图解旋转有序的数组二分查找:在旋转有序的数组中查找元素1,3,5,7,9,11,13,15,17,19 ==》11,13,15,17,19,1,3,5,7,9会在某个节点旋转成这个样子,你可以理解为截断,然后拼接代码public class Test3 { /** * 在旋转有序的数组中查找元素 * 1,3,5,7,9,11,13,15,17,19 ==》11,13,15,17,19,1,3,5,7,9原创 2021-12-30 18:33:32 · 238 阅读 · 0 评论 -
二分法:优化死循环和整型溢出模板
在旋转有序的数组中搜索我的二分查找代码模板Arrays.binarySearch()源码我的二分查找代码模板public class Test { /** * 从有序数组中获得下标位置 * * @param num:有序数组 * @param target:入参 * @return */ private static int getIndex(int[] num, int target) { if (num =原创 2021-12-28 17:22:02 · 159 阅读 · 0 评论 -
队列:推荐结果打散
队列:推荐结果打散什么是推荐结果打散?代码图解什么是推荐结果打散?以小视频推荐的那种功能为例,为了圆子,都是包含广告和小视频的。那肯定不能全部推荐广告,必须是几个视频中夹杂着广告,比如你刷了20个,就给你弹一个广告出来,是有一个固定的顺序的。推荐结果打散就是确保每个广告和广告之间,确保包含几个视频,这种效果。代码import java.util.ArrayList;import java.util.LinkedList;import java.util.List;import java.u原创 2021-12-27 17:54:10 · 491 阅读 · 0 评论 -
队列:什么是队列
什么是队列队列就是一种特殊的线性表,只允许从一个方向进,从另一个方向出,后端进,前端出,遵行先进先出的数据结构。执行插入的叫队尾,执行删除的叫对头。原创 2021-12-24 10:19:49 · 360 阅读 · 0 评论 -
队列:用栈来实现队列
用栈来实现队列思路代码图解思路两个栈来实现队列一个栈用来添加元素一个栈用来删除元素只要添加的那个栈不为空,且删除的那个栈为空,就一直往第二个栈取添加代码import java.util.Stack;/** * 两个栈来实现队列 * 一个栈用来添加元素一个栈用来删除元素 * 只要添加的那个栈不为空,且删除的那个栈为空,就一直往第二个栈取添加 */public class MyQueue { Stack<Object> stack1; Stack<Ob原创 2021-12-24 10:51:27 · 350 阅读 · 0 评论 -
栈:栈取区间最大值
栈取区间最大值思路代码图解思路求区间内元素最小值与该区间内所有元素的和的乘积可以用for嵌套,但是这样时间复杂度是O(n²),因此不这么做怎么O(n)来搞定那么只能for循环在求1.最小数和2.区间和去选择一个进行获取,选取最小数,利用栈来存储。区间和则通过空间换时间的方式,利用数组来存储元素区间和。如何用O(1)的时间来取出区间和?存储下标的方式去存储,每次用下标执行操作。int[] nums3 = {5, 2, 3, 4, 1};int[] nums4 = {1, 2, 3, 4, 5原创 2021-12-23 18:23:18 · 444 阅读 · 0 评论 -
栈:栈元素取最小值
栈取最小值思路代码图解思路如何用O(1)的时间取到栈的当前最小值,默认是不存在的,因为栈就是先进后出这一个特点,如果还能O(1)取值,那这么完美的话,其他的数据结构就没必要存在了。方法1:用HashMap去记录min,但是取min-1的值依然很麻烦方法2:借助另一个栈MinStack来操作,元素入栈Stack,同步也入栈MinStack当前最小值,元素出栈,MinStack也同步出栈。代码import java.util.Stack;/** * 求栈元素最小值 * 借助另一个栈MinSt原创 2021-12-22 09:00:00 · 344 阅读 · 0 评论 -
栈:括号匹配验证
栈的应用场景:代码的括号匹配验证根据字符串的括号去验证边界是否匹配:(({}))[]。/** * 基于栈的存储结构,对括号进行匹配验证 */public class Test { public static boolean isVaild(String str) { if (null == str || str.length() == 0) { return true; } Stack<Character>原创 2021-12-21 15:46:12 · 112 阅读 · 0 评论 -
栈:定义及应用场景
什么是栈:栈的定义及应用场景栈的定义应用场景栈的定义栈只能从表的一端存取数据,遵循先进后出原则的线性存储结构通常开口端称为栈顶,封口端成为栈底 因此栈顶元素指距离栈顶最近的元素基于栈的特殊结构及其先进后出的特点,通常只会对其有两种操作往栈中添加元素,此过程称为进栈、入栈、压栈从栈中提取元素,此过程称为出栈、弹栈应用场景浏览器的返回历史功能,后退功能检查代码中的括号匹配问题,是不是成对的...原创 2021-12-21 15:25:02 · 170 阅读 · 0 评论 -
链表:链表相加
链表相加代码链表相加代码图解链表相加代码/** * 链表相加 * Input:(2 → 4 → 3) + (5 → 6 → 4) * Output:7 → 0 → 8 * Explanation:342 + 465 = 807。注意:4+6=10的进位是进到3+4上面的 */public class Test3 { public static class ListNode { Integer val; ListNode next;原创 2021-12-21 14:35:13 · 317 阅读 · 0 评论 -
链表:LRU缓存LinkedHashMap实现
LRU缓存LinkedHashMap实现LRULinkedHashMap:LRU缓存CacheNode :缓存节点node类CompareEntity:排序比较类LinkedHashMap是继承HashMap, 也就是说LinkedHashMap的结构也是和HashMap那样(数组+链表)。LinkedHashMap最大的差别在于Entry的定义上:Entry维护一个before和after的Entry, 每个Entry<K,V>都维护它的上一个元素和下一个元素的关系遍历问题:原创 2021-12-03 18:19:06 · 634 阅读 · 0 评论 -
链表:手写LRU缓存
手写LRU缓存LRU真实场景一般采用LinkedHashMap来实现。import java.util.HashMap;import java.util.Map;/** * LRU是Least Recently Used 近期最少使用算法 * 访问不频繁的在前面,访问较频繁的在后面 */public class LRUCache { /*定义自己的缓存节点*/ private class CacheNode { CacheNode prev;//前节点原创 2021-12-03 16:07:55 · 483 阅读 · 0 评论 -
链表:深度拷贝带随机指针的链表代码1
/**@ClassName Test3.java@author Kai Hao@Description TODO@createTime 2021年11月17日 10:06:00*/import java.util.HashMap;import java.util.Map;/**@author Kai Hao@ClassName Test3.java@Description TODO@createTime 2021年11月17日 10:06:00*/public原创 2021-11-23 22:09:12 · 210 阅读 · 0 评论 -
链表:单链表位置互换代码及图解
单链表位置互换代码图解代码图示代码public class Test { public static class ListNode { Object value; ListNode next; ListNode(Object obj) { value = obj; } @Override public String toString() { ret原创 2021-11-22 15:13:53 · 904 阅读 · 0 评论 -
链表:单链表反转链表代码
反转链表代码public class Test3 { public static class ListNode { Object value; ListNode next; ListNode(Object obj) { value = obj; } @Override public String toString() { return "ListNo原创 2021-11-17 16:10:57 · 595 阅读 · 0 评论 -
数据结构:线性表
数据结构:线性表概念线性表非线性表常规操作时间复杂度插入删除查询为什么数组下标从0开始?ArrayList源码分析:数据结构概念线性表就是数据排成一条线一样的结构。线性表数组:数组是一组连续的内存空间来存储一段相同类型的数据栈队列链表非线性表二叉树图堆常规操作时间复杂度插入是插入,不是替换,是需要往后移的插入时间复杂度:(1+2+3+…+n) / n = n(n+1) / 2n = n/2+1/2 = O(n)最好情况,末位插入,1次,O(1)最坏情况,首位插入,原创 2021-11-16 17:24:07 · 476 阅读 · 0 评论 -
ArrayList源码分析:数据结构
ArrayList源码分析:数据结构ArrayList为什么建议初始化就声明大小?数据结构常规操作时间复杂度插入删除查询源码分析初始化add[根据下标插入]:arraycopyremove[根据下标删除]:arraycopyarraycopy:复制当前数组,根据偏移量移动arraycopy:时间复杂度get查询和set替换get/set时间复杂度扩容源码分析初始化ArrayList的代码ArrayList底层源码逻辑相关变量声明添加的两种方式判断是否是为声明大小的数组和判断扩容ArrayList扩容grow原创 2021-11-16 17:18:41 · 418 阅读 · 0 评论 -
算法复杂度
时间复杂度和空间复杂度算法复杂度空间复杂度复杂度排序算法复杂度算法复杂度分为时间复杂度和空间复杂度。其作用:时间复杂度是指执行算法所需要的计算工作量;空间复杂度是指执行这个算法所需要的内存空间。(算法的复杂性体运行该算法时的计算机所需资源的多少上,计算机资源最重要的是时间和空间(即寄存器)资源,因此复杂度分为时间和空间复杂度。)空间复杂度复杂度排序时间复杂度和空间复杂度都是一样的顺序,由小到大依次为:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2)<Ο(n2)<Ο(n3)<…<Ο(2原创 2021-11-15 17:38:23 · 196 阅读 · 0 评论 -
时间复杂度计算及场景
时间复杂度时间频度时间复杂度时间复杂度时间复杂度计算规则举例时间频度算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法花费的时间与算法中语句的执行次数成正比例,哪个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度。记为T(n)。时间复杂度时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道原创 2021-11-15 15:31:21 · 508 阅读 · 0 评论