首页
学习
活动
专区
圈层
工具
发布

18 张图带你彻底认识这些数据结构

集合通常是由一组无序的,不能重复的元素构成。...方案一:数组 按照顺序将所有员工信息依次存入一个长度为1000的数组中。每个员工的信息都保存在该数组的某个位置上。 但是我们要查看某个员工的信息怎么办呢?一个个查找吗?不太好找。...数组最大的优势是什么?通过下标值获取信息。 所以为了可以通过数组快速定位到某个员工,最好给员工信息中添加一个员工编号,而编号对应的就是员工的下标值。...当查找某个员工信息时,通过员工号可以快速定位到员工的信息位置。 方案二:链表 链表对应插入和删除数据有一定的优势。 但是对于获取员工的信息,每次都必须从头遍历到尾,这种方式显然不是特别适合我们这里。...树的术语: 节点的度(Degree):节点的子树个数。 树的度:树的所有节点中最大的度数(树的度通常为节点个数的N-1)。 叶节点(Leaf):度为0的节点(也称叶子节点)。

57210

数据结构与算法(七)-树

节点的子树的根称为节点的孩子(Child),相应的该节点称为孩子的双亲(Parent),同一双亲的孩子之间互称为兄弟(Sibling);节点的祖先是从根到该节点所经分支上的所有结点。   ...; 节点的层次:从根开始定义起,根为第1层,根的子节点为第2层,以此类推; 树的高度或深度:树中节点的最大层次; 堂兄弟节点:双亲在同一层的节点互为堂兄弟; 节点的祖先:从根到该节点所经分支上的所有节点...; 子孙:以某节点为根的子树中任一节点都称为该节点的子孙。...在计算机中数据的存储有两种结构顺序存储和链式存储,顺序存储结构显然是不行的,而链式存储结构也是有缺点的,我们来看一下: 第一种:   由于链式存储结构中的节点需含有子结点的引用或指针,但在树中子节点的不确定性导致无法无法固定具体节点中有几个引用或指针...这样的话就会浪费很多空间,所以这样的结构不是最理想的存储结构; 第一种(改):   对于上面的存储结构会过多的浪费存储空间,那么我们在结点中声明一个动态链表Nodes来存放可能的子节点Node;

1.2K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Go 数据结构和算法篇(十三):字符串匹配之 Trie 树

    一、Trie 树的定义 Trie 树,也叫「前缀树」或「字典树」,顾名思义,它是一个树形结构,专门用于处理字符串匹配,用来解决在一组字符串集合中快速查找某个字符串的问题。...树: Trie树图示 每个节点表示一个字符串中的字符,从根节点到红色节点的一条路径表示一个字符串(红色节点表示是某个单词的结束字符,但不一定都是叶子节点)。...这样,我们就可以通过遍历这棵树来检索是否存在待匹配的字符串了,比如我们要在这棵 Trie 树中查询 her,只需从 h 开始,依次往下匹配,在子节点中找到 e,然后继续匹配子节点,在 e 的子节点中找到...另一个是在 Trie 树中查询一个字符串。 Trie 树是个多叉树,二叉树中,一个节点的左右子节点是通过两个指针来存储的,对于多叉树来说,我们怎么存储一个节点的所有子节点的指针呢?...// 以 Unicode 字符遍历该单词 value, ok := node.children[code] // 获取 code 编码对应子节点 if !

    1.7K20

    动图演示:如何彻底理解红黑树?

    而且红黑树的每一个黑节点都是 3 节点中的最中间的那个值,或者是 2 节点中其中一个值。 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。...原因:红黑树这些黑色节点在 2-3-4 树中代表的是由 1 节点的一个 2-3-4 树,而 2-3-4 树是同一个子树的深度是相同的,平衡的,所以从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点...①左旋 原本的状态: ? 过程图: ? 结束图: ? 如上图所示,当在某个目标结点 E 上,做左旋操作时,我们假设它的右孩子 S 不是 NIL。...同左旋类似,当在某个目标结点 S 上,做右旋操作时,我们假设它的右孩子 S 不是 NIL。...例如,Java 集合中的 TreeSet 和 TreeMap,C++ STL 中的 set、map,以及 Linux 虚拟内存的管理,都是通过红黑树去实现的。

    44940

    哈希树简介

    2.概览 哈希树的叶结点是一个文件或一组文件中的数据块的哈希。 树中更靠上的节点是它们各自子节点的哈希值。 例如下图中,哈希 0 是哈希 0-0 和哈希 0-1 串联的哈希结果。...顶部哈希(top hash)是将哈希 0 和 1 连接后所获取的哈希值 大多数哈希树实现都是二叉树(每个节点下有两个子结点),但它们也可以在每个结点下用更多的子结点。...4.性质 哈希树是一种典型的二叉树结构,由一个根节点、一组中间节点和一组叶节点组成。默克尔树最早由 Ralph Merkle 在 1980 年提出,曾广泛用于文件系统和 P2P 系统中。...5.用途 证明某个集合中存在或不存在某个元素 通过构建集合的默克尔树,并提供该元素各级兄弟节点中的 Hash 值,可以不暴露集合完整内容而证明某元素存在。...另外,对于可以进行排序的集合,可以将不存在元素的位置用空值代替,以此构建稀疏默克尔树(Sparse Merkle Tree)。该结构可以证明某个集合中不包括指定元素。

    2.1K10

    一波动图探究红黑树的本质

    而且红黑树的每一个黑节点都是 3 节点中的最中间的那个值,或者是 2 节点中其中一个值。 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。...**原因:**红黑树这些黑色节点在 2-3-4 树中代表的是由 1 节点的一个 2-3-4 树,而 2-3-4 树是同一个子树的深度是相同的,平衡的,所以从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点...如上图所示,当在某个目标结点 E 上,做左旋操作时,我们假设它的右孩子 S 不是 NIL。...同左旋类似,当在某个目标结点 S 上,做右旋操作时,我们假设它的右孩子 S 不是 NIL。...例如,Java 集合中的 TreeSet 和 TreeMap,C++ STL 中的 set、map,以及 Linux 虚拟内存的管理,都是通过红黑树去实现的。

    42610

    数据结构界的终极幻神----树

    我们称 为一组兄弟节点,它们都是节点 的子节点。我们还称 为节点n的子树。 空集合也是树,称为空树。...空树中没有节点; 孩子节点或子节点:一个节点含有的子树的根节点称为该节点的子节点; 节点的度:一个节点含有的子节点的个数称为该节点的度; 叶节点或终端节点:度为0的节点称为叶节点; 非终端节点或分支节点...,根为第1层,根的子节点为第2层,以此类推; 树的高度或深度:树中节点的最大层次; 堂兄弟节点:双亲在同一层的节点互为堂兄弟; 节点的祖先:从根到该节点所经分支上的所有节点; 子孙:以某节点为根的子树中任一节点都称为该节点的子孙...:叶节点除外的所有节点均含有两个子树的树被称为满二叉树; 完全二叉树:除最后一层外,所有层都是满节点,且最后一层缺右边连续节点的二叉树称为完全二叉树; 二叉搜索树:满足左子节点比父节点小,右子节点比父节点大...特殊的查找树 但所有子节点都比父节点大时,就会破会树状结构,这是就引入了一些新的树形结构AVL树,红黑树 完全二叉树 通俗来讲就是,该结构的n-1层都被填满,最后一层可以不满,但从左至右不能有空位,必须按位置顺序排列

    14210

    【从二叉树到红黑树】清晰理解红黑树的演变---红黑的含义

    红黑树 注:红黑数是平衡二叉树的一种,插入时遵循二叉树“左右”定律: 该父节点的左子节点:为小于父节点中且子树中最接近父节点值得数。 该父节点的右子节点:为大于父节点中且子树中最接近父节点值得数。...(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 注意: (01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。...例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。...从某个节点x出发(不包括该节点)到达一个叶节点的任意一条路径上,黑色节点的个数称为该节点的黑高度(x's black height),记为bh(x)。...关于bh(x)有两点需要说明: 第1点:根据红黑树的"特性(5) ,即从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点"可知,从节点x出发到达的所有的叶节点具有相同数目的黑节点。

    80041

    【从二叉树到红黑树】清晰理解红黑树的演变---红黑的含义

    红黑树 注:红黑数是平衡二叉树的一种,插入时遵循二叉树“左右”定律: 该父节点的左子节点:为小于父节点中且子树中最接近父节点值得数。 该父节点的右子节点:为大于父节点中且子树中最接近父节点值得数。...(5)从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 注意: (01) 特性(3)中的叶子节点,是只为空(NIL或null)的节点。...例如,Java集合中的TreeSet和TreeMap,C++ STL中的set、map,以及Linux虚拟内存的管理,都是通过红黑树去实现的。...从某个节点x出发(不包括该节点)到达一个叶节点的任意一条路径上,黑色节点的个数称为该节点的黑高度(x's black height),记为bh(x)。...关于bh(x)有两点需要说明: 第1点:根据红黑树的"特性(5) ,即从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点"可知,从节点x出发到达的所有的叶节点具有相同数目的黑节点。

    2.4K10

    史上全网最清晰后缀自动机学习(四)后缀自动机里的DAG结构

    我们注意到 后缀自动机的所有状态中包含的子串的集合恰好对应原串的所有不重复子串 首先来考虑单个串的问题. 我们首先构建该串的SAM....然后只需要求出所有节点中的子串的和——记做该节点的sum属性, 然后把所有节点的sum求和就是答案. 但是这种做法复杂度显然高了一点. 因为你还要维护每个节点的子串集合吧? 等等!...【3】中需要计算的是SAM节点上的endpos集合的大小, 本文需要计算的是SAM节点上的endpos集合中元素的和. 涉及SAM的题目多半是涉及子串的统计量的求解....validnum是该节点中不包含":"的子串的个数....所以一个节点的validnum域就是从自动机的0节点出发, 通过trans转移, 但是不经过":"的弧到达该节点的路径条数.

    83811

    MyBatis 源码分析 - 映射文件解析过程

    最后一种是通过包扫描的方式获取到某个包下的所有类,并使用第三种方式为每个类解析映射信息。 以上简单介绍了 MyBatis 加载映射文件或信息的几种方式。...我会在 2.3 节进行解释说明,这里先不说。 到此,关于 节点的解析过程就分析完了。本节的内容不是很难理解,就不多说了。...首先是获取并遍历子节点列表,然后为每个子节点创建 flags 集合,并添加 CONSTRUCTOR 标志。对于 idArg 节点,额外添加 ID 标志。...在该分支中,首先要获取 节点的子节点列表。...在上面三个子节点中,子节点1和子节点3都是文本节点,调用过程一致。因此,下面我只会演示子节点1和子节点2的递归调用过程。先来演示子节点1的调用过程,如下: ? 节点1的调用过程比较简单,只有两层调用。

    2.2K10

    动图展示,让你彻底理解红黑树!

    而且红黑树的每一个黑节点都是 3 节点中的最中间的那个值,或者是 2 节点中其中一个值。 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。...原因:红黑树这些黑色节点在 2-3-4 树中代表的是由 1 节点的一个 2-3-4 树,而 2-3-4 树是同一个子树的深度是相同的,平衡的,所以从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点...①左旋 原本的状态: ? 过程图: ? 结束图: ? 如上图所示,当在某个目标结点 E 上,做左旋操作时,我们假设它的右孩子 S 不是 NIL。...同左旋类似,当在某个目标结点 S 上,做右旋操作时,我们假设它的右孩子 S 不是 NIL。...例如,Java 集合中的 TreeSet 和 TreeMap,C++ STL 中的 set、map,以及 Linux 虚拟内存的管理,都是通过红黑树去实现的。

    66050

    字典树简介

    2.性质 (1)根节点不包含字符,除根节点外每一个节点都只包含一个字符。 (2)从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。 (3)每个节点的所有子节点包含的字符都不相同。...如果该节点不是一个字符串节点,且其没有其他子节点,可以将该节点从其父节点的子节点列表中删除,并继续向上遍历父节点。 重复步骤3和4,直到所有需要删除的节点都被删除或者遍历到根节点为止。...查找 从字典树中查找一个字符串的过程如下: 从根节点开始,依次取出要查找字符串中的每个字符。 对于每个字符,在当前节点的子节点中查找是否存在该字符。...在字符串的最后一个字符所对应的节点上,检查是否设置了标记,如果设置了,则说明要查找的字符串存在于字典树中,返回成功;否则,说明该节点代表的是某个前缀而不是一个完整的字符串,返回失败。...它的主要性质包括从根节点到某个节点路径上的字符连接起来即为该节点所表示的字符串,每个节点的所有子节点所表示的字符串都不相同,以及字典树中的每个节点都可以代表一个字符串。

    98530

    Redis必知必会

    向字典中添加新的键值对时,程序需要先根据键来计算出对应的一个哈希值,再根据哈希值计算出索引值,最后将此键值对封装在哈希表节点中后,放到节点数组的指定索引上,关键步骤参考如下代码: // 使用哈希函数计算键的哈希值...再从一级索引中选取部分节点组成一个新链表作为原始链表的二级索引,以此递归。...有了这个结构之后,我们在查找某个节点元素的时候,就会由原来的遍历几乎所有节点变成遍历部分节点甚至无需遍历,直接根据索引定位元素,这样的操作效率会高很多。...有序集合保存的元素数量不超过128个。 有序集合保存的所有元素的成员长度都小于64字节。...BGSAVE命令 该命令是异步版本的SAVE命令,它会使用redis服务器进程的子进程创建一个.rdb文件。该命令在创建子进程时会存在短暂的阻塞,之后服务器便可以继续处理其他客户端的请求。

    1.1K20

    纸上谈兵: 图 (graph)

    图(graph)是一种比较松散的数据结构。它有一些节点(vertice),在某些节点之间,由边(edge)相连。节点的概念在树中也出现过,我们通常在节点中储存数据。边表示两个节点之间的存在关系。...在树中,我们用边来表示子节点和父节点的归属关系。树是一种特殊的图,但限制性更强一些。 这样的一种数据结构是很常见的。比如计算机网络,就是由许多节点(计算机或者路由器)以及节点之间的边(网线)构成的。...欧拉的基本思路是,如果某个节点不是起点或者终点,那么连接它的边的数目必须为偶数个(从一个桥进入,再从另一个桥离开)。...一个图的所有节点构成一个集合[$V$]。一个边可以表示为[$(v_1, v_2)$],其中[$v_1, v_2 \in V$],即两个节点。...这样的路径可能有不止一条,我们往往会根据路径的长度以及沿线的拥挤状况,来选择一条最佳的路线。如果存在一条长度大于0的路径,该路径的两端为同一节点,那么认为该图中存在环路(cycle)。

    942100

    JQuery选择器(中)

    ):选取所有该mix且具有attr属性的节点 $("mix[@attr=a_value"]):选取所有该mix且具有attr属性并满足属性值为a_value的节点 $("mix[@attr^=a_value_head...=a_value"]):attr属性的属性值中包含a_value 7.伪类选择器 具有限定子节点选择器:$("mix1[mix2]"):返回包含mix2的mix1节点.如:$("div[a]"):包含a.../p"):所有div节点的父节点下的p标签 还有相对路径的写法以及支持的Axis选择器,还不是会应用,不介绍了...已经一大堆了 $的其他用法: $(html节点):根据提供的原始HTML标记字符串,动态创建由...这个元素在匹配元素集合中的位置变为0,而集合长度变成1 gt(数字):将匹配的元素集合缩减为给定位置之后的所有元素 lt(数字):将匹配的元素集合缩减为给定位置之前的所有元素 上面三个的例子: $("div...: $("div").index($(".test"))[1] //表示从所有div节点中查找class属性为test的节点.并且找的是第二个节点(基数从0开始).返回值是该节点在div节点中的位置(基数也是从

    2.4K90

    《offer来了》第四章学习笔记

    (1)在待删除的节点没有子节点时,直接删除该节点,即在其父节点中将其对应的子节点置空即可。要删除的节点 14 没有子节点,则直接将其删除即可。 ?...(2)在待删除的节点只有一个子节点时,使用子节点替换当前节点,然后删除该节点即可。要删除的节点 5 有一个子节点 8,则使用子节点 8 替换需要删除的节点 5,然后删除节点 5 的数据即可。 ?...◎ 每个叶子节点(NIL)都是黑色的。 ◎ 如果一个节点是红色的,则它的子节点必须是黑色的。 ◎ 从一个节点到该节点的子孙节点的所有路径上都包含相同数量的黑色节点。 结构 ?...,通常表示为 G(V,E),其中 G 表示一个图,V 是图 G 中顶点的集合,E 是图 G 中边的集合。...8.位图 基于数组实现,将数组中的每个元素都看作一系列二进制数,所有元素一起组成更大的二进制集合,这样就可以大大节省空间。

    1K40
    领券