Java数据结构
用Java实现基础数据结构的底层方法
NinoSun
这个作者很懒,什么都没留下…
展开
-
面试题:如何实现一个简单的LRU缓存设计 Java解法
LRU缓存设计题(即Java中LinkHashMap实现原理)题表设计LRU缓存结构,该结构在构造时确定大小,假设大小为K,并有如下两个功能set(key, value):将记录(key, value)插入该结构get(key):返回key对应的value值[要求]set和get方法的时间复杂度为O(1)某个key的set或get操作一旦发生,认为这个key的记录成了最常使用的。当缓存的大小超过K时,移除最不经常使用的记录,即set或get最久远的。若opt=1,接下来两个整数x,原创 2021-03-16 22:21:52 · 207 阅读 · 0 评论 -
最短路径问题——Dijkstra算法的理解
1、最短路径的概念从一个顶点到另一个顶点所经过的边的权重和最小的一条路径,即最短路径。Dijkstra算法通常用来解决无负权边的图的最短路径问题,算法复杂度O(Elog(V))。2、算法思路首先在图中任意选定好顶点,比如0。创建一个数组(最好是最小索引堆),其用来存储与顶点0相连的点的最短距离。由第一张图可以看出,目前除了0点本身距离为0,其他的顶点距离都还没记录。不急。第二步,我们从...原创 2020-02-26 18:26:01 · 485 阅读 · 0 评论 -
索引堆
什么是索引堆索引堆是对堆这个数据结构的优化。索引堆使用了一个新的int类型的数组,用于存放索引信息。我们将会对索引数组进行堆排序,而不对数据直接进行堆排序。相较于堆,优点如下:1、优化了交换元素的消耗如果堆中只放数字还好,但是如果存放的是大型字符串,经常交换会消耗很多资源。2、加入的数据位置固定,方便寻找比如我想在堆中给第七个进程提升优先级,那么我就需要直接去修改它。普通的堆因为要...原创 2019-11-25 22:48:11 · 325 阅读 · 0 评论 -
图的基础
文章目录简介图的存储方式图的连通性无权图的遍历和寻路简介图(Graph)是一种数据类型。主要包含顶点(Vertex)和边(Edge)。图G(V, E)是由一个非空有限顶点集合V和有限边集合E组成。本篇文章主要是对图的基础知识做一个学习总结。具体内容包括图的存储方式,图的连通性和无权图的遍历和寻路。图的存储方式图一般通过邻接矩阵或邻接表的方式存储。邻接矩阵顾名思义是将顶点间的连通关系存...原创 2019-11-08 20:44:58 · 163 阅读 · 0 评论 -
哈希表的理解
介绍哈希表是用空间换时间的一种数据结构,它拥有理论上时间复杂度O(1)的查找操作。具体方法是通过哈希函数把“键Key”转换成索引。但这样也会带来问题,因为我们很难保证每个键通过哈希函数转换都可以得到不同的索引,这就是所谓的哈希冲突。要想完成哈希表的数据结构,主要问题就在于解决哈希冲突。设计一个好的Hash函数,可以让每个元素落点均匀,减少碰撞的概率。hashcode与equals我们...原创 2019-09-27 22:15:25 · 341 阅读 · 0 评论 -
红黑树理解
红黑树的5个条件每个节点或者是红色的,或者是黑色的根节点是黑色的每个叶子节点(最后的空节点)是黑色的如果一个节点是红色的,那么它的孩子节点都是黑色的从任意一个节点到叶子节点,经过的黑色节点是一样的(由此可以看出红黑树是保持黑平衡的二叉树,严格来讲它不是平衡二叉树)红黑树与2-3树的等价性了解红黑树前了解2-3树有利于加强对红黑树的理解。2-3树是满足二分搜索树性质的树,节点可以存...原创 2019-09-27 10:30:31 · 148 阅读 · 0 评论 -
并查集的实现(Java)
用途用来解决网络中节点间的连接状态等问题,以及数学中的集合类实现。原创 2019-09-26 08:49:46 · 192 阅读 · 0 评论 -
AVL树(Java)
序平衡二叉树:对于树中任意一个节点,左子树和右子树的高度差不能超过1。平衡二叉树的高度和节点数量之间的关系是O(logn)下图的树看起来不平衡,但满足平衡二叉树的要求。为了防止平衡二叉树出现不平衡的情况,需要给每个节点标注上高度值,计算平衡因子。从最低的叶节点开始标注为1,往上依次加1;其余叶节点也都标注为1,往上则加1。平衡因子为左子树的高度减去右子树的高度,一旦绝对值大于等于2,则这个...原创 2019-09-22 22:47:06 · 150 阅读 · 1 评论 -
并查集的形象解释
转载自飘过的小牛,侵删。为了解释并查集的原理,我将举一个更有爱的例子。 话说江湖上散落着各式各样的大侠,有上千个之多。他们没有什么正当职业,整天背着剑在外面走来走去,碰到和自己不是一路人的,就免不了要打一架。但大侠们有一个优点就是讲义气,绝对不打自己的朋友。而且他们信奉“朋友的朋友就是我的朋友”,只要是能通过朋友关系串联起来的,不管拐了多少个弯,都认为是自己人。这样一来,江湖上就形...转载 2019-09-19 21:34:22 · 140 阅读 · 0 评论 -
Trie树(字典树/前缀树)Java实现
序Trie是专门用来实现字典功能的数据结构,专门为处理字符串而实现的。与Map不同的地方在于映射的不一定是字符串。如果字典中有n个条目,使用树结构的话,查询的时间复杂度是O(logn),随n的增大而增大。但Trie查询每个条目的时间复杂度和字典中一共有多少条目无关!时间复杂度为O(w),w为查询单词的长度。如果字典中有100万个词条,logn大约为20,而大多数单词的长度不足10。相比较之...原创 2019-09-18 21:09:56 · 456 阅读 · 0 评论 -
线段树
序最经典的线段树问题:区间染色 ,其中包含两种操作,染色操作(更新区间)和查询操作(查询区间)。如果使用数组实现的话,时间复杂度都将为O(n)。另一类经典问题:区间查询,查询一个区间[i, j]的最大值,最小值或者区间数字和。实质化的问题可以是:2017年注册用户中消费最高的用户?消费最少的用户?学习时间最长的用户?某个太空区间中天体的总量?这些问题都有一个规律,即数据都是在动态变化的,需要更...原创 2019-09-18 10:20:52 · 119 阅读 · 0 评论 -
针对LeetCode#347题浅谈Java的PriorityQueue中比较器的不同使用方法
使用方法可以参考leetcode 347题,具体解题思路不在赘述,本文重点以347题为实例讲讲PriorityQueue的比较。第一种比较方法 定义比较方法新建一个私有类,在私有类中定义比较的方法。由于java.util包中自带的PriorityQueue本身是由最小堆构成的,而本题需要的恰好是保留最大元素,所以定义比较方法如下所示。private class Freq implements...原创 2019-09-16 13:31:49 · 448 阅读 · 1 评论 -
二叉堆
性质是一棵完全二叉树(不同于满二叉树)堆中每一个节点的值总是不大于其父节点的值,也称最大堆(相应的也可以定义最小堆)要注意的是,即使是最大堆,也并不意味着上一层的每个节点的值都大于下一层的节点值。这里16虽然在17的上层,但值小于17由于二叉堆是完全二叉树,因此完全可以使用数组来构建树,由上往下,由左往右,依次编号数组的索引,这里建议根节点编号1。通过这种方式,我们不仅可以构建二叉堆...原创 2019-09-15 19:12:22 · 156 阅读 · 0 评论 -
集合和映射
集合(Set)集合的特性集合中的元素只存在一次,因此集合可以快速去重,去除掉重复元素。集合的常用方法Set<E> void add(E) //不可以添加重复元素 void remove(E) boolean contains(E) int getSize() boolean isEmpty()集合的应用场景客户统计,如统计某一时间段内某网站访问的IP...原创 2019-09-11 11:19:49 · 197 阅读 · 0 评论 -
通过前序序列和中序序列或中序序列和后序序列还原二叉树(Java)
首先看一下这个二叉树的结构,回忆一下前序序列的输出方式(中前后),中序序列的输出方式(前中后),后序序列的输出方式(前后中)。前中序列还原二叉树此二叉树的前中序列如下所示,我们要做的就是通过这两个序列还原出二叉树来。前序序列{ A B H F D E C K G}中序序列{ H B D F A E K C G}由于前序序列输出方式是中前后,因此前序序列的开头即是根节点root。再由于...原创 2019-09-04 22:18:42 · 801 阅读 · 0 评论 -
Java写单链表
如何使用java来写一个单链表原创 2019-09-04 22:29:16 · 189 阅读 · 0 评论 -
Java单链表反转
一种方法是递归的方式,从头节点开始往后深入直至尾节点,然后开始由后往前,一层层反转指针,返回最后的节点(反转后的首节点)。两种方法都是返回链表的头节点。注意!反转后原先的链表结构已经改变,如果需要同时存在,建议提前将原链表复制一遍。head是当前的节点head.next是当前节点往后的一个节点public Node reverse1(Node head){ if(head == n...原创 2019-09-04 22:31:50 · 104 阅读 · 0 评论 -
如何使用Java构建一个动态数组类
数组基础数组作为数据结构最大的优点在于可以快速查询,arr[2]。但由于数组的大小在开始创建时就被定义,因此如果存储的内容超出了数组容量,就无法在原先的数组中保存数据。这里就需要使用一个可以动态改变数组容量的动态数组来存放数组。而在建立动态数组类前,我们首先要创建一个数组类。这里我们假设要创建一个int类型的数组类。在开头先定义好我们这个类中有一个数组data[],以及数组中实际存放的元素数量...原创 2019-09-04 22:41:45 · 4380 阅读 · 0 评论 -
Java构建二分搜索树
定义二分搜索树是二叉树二分搜索树每个节点的值:大于其左子树所有节点的值小于其右子树所有节点的值每一棵子树也是二分搜索树如果是自定义的元素,存储的元素必须有可比较性代码构建基本这里extends Comparable是因为泛型本身不能像数字一样做比较,因此通过e.compareTo(E e)的方法来实现二分搜索树的可比较性。public class BST<E ...原创 2019-09-04 22:50:01 · 225 阅读 · 0 评论