数据结构
爱技术的小小林
这个作者很懒,什么都没留下…
展开
-
【HashMap源码分析】
HashMap简介HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间,具体可以参考 tr转载 2020-05-25 10:49:32 · 94 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶13学习总结】红黑树与AVL树的区别
比较红黑树不追求"完全平衡",即不像AVL那样要求节点的左右孩子高度差不超过1,它只要求部分达到平衡,就是要求从根节点到叶子节点的最长路径不大于最短路径的两倍。红黑是用非严格的平衡来换取增删节点时候旋转次数的降低,任何不平衡都会在三次旋转之内解决,而AVL是严格平衡树,因此在增加或者删除节点的时候,根据不同情况,旋转的次数比红黑树要多就插入节点导致树失衡的情况,AVL和RB-Tree都是最多两次树旋转来实现复衡rebalance,旋转的量级是O(1)但在删除节点时导致的失衡,AVL需要维护从被删除节原创 2020-05-24 16:49:14 · 153 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶10学习笔记】并查集
并查集Quick Union这个版本的目的是使用一个数组构建一棵指向父节点的树,首先是将每个元素看做是一个节点,让每个节点指向自己,接下来做union操作这个操作是将3所在集合的根节点指向8所在集合的根节点public class UnionFind2 implements UF { // 我们的第二版Union-Find, 使用一个数组构建一棵指向父节点的树 // parent[i]表示第一个元素所指向的父节点 private int[] parent;原创 2020-05-23 21:12:57 · 137 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶11学习笔记】AVL
平衡二叉树平衡二叉搜索树又被称为AVL树,且具有性质:对于任意一个节点,其左子树和右子树的高度差不能超过1.。节点高度我们要维持树的自平衡结构,就要计算平衡因子,根据平衡因子予以调整,而计算平衡因子就需要标注节点的高度,叶子节点对应的高度为1,对于有左子树和右子树的节点,对应的高度为左右子树中最高的子树高度加一,所以标注节点可以这样写: // 获得节点node的高度 private int getHeight(Node node){ if(node == null)原创 2020-05-23 20:07:25 · 189 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶12学习笔记】红黑树
2-3树二叉查找树中树高会受到输入数据的影响,极端情况下一棵树和一个链表没什么区别,所以我们需要一种树,它的所有叶节点到根节点的距离都是相等的,这种树为平衡树,并且随着数据的加入,这种平衡性会一直保持,它就是2-3查找树,它是一棵绝对平衡的树。如上图,存放一个元素的为2节点,存放两个元素的为3节点,对于2节点,它与二叉查找树特性相同,左链接比节点值小,右链接比节点值大,而对于3节点,它有三个链接,左链接指向的左子树所有元素都小于3节点的两个键,中间链接指向的子树元素大小介于两个键中间,右链接指向的子树原创 2020-05-23 17:50:50 · 166 阅读 · 0 评论 -
【leetcode Day4】【211】【677】字典树
【211】添加与搜索单词–数据结构设计设计一个支持以下两种操作的数据结构:void addWord(word)bool search(word)search(word) 可以搜索文字或正则表达式字符串,字符串只包含字母 . 或 a-z 。 . 可以表示任何一个字母。示例:addWord(“bad”)addWord(“dad”)addWord(“mad”)search(“pad”) -> falsesearch(“bad”) -> truesearch(".ad") ->原创 2020-05-21 16:16:52 · 114 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶9学习笔记】字典树Trie
什么是Trie上图便是一棵字典树,它是一棵多叉树,它通常只用来处理字符串,当数据为单词的时候,把单词以字母为单位一个一个拆开,从根节点开始,一直到叶子节点去遍历,每遍历到一个叶子节点形成一个单词。所以它的时间复杂度为O(w),w为字符串的长度。字典树还有一个问题,就是当一个单词的前缀也为一个单词,如pan为平底锅,是panda的前缀,该如何表示,我们就需要一个标识符,去标识该节点是一个单词的结尾,我们还用到了映射,一个字符对应一个节点,这两部分构成了字典树的基本节点类字典树基础public cla原创 2020-05-21 15:47:51 · 148 阅读 · 0 评论 -
【玩转数据结构 从入门到精通8学习笔记】线段树
线段树(区间树)首先来看我们为什么需要使用线段树,可以来看一个经典问题,区间查询,使用线段树可以优化时间复杂度,使用数组实现为O(n),而使用线段树为O(lgn)。对于查询,查询一个区间的最大值,最小值,或者区间数字和,都可看做是左右两孩子的融合过程,所以在实现上依然可以使用递归由下图可以看出线段树不是完全二叉树,它是一个平衡二叉树,何为平衡二叉树?它或者是一颗空树,或者具有以下性质的二叉树:它的左子树和右子树的深度之差(平衡因子)的绝对值不超过1,且它的左子树和右子树都是一颗平衡二叉树。那么原创 2020-05-21 10:39:32 · 121 阅读 · 0 评论 -
【leetcode Day4】【347】堆与优先队列
【347】前K个高频元素给定一个非空的整数数组,返回其中出现频率前 k 高的元素。示例 1:输入: nums = [1,1,1,2,2,3], k = 2输出: [1,2]示例 2:输入: nums = [1], k = 1输出: [1]思路:元素和元素出现频次就可以借助Map结构,将输入数组元素作为KEY,出现频次作为value存入Map中,可以借助优先队列,使队列元素值在K内,然后后续元素可以把优先队列中频次最小的元素替代,import java.util.*;class Solu原创 2020-05-20 18:09:51 · 121 阅读 · 2 评论 -
【玩转数据结构 从入门到进阶7学习笔记】堆与优先队列
优先队列何为优先队列?优先队列:出队顺序与入队顺序无关,和优先级有关为什么要使用优先对列?动态选择优先级最高的任务执行实现优先对列可以有多种底层数据结构,在这里我们使用堆这个数据结构堆二叉堆是一棵完全二叉树,完全二叉树,简单来说,就是把元素顺序排列成树的形状,从左到右一层一层的放,放完为止最大堆–堆中某个节点的值总是不大于其父节点的值,如上图可以使用动态数组来实现堆,其中parent(i)=(i-1)/2, leftchild(i)=2i+1, rightchild(i)=2原创 2020-05-20 17:31:57 · 141 阅读 · 0 评论 -
【leetcode day3】【804】【349】【350】集合与映射
【804】唯一摩尔斯密码词public int uniqueMorseRepresentations(String[] words) { /* 将26个英文字母对应的摩斯字符存到一个数组里 然后将输入字符串遍历for-each循环 将每个单词每个字符读取,转换成摩斯密码,存到字符串中,再将字符串存到TreeSet里,集合会自动去重,所以最后返回集合的大小,就可以获得所有词不同单词翻译的数量 */ Strin原创 2020-05-19 23:05:40 · 128 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶6学习笔记】集合与映射
集合只要实现以下方法就可实现一个简单的集合public interface Set<E> { void add(E e);//不能添加元素 void remove(E e); boolean contains(E e); int getSize(); boolean isEmpty();}可以使用二分搜索树和链表实现集合,首先来看一下二分搜索树的实现,我们这里导入之前创建的BST类,注意这里的泛型要实现Comparable接口,import j原创 2020-05-19 21:31:23 · 169 阅读 · 0 评论 -
【leetcode Day2】层序遍历
层序遍历递归102从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行 import java.util.*;class Solution { public List<List<Integer>> levelOrder(TreeNode root) { if(root==null) { return new ArrayList<List<Integer>>(); } Li原创 2020-05-18 21:37:14 · 195 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶5 学习笔记】二分搜索树
二分搜索树什么是二分搜索树?二分搜索树是二叉树,二分搜索树的,每个节点比左子树的所有节点的值都大,比右子树的所有节点值小,,每一棵子树也是二分搜索树其中,二分搜索树存储的数据具有可比性,所以在定义泛型接口时要注意实现Comparable接口接着来看二叉树的基本结构,它与链表一样,动态数据结构private class Node{ public E e; public Node left,right; public Node(E e){原创 2020-05-18 20:33:42 · 155 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶4学习笔记】
递归递归,本质上是将原来的问题转化为同一更小的问题,比如数组求和 // 计算arr[l...n)这个区间内所有数字的和 private static int sum(int[] arr, int l){ if(l == arr.length) return 0; return arr[l] + sum(arr, l + 1); }链表中的递归public ListNode removeElements(ListNo原创 2020-05-16 17:25:42 · 204 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶3学习笔记】链表
链表这里结点类Node可以作为内部类,放在链表类里基本结构public class LinkedList<E> { private class Node { public E e; public Node next; public Node(E e, Node next) { this.e = e; this.next = next; } publ原创 2020-05-15 22:17:55 · 133 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶2学习笔记】栈和队列
栈可以先来看看栈的应用,上图是程序调用的系统栈,箭头方向指明了程序运行顺序,我们运行到A2时把它压入栈,接着跳到B,执行到B2时再把它压入栈,再执行C,执行完C,我们可以看栈顶,是B2,我们跳回B2继续执行,B执行完后再看栈顶,是A2,跳回A2继续执行,A执行完后,栈空,程序结束,从这可以看出栈在程序调用问题上给出了很好的解决方法。栈的基本实现我们要如何实现一个栈呢,其实很简单,只要实现以下几个方法栈有推入,拿出操作,peek操作是查询并获取栈顶元素,还有获取栈内元素个数和判断是否为空,所以我原创 2020-05-15 16:52:45 · 119 阅读 · 0 评论 -
【玩转数据结构 从入门到进阶1学习笔记】数组
封装属于自己的数组封装一个属于自己的数组,可以进行增删改查等操作,还可以不同的数据类型,以自己的格式输出。下面是数组里的方法一览add方法想要在指定位置添加一个元素,那么这个位置后面的元素必须全部向后移一位,我们可以从最后一个元素开始遍历,每个元素向后移一位,移完后则指定位置空余出来,再将元素添加进去,在此之前,我们还要判断元素是否已经填满数组,还要输入的指定值是否小于0或者大于元素个数,完成这个方法后,我们可以在首尾添加元素时将此方法复用 public void add(int index,E原创 2020-05-14 21:27:05 · 166 阅读 · 0 评论