数据结构与算法
文章平均质量分 88
数据结构与算法,基础概念和练习
听雨7x
recognize the truth of life and still love it.
展开
-
蓄水池抽样算法
假设要等概率抽10个球,那么 1~10号球,百分之百能被选中,假设现在 来到了 第 i号球(i>10),那么第i号球被选中的概率就是 10 / i,而对于 已经被选择的10个球中,每一个球都有1 / 10的概率被 第i号球替换掉,所以已经被选中的10个球,在第i号球到来的时候,都有 1 / i 的概率被替换掉,那么也就是有 10 / i 的概率存活下来。:在一个源源不断的数据流中,会吐出带有编号的球,现在问你 在不知道具体有多少个球的情况下,如何。原创 2023-09-25 19:08:26 · 160 阅读 · 0 评论 -
LRU、LFU 内存淘汰算法的设计与实现
LRU、LFU都是内存管理淘汰算法,内存管理是计算机技术中重要的一环,也是多数操作系统中必备的模块。应用场景:假设 给定你一定内存空间,需要你维护一些缓存数据,LRU、LFU就是在内存已经满了的情况下,如果再次添加新的数据,该淘汰哪些数据来留出新数据的内存空间???原创 2023-09-25 16:11:33 · 574 阅读 · 0 评论 -
【数据结构】数组区间更新-IndexTree(树状数组)
在嵌段时间,我们介绍过线段树,线段树是解决在数组区间上进行快速的增删改查操作。而今天我们讲得IndexTree也是为了达到这样类似的效果。一、介绍例题:给定一个数组arr,arr的长度是1000,现在问你如何快速的计算500 ~ 1000之间,所有的数的累加和??可能你会说直接一个for循环,从500开始累加不就行了吗? 这样确实可以达到目的,但是还是不够快。又或许,你会想到用前缀和数组,先计算每一个index,从0下标一直累加到index位置。这样一个前缀和数组,也是能达到相应的效果。如下:原创 2022-02-18 16:50:35 · 1037 阅读 · 26 评论 -
【数据结构】数组区间更新-线段树
例题:LeetCode699掉落的方块原创 2022-02-05 11:40:53 · 1493 阅读 · 10 评论 -
【经典面试题】无序数组中,求第K大的数(堆、荷兰国旗问题、bfprt算法)
bfprt算法原创 2021-12-30 21:50:17 · 2392 阅读 · 9 评论 -
2019年京东面试题-洗咖啡杯问题【贪心和动态规划】
京东2019年面试题—冲咖啡和洗咖啡杯问题题目描述:首先,给你几个数据:数组arr:表示几个咖啡机,这几个咖啡机生产一杯咖啡所需要的时间就是数组中的值,例如arr=[2,3,7]就表示第一台咖啡机生产一杯咖啡需要2单位时间,第二台需要3单位时间,第三台需要7单位时间。int N:表示有N个人需要用咖啡机制作咖啡,每人一杯,同时,假设制作完咖啡后,喝咖啡时间为0,一口闷。int a:表示用洗碗机洗一个咖啡杯需要的时间,串行运行。int b:表示咖啡杯也可以不洗,自然晾干的时间。咖啡原创 2021-11-15 21:44:23 · 1764 阅读 · 22 评论 -
5千字长文,深度总结HashMap底层实现&面试题【收藏】
哈喽,大家好!!!今天的主题:HashMap反观整个Java的集合框架,我们讲了ArrayList、LinkedList、Stack、Queue、Deque、PriorityQueue等等集合,以及它们背后所对应的数据结构,今天我们来看一下java集合中,最为重要的,也是最常用的一个集合:HashMap。它的重要性,毋庸置疑,网上随意找一篇面经,几乎都会问到HashMap的底层实现、哈希冲突该怎么办?…… 这里我们就不细说了,直接进入主题。文章目录一、认识HashMap二、哈希函数1、哈希函数的概念2原创 2021-11-03 17:59:13 · 1087 阅读 · 13 评论 -
常考排序算法之归并排序
前几天,我发布了一篇快速排序的帖子,今天我们还是围绕着排序这个话题,继续讲解第二热度的归并排序。归并的递归版本非常的简单,非递归版本的可能稍微要难一点点,但是,不要怕,这都是小问题。我们直接开干!!!前期文章:八大排序算法总结深入理解快速排序以及优化方式一、递归版本归并排序的思想:将给定的数据,等分为两部分,分别递归调用函数,使这两部分有序。然后再将这左右两部分的数据进行合并,使其有序。这就是归并。如上图,递归调用绿色部分,使其有序后,再调用蓝色部分,使其有序后;再将二者进行合并,且还是有序的原创 2021-10-29 15:50:11 · 481 阅读 · 9 评论 -
深入理解快速排序以及优化方式
可能经常看面经的同学都知道,面试所遇到的排序算法,快速排序占主要位置,热度只增不减啊,其次就是归并和堆排序。其实以前写过一篇排序的文章,写的比较简单,只是轻描淡写。今天我再次重新拿起笔,将快速排序的几大优化,再次一一讲述一遍。各位同学,读完这篇文章,如若对你能够带来一些感悟,记得给个大大的赞哦!!!前言快速排序是在冒泡排序的基础之上,再次进行优化得来的。具体的步骤如下:在待排序的序列中,选取一个数值,将大于它的数放到数组的右边,小于它的数放到数组的左边,等于它的数就放到数组的中间。此时,相对于原创 2021-10-26 15:34:23 · 676 阅读 · 14 评论 -
竞赛最好用的平衡树-Size Balanced Tree(SBT)【建议收藏】
大家好。前段时间我更新过AVL、红黑树以及搜索二叉树的简单讲解。今天我们还是围绕着平衡树的话题,来讲解一个很牛逼的平衡树结构。这种结构是我国的一位大牛:陈启峰。在2006年,他还在读高中阶段,所发明的一种平衡树结构,叫Size Balanced Tree(SBT),根据节点的个数,来调整平衡性。一直到今天,这种平衡树结构,在算法竞赛领域是非常常用的,虽然SBT的时间复杂度跟AVL、红黑树这些平衡树一样,但是SBT是比较好写,比较好改的。所以在算法竞赛时,是最常用的一种算法。陈启峰SBT论文(译)本期文章原创 2021-10-24 08:58:38 · 2835 阅读 · 12 评论 -
【算法题】不用做任何比较,返回两个数中的最大值!
hello!今天我们来看一道算法题!!!在线OJ链接给定两个数,不做任何比较,返回最大值。分析:我们都知道1乘以任何数,得到的是它本身;0乘以任何数都是得0。根据这个性质啊,我们就能够做出一些事情来。题目既然给了两个数,我们将两个数相减,假设被减数是a,减数是b。a-b肯定会得到一个正数或者负数。如果是正数,说明a比较大,反之就是b比较大。然后我们就将这个结果进行处理,如果是负数,我们就让他等于0;如果是正数,我们就让他等于1。再将这1或者0,去乘以a或者b。肯定有一个得到他本身,另外一个得到0,原创 2021-10-07 12:18:59 · 1043 阅读 · 10 评论 -
遍历二叉树的神级方法-Morris遍历【建议收藏】
在前面,我们简单提及过二叉树的遍历方式,有递归和非递归两个版本的遍历。仔细想一想,不管是递归的,还是非递归的遍历,两种版本的遍历都是需要耗费大量的、额外的空间。比如当我们二叉树的高度有100层,那么递归时,系统就会一直压栈,一直要压入100次遍历的递归函数,因为此处的空间复杂度是跟这可二叉树的高度相关的。所以有人就在想,有没有什么方式,能够使这个空间复杂度再压缩一点呢?前期文章:二叉树的非递归遍历本期文章源码:GitHub有,肯定是有的。那就是今天的主题:Morris遍历。这种思想就能使二叉树的遍历原创 2021-10-04 11:53:54 · 2129 阅读 · 19 评论 -
最长回文子串问题-Manacher算法【建议收藏】
前面我们讲过一个关于字符串的算法:KMP算法。今天我们来讲另外一个字符串算法:Manacher算法。这个算法是用于解决一个问题叫:最长回文子串。前期文章:KMP算法牛客网OJ链接说的简单一点,给定一个字符串,返回的值是这个字符串的最长回文子串的长度。顾名思义,即是回文串,也是子串。文章目录一、BF算法二、Manacher算法一、BF算法那上图的示例2为例:abc1234321ab。最简单的思路就是从左到右遍历每一个字符。每来到一个字符位置,我们可以向左右两边进行扩展,分别比较左右两边的字符。原创 2021-09-26 19:12:45 · 774 阅读 · 16 评论 -
彻底理解KMP算法!【爆肝力作 建议收藏】
大家好,前面的有一篇文章讲了子序列和全排列问题,今天我们再来看一个比较有难度的问题。那就是大名鼎鼎的KMP算法。本期文章源码:GitHub源码文章目录简介暴力解法(BF)KMP算法简介KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(简称KMP算法)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模原创 2021-09-13 18:43:22 · 1369 阅读 · 19 评论 -
你真的分清楚子序列和全排列了吗?【建议收藏】
子序列与全排列的区别?可能大家听到这两个名词,似乎感觉有点相似,分不清楚,什么是子序列,什么是全排列。本期文章就来给大家捋清楚这两个是什么。Let’s go.三道题:打印一个字符串的全部子序列,包括空字符串。给定一个不含重复数字的数组 nums ,返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。链接给定一个可包含重复数字的序列 nums ,按任意顺序 返回所有不重复的全排列。链接本期文章源码:GitHub文章目录一、打印全部的子序列二、无重复值的全排列三、有重复值的全排列分支限界原创 2021-09-07 15:06:44 · 1872 阅读 · 8 评论 -
什么是并查集?【建议收藏】
文章目录一文彻底搞懂《并查集》!概念实现初始化并查集判断是不是同一个组查找当前节点的代表节点合并操作本期文章源码:GitHub一文彻底搞懂《并查集》!概念并查集是一种树型的数据结构,用于处理一些不相交集合的合并及查询问题(即所谓的并、查)。比如说,我们可以用并查集来判断一个森林中有几棵树、某个节点是否属于某棵树等。具体的用法,我们会以下一篇文章《图的相关算法》中,有一个克鲁斯卡尔算法,用于生成最小生成树,会用到并查集。并查集的主要作用是求连通分支数(如果一个图中所有点都存在可达关系(直接或间接.原创 2021-09-05 16:35:43 · 916 阅读 · 10 评论 -
浅析红黑树!【建议收藏】
前些天,我们讲解了搜索二叉树和AVL树,也知道了AVL树的自平衡机制,是如何进行旋转的,也知道了对于AVL树来说,查找数值的时间复杂度在O(logN)内,也就是说整棵树的深度,就是最大的查找次数。但是在AVL树在进行自平衡旋转时,还是耗费了大量的时间,所以就有了后来的红黑树。具体红黑树是什么?我们往下看。前期文章:二叉树的概念以及搜索二叉树。 平衡二叉树(AVL树),原来如此!!!本期文章源码:GitHub一、2-3查找树首先要深刻理解红黑树的性质,我们还得来看一下2-3树是个什么情况。原创 2021-08-26 16:51:22 · 531 阅读 · 6 评论 -
平衡二叉树(AVL树),原来如此!!!【爆肝力作 建议收藏】
文章目录一、认识平衡二叉树二、插入操作三、删除操作一、认识平衡二叉树前几天,我们将搜索二叉树(也称为二叉排序树)讲解了,重点讲了搜索二叉树的插入和删除操作,由特别是删除操作,是比较难的知识点。现在我们将继续在搜索二叉树的基础之上,学习一颗新的数,那就是大名鼎鼎的平衡二叉树(AVL树)。在学习平衡二叉树前,同学们需掌握了搜索二叉树的基本操作之后,再来看平衡二叉树的知识,就会简单一点哦!!!前期文章:二叉树的概念以及搜索二叉树。本期文章:GitHub源码链接。我们前面讲了搜索二叉树的定义:一个节点的.原创 2021-08-23 09:58:45 · 1033 阅读 · 8 评论 -
二叉树的概念以及搜索二叉树【建议收藏】
hello, everyone. Long time no see. 本期文章,我们主要讲解一下二叉树的相关概念,顺便也把搜索二叉树(也叫二叉排序树)讲一下。我们直接进入正题吧!GitHub源码链接文章目录一、二叉树的概念二、搜索二叉树一、二叉树的概念为什么要使用二叉树?为什么要用到树呢?因为它通常结合了另外两种数据结构的优点:一种是有序数组,另一种是链表。在树中查找数据项的速度和在有序数组中查找一样快,并且插入数据项和删除数据项的速度也和链表一样。下面,我们先来稍微思考一下这些话题,然后再深原创 2021-08-20 22:11:08 · 2295 阅读 · 3 评论 -
单调栈与队列的概念与练习!【建议收藏】
本期文章,小编给大家介绍一下数据结构中很重要的两个角色,那就是栈与队列两兄弟。文中若有欠妥之处,还望指正!感谢!文章目录一、栈与队列的概念1、栈2、队列二、栈的运用题目:逆波兰表达式求值问题三、单调栈运用题目:最大子矩形面积三、队列的运用题目:生成窗口最大数值一、栈与队列的概念1、栈栈是限定仅在表尾进行插入和删除操作的线性表。 栈的插入操作叫做:压栈或者入栈,栈的删除操作叫做 : 弹栈或者出栈。栈的特点是先进后出。什么意思?如图:我们可以将栈想象为一个杯子,假设我先将“冰红茶”倒入,再将“绿原创 2021-08-14 20:40:35 · 203 阅读 · 5 评论 -
面试官常考的15道链表题,你会多少?【建议收藏】
面试官常考的15道链表题,你会多少?链表题,在平时练起来感觉难度还行。但是在面试的过程中,在那种氛围,面试者很容易因为紧张,导致面试表现不好。所以这里总结了一些链表最常见的练习题。反复练习,孰能生巧。希望能帮助到大家!!!题目在线OJ链接难度反转单向链表牛客网易反转部分单向链表牛客网易在链表中删除倒数第K个节点牛客网易环形链表的约瑟夫环问题牛客网中判断一个链表是否为回文结构牛客网易将单链表按某值划分左边小、中间等于、右边大于牛客原创 2021-08-08 23:02:08 · 1281 阅读 · 8 评论