哈希表与树的介绍

article/2025/10/4 19:14:58

前言

该篇文章,主要带我们认识什么哈希表和树,为我们在研究各个数据结构的实现及扩展算法,有个基本的认识。

哈希表

特点

  • 数组  :寻址容易  ;数据连续存储空间
  • 链表:插入与删除容易 ;放在堆内存中对象,存储并不连续
  • 哈希表:寻址容易,插入删除也容易的数据结构;一般采用数组加链表的格式

hashtable 

哈希表(Hash table,也叫散列表)
是根据关键码值(Key value)而直接进行访问的数据结构,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。

关键码值(Key value)也可以当成是key的hash值  ,这个映射函数叫做散列函数;存放记录的数组叫做散列表

hashtable例子

Key : {14, 19, 1, 7, 31, 13, 0, 18} 散列表: 大小为13 的数组 a[13]; 散列函数: f(x) = x mod 13;   

通过上面的展示去了解到整个hash表是什么.

缺点

扩容需要消费大量的空间和性能,因为需要重新计算数据的hash,因此整个散列表设置 容量大小 是相当重要的

应用

电话号码,字典,点歌系统,QQ,微信的好友等,以及缓存等,从jdk1.8以后从扩展的 putIfAbsent 方法 都是有利于我们实现缓存操作的

设计:拉链法

jdk1.8以前

整个散列表的实现,只要有hash 碰撞 就采用链表的形式进行解决;但链表的访问的时间复杂度是o(n) 的, 并且hash碰撞越大,链表越长,访问效率是很慢的,因此java实现的散列表不断在优化这个

jdk1.8开始 

当链表长度超过阈值,并且 容量达到默认64时,链表就转换成红黑树

树的概念

什么是树

树(tree) 是n(n>=0)个结点的有限集。n=0时,称为空树。有任意一颗非空树中:(1) 有且仅有一个特定的称为根 root的结点, (2) 当n>1 时,其余结点可分为m(m>0) 个互不相交的有限集, t1 t2  .... tn 其中每个集合也是一颗树,并且称为根的子树

结点与树的度

节点拥有的子树数称为结点的度。度为0的结点称为叶子结点或终端结点,度不为0的结点称为非终端结点或分支结点。除根结点以外,分支结点也称为内部结点,树的度是树内各结点的度的最大值

层次与深度

结点的层次(level)从根开始定义起,根为第一层,根的孩子为第二层。若某结点在第一层,则其子树根在l+1层。其双亲在同一层的结点互为堂兄妹。显然f k g h i互为堂兄弟  ce 也是的 。树的结点的最大层次称为树的深度或高度,当前树的深度为4 ,这个概念在我们研究树的情况获得更好的理解

森林

森林(forest) 是m(m>=0)棵不相交的树,多个树组成一森林

树的存储结构

双亲表示法

双亲表示法的方式,也就是通过 结点里面记录着父结点.

下标dataparent
0A-1
1B0
2D0
3C1
4E2
5F3
6K3
7G3
8H4
9I4

孩子表示法

通过记录下孩子,来表示树

双亲孩子表示法

把每个结点的孩子结点排列起来,以单链表作为存储结构,则n个结点有n个孩子链表,如果是叶子结点则此单链表为空,然后n个头指针又组成一个线性表,采用顺序存储结构,存放在一个一维数组中

这个是引用的别人图,我就没在画, 把双亲和孩子的存储结构给结合起来

孩子兄弟表示法

孩子兄弟表示法为每个节点设计三个域:一个数据域,一个该节点的第一个孩子节点域,一个该节点的下一个节点的兄弟指针域

 

二叉树

二叉树在应用中非常常用,无论avl树,还是红黑树等,都是基于二叉树的

二叉树定义

二叉树(Binary tree)是n(n>=0) 个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两颗互不相交的,分别称为根结点的左子树和右子树的二叉树组成

上图是一个斜树

上图为满二叉树,定义为除最后一层无任何子节点外,每一层上的所有结点都有两个子结点的二叉树。如果一棵二叉树的结点要么是叶子结点,要么它有两个子结点,这样的树就是满二叉树。(一棵满二叉树的每一个结点要么是叶子结点,要么它有两个子结点,但是反过来不成立,因为完全二叉树也满足这个要求,但不是满二叉树)

 

完全二叉树 ,定义 一棵深度为k的有n个结点的二叉树,对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树 ;

一颗深度为k,且有2的k次方-1个结点的二叉树称为满二叉树。

如果对满二叉树的结点进行编号, 约定编号从根结点起, 自上而下, 自左而右。则深度为k的, 有n个结点的二叉树, 当且仅当其每一个结点都与深度为k的满二叉树中编号从1至n的结点一一对应时, 称之为完全二叉树

从满二叉树和完全二叉树的定义可以看出, 满二叉树是完全二叉树的特殊形态, 即如果一棵二叉树是满二叉树, 则它必定是完全二叉树

二叉树存储结构

顺序存储,采用数组的存储方法 也就是堆 2n+1 2n+2

链式存储

 

二叉树的遍历

采用中序遍历的方式(LDR)

  public void midOrderTraverse(TreeNode root){if(root==null){return;}//LDRmidOrderTraverse(root.leftChild);System.out.print(root.data+" ");midOrderTraverse(root.rightChild);}

对于二叉排序树来说,用中序来遍历是能做顺序遍历,利用递归的方式进行实现中序遍历 是最简单的, 

规则是若树为空,则空操作返回,否则从根结点开始(注意并不是先访问根结点),
中序遍历根结点的左子树,然后是访问根结点,最后中序遍历右子树

利用 先遍历左边知道为空时,才返回打印最左边节点,在查看最左边节点右孩子肯定不存,就往上走,打印数据,在往右孩子走;以此类推,利用递归的特性

前序遍历法(DLR)

规则是若二叉树为空,则空操作返回,否则先访问跟结点,然后前序遍历左子树,再前序遍历右子树

public void traverse(TreeNode root){if(root==null){return;}System.out.print(root.data+" ");traverse(root.leftChild);traverse(root.rightChild);}

 

后序遍历法(LRD)

规则是若树为空,则空操作返回,否则从左到右先叶子后结点的方式遍历访问左右子树,最后是访问根结点

public void traverse(TreeNode root){if(root==null){return;}traverse(root.leftChild);traverse(root.rightChild);System.out.print(root.data+" ");}


http://chatgpt.dhexx.cn/article/A2qYoF6s.shtml

相关文章

简单哈希树

哈希树 在各种介绍里的都比较抽象,其实没有那么难,这里进行一个最简单的说明。 在将一个数进行哈希的时候,我曾经写过关于哈希的这么些东西:对于数,当一个质数不够用的时候,可以加上第二个质数,…

查找——图文翔解HashTree(哈希树)

引 在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。 之前我们介绍的各种…

图文详解哈希树-Merkle Tree(默克尔树)算法解析

2019独角兽企业重金招聘Python工程师标准>>> Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。[1] 1、Hash Hash是…

图文详解HashTree(哈希树)

引 在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。 之前我们介绍的各…

哈希树HashTree(trie树)

引 在各种数据结构(线性表、树等)中,记录在结构中的相对位置是随机的。因此在机构中查找记录的时需要进行一系列和关键字的比较。这一类的查找方法建立在“比较”的基础上。查找的效率依赖于查找过程中所进行的比较次数。 之前我们介绍的各种…

哈希(Hash)和哈希树(Merkle tree)

哈希函数(英语:Hash function)又称散列函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合&#xff0c…

哈希树总结-java版

目录 哈希树的理论基础 质数分辨定律 余数分辨定理 哈希树简介 查找 删除 优点 缺点 哈希树的java实现 节点 哈希树 哈希树的应用 哈希树的理论基础 质数分辨定律 这个定理可以简单的表述为:n个不同的质数可以“分辨”的连续整数的个数和他们的乘积相等…

哈希树的python实现

一、问题的背景 给定一组商品购买信息,找到商品购买中频繁出现的商品集。比如说,我们有如下的商品交易信息: 市场购物信息 TipItems1Bread, Milk2Bread, Diaper, Beer, Egg3Milk, Diaper, Beer, Coke4Bread, Milk, Diaper, Beer5Bread, Milk,…

哈希列表、哈希链、哈希树

通过哈希算法检验大量数据(比如大量文件)的一致性时,常见的存储方案: 哈希列表(Hash List) 原理: 计算每个数据的哈希值,保存为一个列表。记录该列表的哈希值,用于检验…

哈希树

哈希树: 哈希树(HashTree)算法就是要提供一种在理论上和实际应用中均能有效地处理冲突的方法。一般的哈希(Hash)算法都是O(1)的,而且基本是以空间换时间。这很容易导致对存储空间无限制的需求。本文中哈希树(HashTree)算法在实际操作中使用了一些技巧使…

哈希树 (HashTree)

在讲hash树之前首先我们来理解一下质数分辨定理。 什么是质数分辨定理? 什么是质数 : 即只能被 1 和 本身 整除的数。 为什么用质数:因为N个不同的质数可以 ”辨别“ 的连续整数的数量,与这些质数的乘积相同。 百度文库解答&#…

Merkle树介绍

默克尔树(Merkle树)又叫哈希树,是区块链数据存储运用到的一个重要的技术算法。 简单来说,哈希树(默克尔树)中,每个节点都标有一个数据块的加密哈希值。哈希树可以用来验证任何一种在计算机中和计…

Merkle Tree(默克尔树)算法解析

Merkle Tree概念 Merkle Tree,通常也被称作Hash Tree,顾名思义,就是存储hash值的一棵树。Merkle树的叶子是数据块(例如,文件或者文件的集合)的hash值。非叶节点是其对应子节点串联字符串的hash。[1] 1、Hash Hash是一个把任意长…

js中的var是什么意思

js中的var是定义变量的意思,使用和不使用var都能定义变量,但是两个变量的作用域不同。 (1)在函数中和函数外分别用var定义一个变量a,函数外的变量a是全局变量,函数内的变量a是局部变量,所以在函…

python中的var是什么什么的缩写_var是什么意思

展开全部 VAR是英文Video Assistant Referee的缩写,也被称作“视频助理裁判”,由现役裁判员担任,他的职责是通过回放视频向裁e5a48de588b63231313335323631343130323136353331333366303733判员提供信息,协助裁判员纠正改变比赛走…

var 作用域||变量

平常我们在使用js 的时候一般使用var来声明变量,相比于C语言Java当中的声明变量要简单一些,但是简单肯定也会有简单的不好之处。 一般来讲,在函数内部(local variable)中,js初始化变量加var的为局部变量不加…

第一讲:var的使用

目录 使用var声明变量 不使用var,直接给变量赋值 变量的作用域 全局变量和局部变量的混用 变量提升 总结 javascript中,使用var声明变量,看似简单易学,其实不然。 在我接触的许多编程语言中,如c, c#, vb, java, p…

let与var的区别

前端小白刚学习JavaScript接触到变量的时候可能会有点懵,那就是什么时候该用let,什么时候该用var,这里给大家一个最简单,最明了的答案,看完就能明白。 首先,let是拥有块级作用域的,什么是块级作…

val和var的区别

美图欣赏: 一.背景 学习过程中,会有很多小的并且容易混淆知识点,因此会把它记录下来。 二.val(value)和var(variable)的区别 基本语法: var|val 变量名 : 变量类型 变量值1.使用var或者val定义一个变量。 使用var(variable)声…

var

在函数中&#xff0c;使用var声明的变量&#xff0c;为局部变量&#xff0c;只能在函数内部访问。 不使用var声明的变量&#xff0c;为全局变量&#xff0c;在函数外边也能访问。 没有var的情况 <script type"text/javascript">a 10;function demo() {console…