哈希表和红黑树

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

哈希表

  哈希表顾名思义是一张表,可以用它来存储键值对这种对应的数据,大家都知道,哈希表的查找速度很快,时间复杂度伪O(1),那么它的查找速度为什么很快呢?
  实际上,哈希表将键值变为数组的下标,而将下标对应的值变为键值对的值,这样的话就可以通过下标的方式来获取对应的值,因此其查找速度非常快。
  那么key值是如何变为哈希表的下标的呢?这里就要用到散列函数,通过散列函数将key值变为数组的下标。
最常用的构造散列函数的方法是除留余数法。对于散列表长为m的散列函数公式为:

f(key) = key mod p(p≤m)

  这种方法不仅可以对关键字直接取模,也可在折叠、平方取中后再取模。散列表长为m,通常p为小于或等于表长(最好接近m)的最小质数或不包含小于20质因子的合数。
  举个例子,哈希函数是
H(k)=k Mod m。m=12,k=100,H(100)=4。
   而如果m=2k,那么无论k是什么,H(K)的值都是一个0和奇数,也即是说只要奇数槽和0槽被占用,其他的偶数槽都是浪费掉了。如果m=2^r,那么H(k)的值就是k的低r位(化成二进制)。这样造成的后果是某一个槽有很多的关键字。所以来说一般的m取值尽量不要接近2的整数幂,而且还要是质数。
  由上面的散列函数可知,同一个key可以对应多个value,这就是哈希冲突 。当关键字值域远大于哈希表的长度,而且事先并不知道关键字的具体取值时,冲突就难免会发生。另外,当关键字的实际取值大于哈希表的长度时,而且表中已装满了记录,如果插入一个新记录,不仅发生冲突,而且还会发生溢出。因此,处理冲突和溢出是哈希技术中的两个重要问题。一般有开放地址法、链地址法。
  链地址法:将所有关键字为同义词的记录存储在一个单链表中,这种链表叫做同义词子表,使用除留余数法,就不存在冲突的问题了,只是在链表中增加一个结点。
在这里插入图片描述

红黑树

二叉排序树

二叉排序树,又称二叉查找树、二叉搜索树
二叉排序树是具有下列性质的二叉树:

  • 若左子树不空,则左子树上所有结点的值均小于它的根结点的值
  • 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值
  • 左、右子树也分别为二叉排序树
    在这里插入图片描述

根据二叉排序树这个特点我们可以知道,二叉排序树的中序遍历一定是从小到大的,比如上图,中序遍历结果是:

1 3 4 6 7 8 10 13 14

二叉排序树的性能取决于二叉树的层数:

  • 最好的情况是 O(logn),存在于完全二叉排序树情况下,其访问性能近似于折半查找
  • 最差时候会是 O(n),比如插入的元素是有序的,生成的二叉排序树就是一个链表,这种情况下,需要遍历全部元素才行(见下图 b)

在这里插入图片描述
为了改变二叉排序树的不足,出现了二叉平衡树,其实红黑树也是一种二叉平衡树,只是没有二叉平衡树那么平衡。

二叉平衡树

二叉平衡数(AVL)只是在二叉搜索数的基础上又加了一条定义:

  • 每个节点左子树的高度与右子树高度之差的绝对值不超过1
    在这里插入图片描述
    5号节点的左子树高度为3,右子树高度为1,两边高度之差绝对值为2,违反了规则,不是平衡二叉树。
    平衡二叉树其实就是高度相对平衡的有两个子节点的有序树。

红黑树

红黑树本质上是一种二叉查找树,但它在二叉查找树的基础上额外添加了一个标记(颜色),同时具有一定的规则。这些规则使红黑树保证了一种平衡,插入、删除、查找的最坏时间复杂度都为 O(logn)。

它的统计性能要好于平衡二叉树(AVL树),因此,红黑树在很多地方都有应用。比如在 STL中的Map的key和Set。
在这里插入图片描述
红黑树规则如下:

  • 每个节点要么是红色,要么是黑色;
  • 根节点永远是黑色的;
  • 所有的叶节点都是是黑色的(注意这里说叶子节点其实是上图中的 NIL 节点);
  • 每个红色节点的两个子节点一定都是黑色;
  • 从任一节点到其子树中每个叶子节点的路径都包含相同数量的黑色节点;

平衡二叉树和红黑树的区别:
1、平衡二叉树的左右子树的高度差绝对值不超过1,但是红黑树在某些时刻可能会超过1,只要符合红黑树的五个条件即可。
2、二叉树只要不平衡就会进行旋转,而红黑树不符合规则时,有些情况只用改变颜色不用旋转,就能达到平衡。

Hash与红黑树的区别:

权衡三个因素: 查找速度, 数据量, 内存使用,可扩展性,有序性。
  hash查找速度会比RB树快,而且查找速度基本和数据量大小无关,属于常数级别;而RB树的查找速度是log(n)级别。并不一定常数就比log(n) 小,因为hash还有hash函数的耗时。当元素达到一定数量级时,考虑hash。但若你对内存使用特别严格, 希望程序尽可能少消耗内存,那么hash可能会让你陷入尴尬,特别是当你的hash对象特别多时,你就更无法控制了,而且 hash的构造速度较慢。

  • 红黑树是有序的,Hash是无序的,根据需求来选择。
  • 红黑树占用的内存更小(仅需要为其存在的节点分配内存),而Hash事先应该分配足够的内存存储散列表,即使有些槽可能弃用
  • 红黑树查找和删除的时间复杂度都是O(logn),Hash查找和删除的时间复杂度都是O(1)。

http://chatgpt.dhexx.cn/article/7j8MMEWi.shtml

相关文章

3.1 哈希算法

哈希算法在区块链系统中的应用很广泛:比特币使用哈希算法通过公钥计算出了钱包地址、区块头以及交易事务的哈希值,梅克尔树结构本身就是一棵哈希树,就连 挖矿算法都是使用的哈希值难度匹配;以太坊中的挖矿计算也使用了哈希算法&am…

高效的搜索方式:哈希

前言 顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过关键码的多次比较。顺序结构查找时间复杂度为O(N),平衡树查找时间复杂度为O(logN),搜索的效率取决于搜索过程中…

默克尔树入门

目录 什么是默克尔树构建默克尔树的过程默克尔树验证的原理参考 什么是默克尔树 默克尔树(Merkle tree)是一种数据结构,以它的提出者默克尔命名,根据默克尔树的性质也可以叫哈希树,是一种典型的二叉树。 默克尔树由根…

java merkle树,使用Merkle树检测数据不一致(翻译)

背景 Cassandra的逆熵功能使用Merkle树来检测副本之间的数据不一致。 定义 Merkle树是一种哈希树,其中的叶子包含各个数据块的哈希值,父节点包含其各自的子节点的哈希值。它提供了一种有效的方法来查找副本上存储的数据块中的差异,并减少了传…

区块链 — 默克尔树

文章目录 默克尔树生成过程应用场景在区块链中的应用 默克尔树 默克尔树(又叫哈希树)是一种典型的二叉树结构,有一个根节点、一组中间节点和一组叶节点组成。默克尔树最早由 Merkle Ralf 在 1980 年提出,曾广泛用于文件系统和P2P…

哈希算法的原理以及代码实现

哈希函数: 简单来说就是把红框内的数字根据 一定规律 存放到下方白色的数组中 (称为哈希表) 这里它的一定规律是 取余法 H(key)key%p (还有其他方法,这里采用的是取余法),p为这个…

二、哈希算法和Merkle Tree

章节系列目录:点击跳转 文章目录 哈希算法哈希函数的定义可靠哈希函数需满足的要求哈希函数的主要作用哈希实际例子 Merkle Tree默克尔树完整性校验的方法哈希列表 Hash ListMerkle Tree 哈希树总结 哈希算法 哈希函数的定义 哈希函数:给一个任意大小的…

Android安全启动学习(四):device-mapper-verity (dm-verity)和哈希树

上一篇说AVB内存装不下的较大分区(如文件系统)可能会使用哈希树,还提到了dm-verity。这篇来看看这两个是啥? dm-verity 1、dm-verity 1、能不能将多个硬盘,映射成一个逻辑的硬盘,那样我们程序就不用关心复…

哈希表与树的介绍

前言 该篇文章,主要带我们认识什么哈希表和树,为我们在研究各个数据结构的实现及扩展算法,有个基本的认识。 哈希表 特点 数组 :寻址容易 ;数据连续存储空间链表:插入与删除容易 ;放在堆内…

简单哈希树

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

查找——图文翔解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个不同的质数可以 ”辨别“ 的连续整数的数量,与这些质数的乘积相同。 百度文库解答&#…