数据结构
文章平均质量分 94
Kevin_cai09
无情的bug maker
展开
-
动态规划专题
动态规划文章目录动态规划一,最大/最小问题1.1 [使用最小花费爬楼梯](https://leetcode-cn.com/problems/min-cost-climbing-stairs/)1.2 [最小路径和](https://leetcode-cn.com/problems/minimum-path-sum/)1.3 [零钱兑换](https://leetcode-cn.com/problems/coin-change/)1.4 [下降路径最小和](https://leetcode-cn.com/p原创 2021-01-17 22:18:18 · 701 阅读 · 0 评论 -
go常用排序算法
go常用排序算法之前写过一篇用java实现的常用排序算法的博客,可以参考,这次改用go语言实现,一来用来复习下排序算法,二来也可以学习下go语言,java常用排序算法总结一,冒泡排序/**冒泡排序 */func bubbleSort(data []int){ for i := 0;i < len(data) - 1;i++{ for j := 0;j < len...原创 2020-12-31 17:51:24 · 858 阅读 · 0 评论 -
动态规划(字符串各种最长序列,子串等问题)
动态规划(字符串各种最长序列,子串等问题)文章目录动态规划(字符串各种最长序列,子串等问题)1.判断子序列2.最大子序和3.乘积最大子序列4.最长重复子数组5.最长公共子序列6.最长定差子序列7.最长回文子序列8.最长回文子串9.最长上升子序列1.判断子序列 /** * 判断子序列 * @param s * @param t * @return...原创 2020-12-31 17:51:47 · 672 阅读 · 0 评论 -
leetcode栈和队列专题
文章目录leetcode栈和队列专题1.栈相关最小栈二叉树遍历二叉树前序遍历二叉树中序遍历二叉树后序遍历逆序栈元素排序栈括号匹配问题验证栈序列2.队列相关设计循环队列3.组合设计栈实现队列队列实现栈leetcode栈和队列专题本人大三,目前在准备明年的春招,有问题欢迎及时指出,希望跟大家一起进步1.栈相关最小栈使用双栈来实现最小栈,其中,一个数据栈保存push的所有数据,一个最小栈...原创 2020-12-31 17:52:21 · 477 阅读 · 0 评论 -
从redis源码看数据结构(二)字符串
文章目录从redis源码看数据结构(二)字符串一,redis中的字符串1.基本数据结构2.创建一个字符串3.字符串拼接二,java中的字符串String1.String类结构2. String数据结构定义3.构造方法4.String常用方法5.String真的不可变吗?从redis源码看数据结构(二)字符串作者今年大三,正在准备明年的春招,文章中有写得不对的,希望大家及时指出文章中的错误的地...原创 2019-10-27 20:22:12 · 312 阅读 · 0 评论 -
数据结构 - 跳跃链表
文章目录数据结构 - 跳跃链表一,为什么会有跳表?二,跳表结构三,跳表元素查询四,跳表元素插入五,跳表元素删除六,完整代码数据结构 - 跳跃链表作者今年大三,正在准备明年的春招,文章中有写得不对的,希望大家及时指出文章中的错误的地方,欢迎互粉,大家一起努力!一,为什么会有跳表?以下图片均来自:https://blog.csdn.net/xushiyu1996818/article/d...原创 2020-12-31 17:53:21 · 1486 阅读 · 1 评论 -
从redis源码看数据结构(一)链表
文章目录从redis源码看数据结构(一)链表一,redis数据类型二,redis底层列表实现1.列表底层数据结构2.redis双向链表操作新建链表删除链表添加结点添加头结点添加尾节点在指定节点前或后插入节点删除节点删除给定节点获取节点通过索引获取节点获取迭代器当前节点三,java链表实现1.单链表2.双向链表从redis源码看数据结构(一)链表作者今年大三,正在准备明年的春招,文章中有写得不...原创 2019-10-22 23:08:46 · 490 阅读 · 0 评论 -
回溯专题复习
回溯专题复习最近在复习算法,为明年的春招做准备,欢迎互关呀,共同学习,进步!1.全排列过程分析递归树从递归树中可以看出,题目也要求数字不能重复,所以我们使用一个变量来标识一个数字是否被使用过。如果使用过则跳过使用下一个数字,使用完一个数字后要开始回溯,将访问状态重置自己做题时的分析图,有点丑,自小写字比较难看hhh代码实现 /** * @param...原创 2019-10-21 22:06:30 · 215 阅读 · 0 评论 -
KMP字符串匹配
文章目录1.字符串匹配问题2.暴力解法3.kmp模式匹配算法求next数组1.模式串标上序号2.把模式串的所有子串列举出来3.把模式串中相等的前缀和后缀的长度求出来4.代码实现模式匹配1.模式串和文本串从第一个字符开始比较,相等则,指针移到模式串和文本串的下一个字符2.当不匹配时,将字串中索引为0的元素移到不匹配元素的位置,其他元素移动相同的距离3.当出现这个前面连续几个比对成功,突然出现一个匹配...原创 2019-08-09 14:40:14 · 242 阅读 · 0 评论 -
散列的一些算法题
散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。关于散列表更加详细可以看这里散列及散列函数下面我们通过几个leetcode上的题目加深对散列的理解和使用两数之和给定一个整数数组 nums...原创 2019-08-19 19:55:48 · 387 阅读 · 0 评论 -
springboot配置mybatis逆向工程
mybatis逆向工程很早之前有用过,但是一直没有整理使用步骤,今天来回顾下在idea下springboot中整合mybatis逆向工程的实现步骤什么是逆向工程?所谓mybatis逆向工程,就是mybatis会根据我们设计好的数据表,自动生成pojo、mapper以及mapper.xml。本文将介绍两种方式实现mybatis的逆向工程。generatorConfig.xml配置文件配置数据...原创 2019-08-15 10:26:26 · 978 阅读 · 0 评论 -
b树和b+树
多叉树简述b树b树是最普通的一类多叉树,一个m阶的b树具有如下几个特征:b树中所有节点的的子节点数的最大值称为b树的阶一个节点有k个孩子,那么必有k-1个关键字才能将子节点划分为k个子集根结点至少有两个子女。每个中间节点都包含k-1个元素和k个孩子,其中 ceil(m/2) ≤ k ≤ m每一个叶子节点都包含k-1个元素,其中 ceil(m/2) ≤ k ≤ m所有的叶子结点都位...原创 2019-08-11 11:45:31 · 1390 阅读 · 0 评论 -
栈的相关算法
我们都知道栈和队列是两种很相似的数据结构,但是又有他们的特点栈是一种先进后出的数据结构,FILO(先进后出)队列是一种先进先出的数据结构,FIFO(先进先出)本文主要关注几道leetcode上关于栈的题目,进而进一步熟悉使用栈有效的括号表达式给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串,判断字符串是否有效。有效字符串需满足:左括号必...原创 2019-08-20 14:33:04 · 806 阅读 · 0 评论 -
循环队列
队列是一种只允许在一端插入,一端删除的数据结构其他数据结构实现队列栈实现队列双栈实现这里的思路使用到双栈实现队列,因为栈的后入先出,所以用到了一个辅助栈在出栈时操作,所以入队操作还是O(1)但是出队则需要将栈中的元素遍历压入辅助栈,再弹出辅助栈的栈顶元素,所以是O(n)public class MyQueueOfStack { /** * <...原创 2019-08-24 14:55:50 · 2072 阅读 · 0 评论 -
最大堆和最小堆
堆的特性必须是完全二叉树用数组实现任一结点的值是其子树所有结点的最大值或最小值最大值时,称为“最大堆”,也称大顶堆;最小值时,称为“最小堆”,也称小顶堆。最大堆:最小堆:对于堆(Heap)这种数据结构,从根节点到任意结点路径上所有的结点都是有序的堆的实现在堆中,一般将数组第一个元素赋值为null,不用数组第一位,所以根节点:n左子树则为...原创 2019-08-20 20:25:07 · 3405 阅读 · 1 评论 -
堆排序
之前我们了解过最大堆和最小堆我们知道最大堆的根节点上是数组的最大值,但是子节点的顺序指服从,子节点小于父节点,并没有严格的像二叉搜索树一般那么今天要说的堆排序就是利用了最大堆和最小堆根的性质所设计的一种排序算法最大堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;最小堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列平均时间复杂度:O(N...原创 2019-08-20 20:34:25 · 144 阅读 · 0 评论 -
PriorityQueue源码分析
PriorityQueue是一个优先队列,传统的队列是先入先出FIFO模型,但是优先队列跟传统队列不一样,优先队列会根据优先级来决定谁先出队,优先队列的底层数据结构是堆用堆的好处是,每次入队和出队后,调整堆的时间复杂度为log(n)。底层数据结构上边提到优先队列的底层数据结构是堆,那么堆的底层数据结构是数组 //队列底层是数组 transient Object[] queue;...原创 2019-08-21 17:03:51 · 274 阅读 · 2 评论 -
Vector源码分析
文章目录ArrayList和Vector对比:底层数据结构构造方法扩容机制添加元素删除元素查询迭代器本来今天是想看一下Stack的源码的,但是在看到Stack的父类结构时public class Stack<E> extends Vector<E>我想到了我之前还没怎么看过Vector的源码,甚至乎还很少用,我之前对他的了解大概就是停留在跟ArrayList很相似,...原创 2019-08-16 16:22:21 · 314 阅读 · 0 评论 -
二叉树及其遍历
1.什么是二叉树概念二叉树是节点最多可以包含两个子节点的树,每一个节点都可以区分为左子节点和右子节点,二叉树的一个重要性质就是叶节点的数量<=2,如图所示就是一棵简单的二叉树2.二叉树的相关概念路径指的是从根节点到叶节点的路径。节点的度一个节点含有的子树的个数称为该节点的度节点的权节点中有意义的值(通常是数值)层从根开始定义起,根为第1层,根的子节点为第2层,以...原创 2019-04-06 02:10:00 · 495 阅读 · 0 评论 -
动态规划专题复习(二)最值问题
文章目录动态规划专题复习(二)最值问题何为最值问题?1.最长回文字串暴力记忆化搜索动态规划2.最小路径和暴力记忆化搜索动态规划3.打家劫舍一暴力记忆化搜索动态规划4.打家劫舍二动态规划动态规划专题复习(二)最值问题最近在复习算法,为明年的春招做准备,欢迎互关呀,共同学习,进步!何为最值问题?最值问题就是给出一个问题的最优解,这种最优解,可以是一个问题能求得的最大最小值,一种最优路径等等...原创 2019-10-07 01:13:01 · 1302 阅读 · 0 评论 -
动态规划专题复习(一)计数问题
文章目录动态规划专题复习(一)计数问题一,计数问题1.斐波那契数列暴力递归解记忆化搜索动态规划2.凑零钱暴力递归记忆化搜索动态规划3.爬台阶暴力递归记忆化搜索动态规划4.不同路径一暴力递归记忆化搜索动态规划5.不同路径二动态规划6.不同的二叉搜索树一暴力递归记忆化搜素动态规划动态规划专题复习(一)计数问题最近在复习算法,为明年的春招做准备,欢迎互关呀,共同学习,进步!动态规划是一种算法思...原创 2019-10-04 21:47:06 · 1316 阅读 · 5 评论 -
十大排序算法总结
作为一名刚上大三的学生,还是希望能目光长远一点,将目标定于明年的春招,所谓,宝剑锋从磨砺出,梅花香自苦寒来,相信很多同学跟我一样,都已经开始准备明年的春招了,所以,博主希望跟大家一起努力,收获成功!冒泡排序public static int[] bubbleSort(int[] array){ int length = array.length; for(int i =...原创 2019-09-06 10:30:50 · 493 阅读 · 0 评论 -
HashMap源码分析
长文警告文章目录哈希表HashMap源码分析底层数据结构属性构造方法put方法get方法remove方法哈希表简介哈希表,也叫作散列表,是一种基于快速存取所设计的一种数据结构,也是一种经典的以空间获取时间的做法,该数据结构可以理解为一个线性表,其中的元素不是紧密排列,而是可能存在空隙哈希表是根据关键字直接访问的数据结构,我们可以通过哈希函数将要存放的元素映射为对应哈希表一个地址的关键字,...原创 2019-08-22 17:30:26 · 142 阅读 · 0 评论 -
Stack源码分析
文章目录底层数据结构构造方法进栈获得栈顶元素出栈查询元素在栈中位置(下标)linkedList实现栈底层数据结构进栈出栈获得栈顶元素是否是空栈之前我们看过Vector,知道Vector是基于数组实现的,本文我们来看看Stack(栈)这种数据结构栈是一种先进后出的数据结构,可以基于数组实现,也可以基于链表实现java集合中的Stack是基于Vector实现的,对于Vector可以具体看Vect...原创 2019-08-16 20:46:57 · 695 阅读 · 0 评论 -
优先队列常见算法题
数组中的第K个最大元素数组中的第K个最大元素在未排序的数组中找到第 k 个最大的元素,请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。示例1:输入: [3,2,1,5,6,4] 和 k = 2输出: 5示例2:输入: [3,2,3,1,2,4,5,5,6] 和 k = 4输出: 4使用优先队列和栈解决建堆前k个元素出队栈保存出队元素...原创 2019-08-21 22:08:36 · 540 阅读 · 0 评论 -
散列表及哈希冲突
一,哈希结构1.什么是哈希我们知道数组这种数据结构的查询效率是高的,知道数组下标的查询时间复杂度能到O(1),哈希,也叫作散列,散列在查询上有点类似数组查询的思想,根据下标直接定位到元素位置,获取元素值,与数组下标的固定是从0开始不断递增1不同的是,散列的下标是通过散列函数根据元素映射得到,最理想的散列是,每个位置只对应一个元素,且表的大小刚好合适,哈希是一种在插入,删除,查询都很高效的数据结...原创 2019-08-13 01:09:26 · 268 阅读 · 0 评论 -
线索二叉树
1.为什么会出现线索二叉树?当我们使用链式存储结构来构造二叉树时,我们可以很方便的找到某个节点的左右子节点,但是,在一般情况下,我们却无法直接找到某个节点在某种遍历序列中的前驱和后继节点如何解决这个问题?通过遍历寻找 ------ 费时间再增设两个域存储前驱和后继节点 ------- 非空间线索化2.线索化我们知道,具有n个节点的二叉树中,一共有2n个指针域。n个节点有n-1个孩...原创 2019-08-07 22:16:00 · 196 阅读 · 0 评论 -
递归
递归原理宏观:递归是使用运行时栈来实现的,所有的工作都由操作系统来完成微观:活动记录: - 方法参数和局部变量 - 返回值 - 返回地址 - 动态链接(指向调用者活动记录的指针)只要函数在执行,活动记录就会一直存在函数的私有信息池活动记录在函数开始执行时得到动态分配的空间,函数退出时释放空间main函数活动记录存在时间最长每一次执行函数都...原创 2019-07-23 12:41:00 · 177 阅读 · 0 评论 -
桶排序和计数排序
一,桶排序1.算法原理1.桶排序核心思想就是将要排序的数据分到几个有序的桶里,每个通在分别进行排序,每个桶排序完成后再把每个桶里的数据按照顺序依次取出,组成新的序列,该序列就是排好序的序列。类似归并排序中中的分治思想。2.算法分析时间复杂度接近O(N),所以说桶排序是线性时间排序空间复杂度:桶排序中,需要创建M个桶的额外空间,以及N个元素的额外空间,所以桶排序的空间复杂度为 O...原创 2019-04-17 13:51:30 · 5314 阅读 · 0 评论 -
堆排序
堆排序1.基本概念堆: 堆是一棵完全二叉树,这是他的结构性最大堆: 每个节点的值都大于或等于其左右孩子节点的值,这是他的堆序性最小堆: 每个节点的值都小于或等于其左右孩子节点的值,这是他的堆序性2.基本思想堆排序就是把需要排序的序列构建最大堆或者最小堆,此时,最大值或者最小值就在堆顶位置,然后把该元素放于最后,对剩下的序列再一次构造堆,知道完成排序堆排序的时间复杂度为 O(nlogn...原创 2019-04-13 17:13:19 · 304 阅读 · 0 评论 -
归并排序和快速排序
一,归并排序归并排序算法实现算法思路:如果要排序一个数组,我们先从数组中间把数组分成左数组和右数组两部分,分别对左右数组进行排序,然后将排序好的数组合并成结果数组,排序就完成了,最后只需将结果数组复制回原数组即可。核心思想 ----- 分治思想分治也即是分而治之,将一个大问题分解为小的子问题来解决。分治算法一般都是用递归来实现的。分治是一种解决问题的处理思想,递归是一种编程技巧。归并...原创 2019-04-16 15:25:51 · 3405 阅读 · 0 评论 -
插入排序,希尔排序
插入排序插入排序是一种比较排序算法核心思想在每次遍历序列过程中,从序列中取出一个元素插入到有序序列中,形成新的有序序列,重复该过程,直到遍历完成,形成新的有序序列。特点:时间复杂度分析:O(N^2),如果序列在排序前已经是有序序列,则为O(N)空间复杂度分析:O(1)数据量较少时效率高。插入排序适合数据量少的情况算法的实际运行效率优于选择排序和冒泡排序。稳定排序 — 插入排序...原创 2019-04-09 15:49:50 · 514 阅读 · 0 评论 -
栈
栈1.什么是栈?栈是一种线性存储结构,是一种限定只能在栈的一端(栈顶)执行操作的数据结构,类似于餐厅中的盘子的堆叠放置一样,最先被取走的只能是放在最上面的盘子。2.栈有什么特点?LIFO(后进先出)线性数据结构,存储。查找,插入,删除操作只能访问栈的一端(栈顶)3.栈的相关概念栈顶与栈底 :允许元素插入与删除的一端称为栈顶,另一端称为栈底。进栈:向栈插入元素的操作,叫做进...原创 2019-04-12 02:08:59 · 1086 阅读 · 0 评论 -
二叉搜索树
二叉搜索树1.介绍二叉搜索树也叫二叉排序树或者,二叉查找树,他最重要的特点就是:左子节点比父节点小,右子节点比父节点大,如果使用中序遍历的话,可以得到一个有序序列2.性质二叉搜索树的左子树,右子树都是二叉搜索树二叉搜索树是一棵二叉树非空左子树的所有键值小于其根结点的键值。非空右子树的所有键值大于其根结点的键值。没有键值相等的节点。二叉搜索树的平均深度是O(logN)一般不用担...原创 2019-04-08 01:08:52 · 201 阅读 · 0 评论 -
左式堆,斜堆及其合并操作
左式堆是堆的一种,但是左式堆是建立在一个具有堆序性的二叉树上而不是二叉堆左式堆和二叉堆的共同点:左式堆具有和二叉堆一样的堆序性左式堆具有和二叉堆一样的结构性左式堆和二叉堆的不同点:左式堆虽然和二叉堆都是二叉树,但是左式堆和二叉堆不同的是,二叉堆接近完全完全二叉树,左式堆是不理想平衡的,更加直接的说,左式堆是趋向于非常不平衡的。左式堆的一些概念零路经长(NPL)左式堆的零...原创 2019-04-05 17:31:46 · 3482 阅读 · 5 评论 -
二叉堆的构建以及上滤与下滤
实现优先队列我们可以有以下几种方式:1.链表实现2.二叉查找树3.堆其中,二叉堆在优先队列的使用非常普遍二叉堆的两个性质:1.结构性堆实际上是一棵完全二叉树,底层元素从左到右填入,所以堆的高度为logN,因为完全二叉树的规律性,堆其实可以看作是一个数组,在这个数组中,父节点位于 i /2 位置,则左子节点则在 2i位置,右子节点在 2i + 1上2.堆序性让堆操作快...原创 2019-04-04 02:09:20 · 2542 阅读 · 2 评论 -
数据结构---ArrayList源码分析
线程安全性对的ArrayList的操作一般分为两个步骤,改变位置(大小)和操作元素(e)中。所以这个过程在多线程的环境下是不能保证具有原子性的,因此ArrayList的在多线程的环境下是线程不安全的源码分析一,属性分析/** * 默认初始化容量 */private static final int DEFAULT_CAPACITY = 10;/** * 如果自定义容量为0,则会...原创 2019-02-27 01:25:34 · 165 阅读 · 0 评论 -
散列
散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。一个通俗的例子是,为了查找电话簿中某人的号码,可以创建一个按照人名首字母顺序排列的表(即建立人名x到首字母F(x)的一个函数关系)该函数就是一个哈希函数,在首字母为W...原创 2019-03-06 00:52:16 · 632 阅读 · 0 评论 -
Avl树
AVL树本质上还是一棵二叉搜索树,它的特点是:1.本身首先是一棵二叉搜索树。2.带有平衡条件:每个非叶子结点的左右子树的高度之差的绝对值(平衡因子)最多为1。AVL树的查找平均时间复杂度要比最坏情况下的二叉搜索树低——它是O(logn)。也就是说,在大量的随机数据中AVL树的表现要好得多。如果在AVL树中插入或删除节点后,使得高度之差大于1,AVL树的平衡状态就被破坏,它就不再是一棵平衡二...原创 2019-03-02 00:13:27 · 266 阅读 · 0 评论 -
冒泡排序和基数排序
一,冒泡排序算法思路冒泡排序的原理可以顾名思义:把每个数据看成一个气泡,按初始顺序自底向上依次对两两气泡进行比较,对上重下轻的气泡交换顺序(这里用气泡轻、重表示数据大、小),保证轻的气泡总能浮在重的气泡上面,直到最轻的气泡浮到最上面;保持最后浮出的气泡不变,对余下气泡循环上述步骤,直到所有气泡从轻到重排列完毕。算法分析稳定排序时间复杂度;乱序:O(N^2),有序:O(N)空间复杂度...原创 2019-04-18 15:27:56 · 1301 阅读 · 7 评论