数据结构
文章平均质量分 71
童话ing
放弃不难,但坚持一定很酷。
展开
-
【数据结构】HashMap、LinkedHashMap和TreeMap区别和使用
文章目录前言1、HashMap2、LinkedHashMap3、TreeMap前言关于HashMap、ConcurrentHashMap底层知识前面已有文章进行分析了,因此,在本文中只会介绍HashMap、LinkedHashMap和TreeMap的一些明显区别。1、HashMapHashMap是无序的数据结构,也就是说,插入顺序和读取顺序不一致,下面简单验证即可。class Test{ public static void main(String[] args) { Ma原创 2022-03-22 16:06:34 · 4588 阅读 · 1 评论 -
最长上升子序列(序列长度+序列输出)
一、LIS的定义:最长上升子序列(Longest Increasing Subsequence),简称LIS,也有些情况求的是最长非降序子序列,二者区别就是序列中是否可以有相等的数。假设我们有一个序列 b i,当b1 < b2 < … < bS的时候,我们称这个序列是上升的。对于给定的一个序列(a1, a2, …, aN),我们也可以从中得到一些上升的子序列(ai1, ai2, …, aiK),这里1 <= i1 < i2 < … < iK <= N,但必原创 2020-07-18 20:54:02 · 7925 阅读 · 2 评论 -
【Leetcode】剑指 Offer 59 - I. 滑动窗口的最大值
题目链接:剑指 Offer 59 - I. 滑动窗口的最大值题目描述:给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。暴力思路:这题暴力思路则是利用双指针维护窗口大小,每次遍历窗口中的元素寻找最大值,此时时间复杂度明显为O(n*k),O(k)的复杂度来源于每次都需要遍历窗口中的元素找最大值,此时我们可以想到用一些数据结构,比如利用一个大根堆(堆顶元素最大)维护一个当前窗口的最大值。此时寻找窗口最大值变为O(logk),主要还是添加元素和删除元素的调整复杂度,总的复杂度也就变原创 2022-01-12 21:02:07 · 138 阅读 · 0 评论 -
KMP模板+例题
文章转自:http://www.cnblogs.com/kuangbin/archive/2012/08/14/2638803.html假设主串:S: S[1] S[2] S[3] ……S[n]模式串:T: T[1] T[2] T[3]…..T[m]现在我们假设主串第i 个字符与模式串的第j(j主串: S[1]...S[i-j+1]...S[i-1]S[i]..转载 2017-07-24 14:59:54 · 343 阅读 · 0 评论 -
一致性哈希算法
看了两篇文章,最终基本把一致性Hash搞懂了,这边搬过来主要是为了以后翻阅。原文地址:1、一致性Hash原理与实现2、面试官问:一致性哈希算法是什么?怎么判定哈希算法的好坏?前言互联网公司中,绝大部分都没有马爸爸系列的公司那样财大气粗,他们即没有强劲的服务器、也没有钱去购买昂贵的海量数据库。那他们是怎么应对大数据量高并发的业务场景的呢?这个和当前的开源技术、海量数据架构都有着不可分割的关系。比如通过mysql、nginx等开源软件,通过架构和低成本的服务器搭建千万级别的用户访问系统。怎么样搭建一.转载 2021-04-05 20:53:56 · 252 阅读 · 0 评论 -
【数据结构】跳表
根据原文完善了一下,方便翻阅。原文地址:数据结构与算法——跳表什么是跳表跳表全称为跳跃列表,它允许快速查询,插入和删除一个有序连续元素的数据链表。是redis的一个核心组件,也同时被广泛地运用到了各种缓存地实现当中,它的主要优点,就是可以跟红黑树、AVL等平衡树一样,做到比较稳定地插入、查询与删除。跳跃列表的平均查找和插入时间复杂度都是O(logn)。快速查询是通过维护一个多层次的链表,且每一层链表中的元素是前一层链表元素的子集(见下边的示意图)。一开始时,算法在最稀疏的层次进行搜索,直至需要查找的.转载 2021-04-04 16:47:37 · 146 阅读 · 0 评论 -
【数据结构】堆排序、插入、删除
本文图片均来自于网络堆定义:n个关键字序列称为堆,当且仅当该序列满足下列两个条件中的一个:L(i)⩽L(2i)且L(i)⩽L(2i+1)L(i)\leqslant L(2i)且L(i)\leqslant L(2i+1)L(i)⩽L(2i)且L(i)⩽L(2i+1) ① 小根堆L(i)⩾L(2i)且L(i)⩾L(2i+1)L(i)\geqslant L(2i)且L(i)\geqslant L(2i+1)L(i)⩾L(2i)且L(i)⩾L(2i+1) ②.原创 2021-04-01 11:18:05 · 3654 阅读 · 0 评论 -
树上倍增方法求LCA(最近公共祖先)(转)
初学LCA,菜菜的我还是先去逛逛各位大佬的博客,结果发现了神奇的东西。LCA指的是最近公共祖先(Least Common Ancestors),如下图所示: 4和5的LCA就是2 那怎么求呢?最粗暴的方法就是先dfs一次,处理出每个点的深度 然后把深度更深的那一个点(4)一个点地一个点地往上跳,直到到某个点(3)和另外那个点(5)的深度一样转载 2017-02-18 10:52:52 · 510 阅读 · 0 评论 -
java中Map的七种遍历方法
学了一年,到头来连个Map遍历都还要靠百度,真的已经面向了百度了,大概这就是基础没打好吧!且转这儿大家翻翻吧!首先在java中所有的Map(如HashMap, TreeMap, LinkedHashMap, Hashtable等)都实现了Map接口,因此所有的Map都可以用下面的几种方式去遍历,可根据业务需要进行选择。方式一、在for循环中使用entries实现Map的遍历:Map <String,String>map = new HashMap<String,String>(原创 2020-11-05 22:15:30 · 1407 阅读 · 0 评论 -
Java 对HashMap 进行排序的几种场景
Java中HashMap不同于Array、ArrayList和LinkedLists,它不会维持插入元素的顺序。因此对HashMap排序的掌握很重要。HashMap排序有两个步骤:1、通过map.entrySet()方法获取键值对;并将键值对传递给链表list;2、自定义比较器来使用Collections.sort()方法排序链表。例如下面的按照value降序排列:Collections.sort(list, new Comparator<Entry<String,Integer&g原创 2020-11-30 08:50:08 · 532 阅读 · 0 评论 -
LeetCode 141. 环形链表
题目链接:141. 环形链表题目描述:给定一个链表,判断链表中是否有环。为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。示例1:输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中有一个环,其尾部连接到第二个节点。示例2:输入:head = [1,2], pos = 0输出:true解释:链表中有一个环,其尾部连接到第一个节点。思路:这里提供两个方法原创 2020-09-07 11:26:34 · 106 阅读 · 0 评论 -
剑指 Offer 52. 两个链表的第一个公共节点
题目链接:剑指 Offer 52. 两个链表的第一个公共节点题目描述:输入两个链表,找出它们的第一个公共节点。如上所示,链表A和B在c1开始相交。这里看到不少人有个问题,说两个链表第一个相交节点之后的部分不一定相同。这里我觉得可能他们都没弄清楚什么是链表,这里我简单说一下,我们都知道链表是由一些节点组成的非连续存储结构,既然连续,那么怎么找下一个节点呢,自然就是指针了,因此每个结点包括两个部分**:一个是存储数据元素的数据域**,另一个是存储下一个结点地址的指针域。,所以只要找到两个链表相交第一个节点原创 2020-09-07 09:42:42 · 93 阅读 · 0 评论 -
洛谷P1144最短路计数(堆优化dij+记忆化搜索)
题目链接:传送门题意:就是求无向图起点为1到其他点的最短路的条数。思路:求解最短路采用堆优化dij(当然也可以采用spfa),最短路条数可以用记忆化搜索,用数组dp[i]记录起点到i点的最短路数目,如果从u点又找到一条到达i点的最短路,那么dp[i]=dp[i]+dp[u],因为起点1到u点的最短路可能有多条,因此需要加上,然后继续从u点搜索下去。初始化起点dp[1]=1;最短路数目也可以直...原创 2020-03-28 15:34:45 · 338 阅读 · 0 评论 -
hdu1213(基础并查集)
Problem DescriptionToday is Ignatius' birthday. He invites a lot of friends. Now it's dinner time. Ignatius wants to know how many tables he needs at least. You have to notice that not all the fr...原创 2017-09-09 20:04:47 · 358 阅读 · 0 评论 -
二分图判定(DFS/BFS/并查集)
一、二分图定义二分图,是图论中的一种特殊模型,设G=(V,E)是一个无向图,如果顶点V可分割为两个互不相交的子集(A,B),并且同一集合中不同的两点没有边相连。看一个例子:图中点集合分为A(包含2,4号顶点)和B(包含1,3,5,6号顶点),并且A,B集合中的点没有形成连接关系,显然这这是一个二分图。二、二分图判定定理1:无向图G为二分图的一个充要条件是:1、G中至少包含两个顶点2、...原创 2020-03-05 19:11:53 · 5751 阅读 · 0 评论 -
RMQ(转)
文章转自博主:溺水行舟1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值。这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度...转载 2017-03-04 00:11:18 · 198 阅读 · 0 评论 -
已知中序排列和后序排列求先序排列
Name:已知先后序和中序,求出它的先序排列Copyright:始发于goal00001111的专栏;允许自由转载,但必须注明作者和出处Author: goal00001111Date: 11-12-08 10:58Description:题目描述:描述Description给出一棵二叉树的中序与后序排列。求出它的先序排列。(约定树...原创 2017-02-28 15:32:52 · 3156 阅读 · 0 评论 -
POJ 2155(二维树状数组)
Language:DefaultMatrixTime Limit: 3000MS Memory Limit: 65536KTotal Submissions: 29131 Accepted: 10630DescriptionGiven an N*N matrix A, whose elements are ei原创 2017-08-14 15:32:42 · 250 阅读 · 0 评论 -
PowerOj 2392(树状数组 or CDQ分治)
大家都知道,如果晚上睡不着觉的话,数星星是一种很好的可以帮助入眠的方式。那现在我们就来数星星吧。但是对于大家来说,单纯的数星星肯定是太简单了,所以,我们改变一下数星星的方式。首先,所有的星星都是位于二维坐标平面上的。其次,我们约定:每一个星星有一个 value 值,这个 value 值等于 x 值不超过其 x 值并且 y 值不超过其 y 值(也即是在坐标平面上位于其左下方(包含边界原创 2017-08-14 15:51:36 · 268 阅读 · 0 评论 -
KMP匹配详细讲解+next数组真正理解
之前转载过一篇kuangbin大佬的kmp模板,只会用,但是不清楚原理现在看了某大佬的文章,发现讲解的非常精彩,但是有一点不足就是没讲清楚KMP时间复杂度问题,但是自己的语言组织能力以及理解能力也不是很好,所以就直接copyt过来了。希望_july_v博主不介意。http://www.cnblogs.com/kuangbin/archive/2012/08/14/2638803.htmlhttps...原创 2018-04-12 11:44:02 · 10930 阅读 · 2 评论 -
图的几种存储方式(邻接矩阵+邻接表+vector)
最近看到数据结构真的是头大,刚好想到之前自己因为不会存图被xxx怒怼,又没有学过数据结构,作为一个acmer来说,怎么能不会这种操作呢。然后现在来总结一下图的存储方式。图的分类有很多,这里不再赘述。来看一个一般的无向图:通俗地讲,一张图是由边、顶点集构成,每条边上可能还会有相应的边权(带权的),这里讲带权的。然后想我们怎样存储它呢,下面介绍几种存储方式。1、邻接矩阵图的邻接矩阵...原创 2018-05-03 22:18:52 · 7076 阅读 · 0 评论 -
字典树原理模板(数组模拟VS指针)+例题
一、字典树概念:又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高,但是我们时间空间这两个东西可以相互优化的,什么意思呢,也就是说,你时间复杂度降低了,但是你却增加了内存消耗,也就是所...原创 2018-04-26 12:23:11 · 522 阅读 · 0 评论 -
HDU1233(基础最小生成树 prim和 kruskal)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1233prim算法:算法从任意一个顶点开始,每次选择一个与当前顶点集最近的一个顶点,并将两顶点之间的边加入到树中。Prim算法在找当前最近顶点时使用到了贪婪算法。代码实现:#include<bits/stdc++.h>using namespace std;const in...原创 2018-08-04 19:31:51 · 1811 阅读 · 0 评论 -
二叉树先序、中序、后序递归&&非递归
这三种遍历,递归方式都很简单,大概就围绕着这样一个顺序:先序:根左右,中序:左根右,后序:左右根。对于非递归方式:由于采用栈(先进后出)这种数据结构存储结点,因此,结点入栈时需要考虑顺序和原来相反。先序和中序都比较简单,后序相对较难,在代码中叙述。先序:首先根结点入栈,访问根结点,然后结点入栈就先入右边,再入左边,因为退栈访问时候是先进后出的,而先序顺序是按照根左右这样一个顺序,最...原创 2018-10-02 22:50:32 · 334 阅读 · 0 评论 -
判断二叉树是否为对称二叉树
牛客题目链接:https://www.nowcoder.com/practice/1b0b7f371eae4204bc4a7570c84c2de1?tpId=46&tqId=29077&tPage=3&rp=3&ru=/ta/leetcode&qru=/ta/leetcode/question-rankiGiven a binary tree, chec...原创 2018-09-29 23:17:50 · 357 阅读 · 0 评论 -
寻找单链表中倒数第k个数
常规思路:(未知单链表长度情况下)遍历一遍单链表查询长度n,然后在遍历一遍查询第n-k个数即可。优化思路:设置两个指针,让指针A先循环跑到第k个位置,然后两个指针同时跑,当A指针到达链表末尾时候,指针B所指即为倒数第k个数。这主要是在A和B之间固定了一个长度k,这样保持长度不变情况下即可得到答案。代码:#include<bits/stdc++.h>using names...原创 2018-09-29 23:34:46 · 581 阅读 · 0 评论 -
二叉树中和为某一值得所有路径
问题描述:给定一颗二叉树,求其中和为某一特定值得所有路径。路径定义为根到叶子的所有节点。主要思路:采用先序遍历的递归方式,利用vector存储路径中的节点。需要注意的就是递归返回时要减去vector里面最后一个节点值,并移除节点。测试代码:#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;...原创 2018-09-29 23:52:57 · 220 阅读 · 0 评论 -
快排思想求解第k小
思路1:基于快排每次都会确定一个最终元素位置,下面代码则采用这种思想编写。思路2:同样基于快排,每次划分后看左边区间元素个数是否大于k个,若左边区间元素个数大于k个则在左区间找第k大元素,若左边区间个数小于k个,这时假设左边有len个元素,这时候在右边区间找第k-len+1个即可。注:有不正当地方欢迎指出!代码:/*快排思想求第k小,时间复杂度O(n),空间O(1)测试数据:...原创 2018-11-14 23:04:41 · 383 阅读 · 0 评论 -
dij最短路+堆优化
dij一个主要思路,将所有点分为两个集合S,T,初始集合S中只包含了起点,T集合包含所有点,要做的就是从T集合中不断选取与S集合中的点距离最短的并且未被加入S集合中的点,将这个点加入S集合,并用这个点去更新所有与这个点相邻的点,重复操作直到所有点都被加入S集合中。普通dijdij代码://时间复杂度O(n*n),//空间复杂度O(n*n),采用邻接矩阵存图,若采用邻接表则为(nlo...原创 2018-11-24 23:34:41 · 7640 阅读 · 0 评论 -
有向图&&无向图判环
无向图判环:dfs搜索图,图中的边只可能是树边或反向边,一旦发现反向边,则表明存在环。该算法的复杂度为O(V)树边的一边是正在访问的节点,另一边是未访问的节点,所以树边是正常的边;而反向边的一边是正在访问的节点,另一边也是正在访问的节点,例如 a-b-c-a,则c-a这条边中c正在访问,a也正在访问(递归函数正在进行),这就说明反向边指向的是它的父节点,而这种情况下一定是存在环.这就是dfs...原创 2018-11-27 23:00:35 · 1801 阅读 · 0 评论 -
平衡二叉树每个结点加入平衡因子
#include<bits/stdc++.h>using namespace std;const int maxn=1e5+5;typedef long long LL;#define Elemtype inttypedef struct node{ struct node *lchild,*rchild; int val; int bf;}no...原创 2018-12-11 22:33:53 · 1160 阅读 · 0 评论 -
链表各类操作详解(讲得非常详细)
原文链接:http://blog.csdn.net/hackbuteer1/article/details/6591486/ 链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量,以head表示,它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”,每个结点都应包括两个部分:一为用户需要用的转载 2017-08-02 13:52:04 · 1294 阅读 · 2 评论