数据结构
程序员波特
全网同名,资深Java开发。专注分享Java后端、中间件、架构设计、云原生、面试等干货知识。关注我,一起成长
展开
-
红黑树
什么是红黑树红黑树依然是一棵二分搜索树,《算法导论》中的红黑树定义如下:每个节点或者是红色的,或者是黑色的根节点是黑色的每一个叶子节点(最后的空节点)是黑色的如果一个节点是红色的,那么他的孩子节点都是黑色的从任意一个节点到叶子节点,经过的黑色节点是一样的 在学习红黑树之前,我们有必要先学习一下什么是2-3树,学习2-3树不仅对于理解红黑树有帮助,对于理解B类树,也是有巨大帮助的。我们常用到的磁盘存储、文件系统、数据库等相应的数据存储都是采用的B类树这样的数据结构。什么是2-3树原创 2020-07-09 15:42:38 · 106 阅读 · 0 评论 -
AVL树(平衡二叉树)
什么是平衡二叉树?为什么叫AVL树? 因为AVL树是由 G.M.Adelson-Velsky 和 E.M.Landis 这两位俄罗斯科学家在1962年的论文中首次提出,是最早的自平衡二分搜索树结构。 由于AVL树是自平衡二分搜索树,所以本质上还是二分搜素树,也就是二分搜索树的性质AVL树都满足,由于二分搜索树在添加有序元素时,会退化成链表,造成时间复杂度为O(n),但AVL树是不会出现这种情况的,因为AVL树通过自平衡来解决了退化成链表的问题,关于二分搜索树,你可以看我之前二分搜索树(Binary原创 2020-07-09 15:39:31 · 130 阅读 · 0 评论 -
并查集(Union Find)
并查集介绍 我们之前讲的树结构,都是由父亲节点指向孩子节点,而并查集却是由孩子指向父亲的这样一种数据结构。 给出图中任意的两点,问这两点之间是否可以通过一个路径连接起来?并查集就是处理这类连接问题的很好的数据结构。即用来处理网络中节点的连接状态,这里的网络是个抽象慨念,可以是用户之间形成 的网络。其实这类连接问题我们也可以使用集合类来进行实现,即求两个集合的并集。本文设计的并查集主要支持两个操作:union(p,q) 并,对传入的两个数据p和q,在并查集内部将这两个数据,以及这两个数据所在的原创 2020-07-09 15:34:04 · 146 阅读 · 0 评论 -
Trie(字典树、前缀树)
文章目录什么是Trie?创建一棵Trie向Trie中添加元素Trie的查询操作对比二分搜索树和Trie的性能leetcode上的问题什么是Trie? Trie是一个多叉树,Trie专门为处理字符串而设计的。使用我们之前实现的二分搜索树来查询字典中的单词,查询的时间复杂度为O(logn),如果有100万(220)个单词,则logn大约等于20,但是使用Trie这种数据结构,查询每个条目的时间复杂度,和一共有多少个条目无关!时间复杂度为O(w),w为被查询单词的长度!大多数单词的长度小于10。 Tri原创 2020-07-09 15:15:57 · 353 阅读 · 0 评论 -
线段树(区间树)
文章目录为什么要使用线段树?什么是线段树?创建一棵线段树线段树的查询操作线段树的更新操作为什么要使用线段树?最经典的线段树问题:区间染色 有一面墙 ,长度为n,每次选择一段儿墙进行染色,m次操作后,我们可以看见多少种颜色? 例如上图,我们第一次将[1,8]的位置染成蓝色,然后再将[5,9]的位置染成黄色,然后将[6,15]的位置染成红色,最后把[12,15]的颜色染成绿色,我们通过这几次操作可以发现,图中被重复染色的位置是会被覆盖的,比如[12,15]这个位置显示被染成红色,然后又被染成了绿色原创 2020-07-09 15:08:27 · 297 阅读 · 0 评论 -
堆和优先队列
什么是优先队列? 我们在常见的线性结构中,已经知道什么是普通队列了,普通队列就是一种“先进先出,后进后出”的数据结构,即普通队列的出队顺序和入队顺序是一样的,但我们的优先队列,它的出队顺序和入队顺序无关,它的出队顺序是和优先级相关的,当然这个优先级我们可以自己定义。为什么使用优先队列? 举一个生活中的例子,就是医院里需要做手术的病人,医院不会根据哪个病人先来就先送去手术室,而是会根据病人生命危险的程度来决定应该谁先进入手术室。再说一个计算机中的例子,例如在操作系统中,进行任务的调度,在我们现在的操原创 2020-07-09 15:06:39 · 139 阅读 · 0 评论 -
集合和映射(Set And Map)
集合 Set Set是一种新的数据结构,类似于数组,但是不能添加重复的元素,基于Set集合的这个特性,我们可以使用Set集合进行客户统计和词汇统计等,集合中常用的方法如下:public interface Set<E> { void add(E e); //添加元素e,不能添加重复元素 boolean contains(E e); //当前集合中是否包含元素e void remove(E e); //删除元素e int getSize(); //获取当前集原创 2020-07-09 15:04:12 · 365 阅读 · 0 评论 -
二分搜索树(Binary Search Tree)
###什么是二叉树? 在实现二分搜索树之前,我们先思考一下,为什么要有树这种数据结构呢?我们通过企业的组织机构、文件存储、数据库索引等这些常见的应用会发现,将数据使用树结构存储后,会出奇的高效,树结构本身是一种天然的组织结构。常见的树结构有:二分搜索树、平衡二叉树(常见的平衡二叉树有AVL和红黑树)、堆、并查集、线段树、Trie等。Trie又叫字典树或前缀树。 树和链表一样,都属于动态数据结构,由于二分搜索树是二叉树的一种,我们先来说说什么是二叉树。二叉树具有唯一的根节点,二叉树每个节点最多有两个孩原创 2020-07-09 15:02:01 · 271 阅读 · 0 评论 -
常见的线性结构
前言 本篇博客主要是记录手写这些这数据结构的底层实现,加深对线性结构的理解,实现自己的一个小型数据结构库,也会进行简单的时间复杂度分析,对不同的实现进行比较和优化,即侧重于代码实现。由于数据结构是实践性比较强的一个科目,希望大家在看这篇博客时,自己也去写一下代码,看一下运行结果是不是自己想要的,我也会贴出我的运行结果来进行分析。数组数组介绍 数组是在内存中存储相同数据类型的连续的空间,最大的优点:查询快速。 数组最好应用于“索引有语意”的情况,例如索引代表学生学号,我们可以根据学号获取这个学原创 2020-07-09 15:00:57 · 999 阅读 · 0 评论