Matplotlib 系列:colorbar 的设置

article/2025/10/4 18:48:00

转载于:Matplotlib 系列:colorbar 的设置

该文为我很及时的解决了我的烦恼,再次向作者致意~
作者一直在持续更新python系列,请支持原作者,文章来源:炸鸡人博客

0. 前言

承接 Matplotlib 系列:colormap 的设置 一文,这次介绍 colorbar。所谓 colorbar 即主图旁一个长条状的小图,能够辅助表示主图中 colormap 的颜色组成和颜色与数值的对应关系。本文将会依次介绍 colorbar 的基本用法、如何设置刻度,以及怎么为组图添加 colorbar。代码基于 Matplotlib 3.3.4。

1. colorbar 的基本用法

Colorbar 主要通过 figure.colorbar 方法绘制,先介绍常用的几个参数

  • mappable:直译为“可映射的”,要求是 matplotlib.cm.ScalarMappable 对象,能够向 colorbar 提供数据与颜色间的映射关系(即 colormap 和 normalization 信息)。主图中使用 contourfpcolormeshimshow 等二维绘图函数时返回的对象都属于 ScalarMappable
  • cax:colorbar 本质上也是一种特殊的 axes,我们为了在画布上决定其位置、形状和大小,可以事先画出一个空 axes,然后将这个 axes 提供给 cax 参数,那么这个空 axes 就会变成 colorbar。
  • ax:有时我们懒得手动为 colorbar 准备好位置,那么可以用 ax 参数指定 colorbar 依附于哪个 axes,接着 colorbar 会自动从这个 axes 里“偷”一部分空间来作为自己的空间。
  • orientation:指定 colorbar 的朝向,默认为垂直方向。类似的参数还有 location
  • extend:设置是否在 colorbar 两端额外标出 normalization 范围外的颜色。如果 colormap 有设置过 set_underset_over,那么使用这两个颜色。
  • ticks:指定 colorbar 的刻度位置,可以接受 ticks 的序列或 Locator 对象。
  • format:指定 colorbar 的刻度标签的格式,可以接受格式字符串,例如 '%.3f',或 Formatter 对象。
  • label:整个 colorbar 的标签,类似于 axes 的 xlabel 或 ylabel。

此外 colorbar 还有些设置不能在初始化的时候一次性搞定,需要接着调用方法才能完成。

1.1 单独绘制 colorbar

虽然 colorbar 一般依附于一张填色的主图,但其实只要给出 colormap 和 normalization 就能决定 colorbar 了。下面给出单独绘制 colorbar 的例子

import copy
import numpy as npimport matplotlib as mpl
import matplotlib.pyplot as pltfig, axes = plt.subplots(4, 1, figsize=(10, 5))
fig.subplots_adjust(hspace=4)# 第一个colorbar使用线性的Normalize.
cmap1 = copy.copy(mpl.cm.viridis)
norm1 = mpl.colors.Normalize(vmin=0, vmax=100)
im1 = mpl.cm.ScalarMappable(norm=norm1, cmap=cmap1)
cbar1 = fig.colorbar(im1, cax=axes[0], orientation='horizontal',ticks=np.linspace(0, 100, 11),label='colorbar with Normalize'
)# 第二个colorbar开启extend参数.
cmap2 = copy.copy(mpl.cm.viridis)
cmap2.set_under('black')
cmap2.set_over('red')
norm2 = mpl.colors.Normalize(vmin=0, vmax=100)
im2 = mpl.cm.ScalarMappable(norm=norm2, cmap=cmap2)
cbar2 = fig.colorbar(im2, cax=axes[1], orientation='horizontal',extend='both', ticks=np.linspace(0, 100, 11),label='extended colorbar with Normalize'
)# 第三个colorbar使用对数的LogNorm.
cmap3 = copy.copy(mpl.cm.viridis)
norm3 = mpl.colors.LogNorm(vmin=1E0, vmax=1E3)
im3 = mpl.cm.ScalarMappable(norm=norm3, cmap=cmap3)
# 使用LogNorm时,colorbar会自动选取合适的Locator和Formatter.
cbar3 = fig.colorbar(im3, cax=axes[2], orientation='horizontal',label='colorbar with LogNorm',
)# 第四个colorbar使用BoundaryNorm.
bins = [0, 1, 10, 20, 50, 100]
nbin = len(bins) - 1
cmap4 = mpl.cm.get_cmap('viridis', nbin)
norm4 = mpl.colors.BoundaryNorm(bins, nbin)
im4 = mpl.cm.ScalarMappable(norm=norm4, cmap=cmap4)
# 使用BoundaryNorm时,colorbar会自动按bins标出刻度.
cbar4 = fig.colorbar(im4, cax=axes[3], orientation='horizontal',label='colorbar with BoundaryNorm'
)plt.show()

colorbar_only

colorbar 使用的 colormap 和 normalization 的信息可以通过 cbar.cmapcbar.norm 属性来获取。

1.2 向主图添加 colorbar

日常使用中一般不会单独画出 colorbar,而是将 colorbar 添加给一张主图。此时需要将主图中画填色图时返回的 ScalarMappable 对象传给 colorbar,并利用 caxax 参数指定 colorbar 的位置。下面是一个例子

def add_box(ax):'''用红框标出一个ax的范围.'''axpos = ax.get_position()rect = mpl.patches.Rectangle((axpos.x0, axpos.y0), axpos.width, axpos.height,lw=3, ls='--', ec='r', fc='none', alpha=0.5,transform=ax.figure.transFigure)ax.patches.append(rect)def add_right_cax(ax, pad, width):'''在一个ax右边追加与之等高的cax.pad是cax与ax的间距.width是cax的宽度.'''axpos = ax.get_position()caxpos = mpl.transforms.Bbox.from_extents(axpos.x1 + pad,axpos.y0,axpos.x1 + pad + width,axpos.y1)cax = ax.figure.add_axes(caxpos)return caxdef test_data():'''生成测试数据.'''x = np.linspace(-3, 3, 200)y = np.linspace(-3, 3, 200)X, Y = np.meshgrid(x, y)Z = np.exp(-X**2) + np.exp(-Y**2)# 将Z缩放至[0, 100].Z = (Z - Z.min()) / (Z.max() - Z.min()) * 100return X, Y, ZX, Y, Z = test_data()
cmap = mpl.cm.viridisfig, axes = plt.subplots(2, 2, figsize=(10, 10))
fig.subplots_adjust(hspace=0.2, wspace=0.2)# 提前用红框圈出每个ax的范围,并关闭刻度显示.
for ax in axes.flat:add_box(ax)ax.axis('off')# 第一个子图中不画出colorbar.
im = axes[0, 0].pcolormesh(X, Y, Z, cmap=cmap, shading='nearest')
axes[0, 0].set_title('without colorbar')# 第二个子图中画出依附于ax的垂直的colorbar.
im = axes[0, 1].pcolormesh(X, Y, Z, cmap=cmap, shading='nearest')
cbar = fig.colorbar(im, ax=axes[0, 1], orientation='vertical')
axes[0, 1].set_title('add vertical colorbar to ax')# 第三个子图中画出依附于ax的水平的colorbar.
im = axes[1, 0].pcolormesh(X, Y, Z, cmap=cmap, shading='nearest')
cbar = fig.colorbar(im, ax=axes[1, 0], orientation='horizontal')
axes[1, 0].set_title('add horizontal colorbar to ax')# 第三个子图中将垂直的colorbar画在cax上.
im = axes[1, 1].pcolormesh(X, Y, Z, cmap=cmap, shading='nearest')
cax = add_right_cax(axes[1, 1], pad=0.02, width=0.02)
cbar = fig.colorbar(im, cax=cax)
axes[1, 1].set_title('add vertical colorbar to cax')plt.show()

colorbar_and_ax

组图通过 plt.subplots 函数创建,这里用红色虚线方框圈出每个子图开始时的范围。然后第一个子图内画图但不添加 colorbar,可以看到其范围与红框重合;第二个子图内用 ax 参数指定 colorbar 依附于该子图,可以看到子图的水平范围被 colorbar 偷走了一部分,同理第三个子图的垂直范围被偷走了一部分;而第四个子图中因为手动在子图右边创建了一个新的 axes 并指定为 cax,所以 colorbar 并没有挤占子图原有的空间。

总之,向主图添加 colorbar 时,ax 参数用起来更方便,但会改变主图的范围;cax 参数需要提前为 colorbar 准备一个 axes,但 colorbar 的摆放位置更为灵活。

2. 设置刻度

第 1 节中提到过,在初始化 colorbar 时通过 ticksformat 参数即可设置刻度。实际上,colorbar 在接受刻度的设置后,会将它们传给底层的 axes 对象,利用 axes 的方法来实现刻度的标注。所以为 colorbar 设置刻度有两种思路

  • 利用 colorbar 提供的接口设置刻度,优点是简单直接,缺点是对于小刻度等参数无法进行细致的设定。
  • 直接操作 colorbar 底层的 axes,优点是设置更细致,缺点是可能会受 cbar.update_ticks 方法的干扰。

正因为这两种思路都行得通,所以你上网搜如何设置刻度时能找到五花八门的方法,下面便来一一辨析这些方法。

另外需要提前说明一下,colorbar 不同于普通的 axes,只会显示落入 cbar.vmincbar.vmax 这两个值范围内的 ticks,而这两个值由 colorbar 含有的 normalization 的信息决定(例外会在后面提到)。

2.1 ticks 和 format 参数

cmap = mpl.cm.viridis
norm = mpl.colors.Normalize(vmin=0, vmax=100)
im = mpl.cm.ScalarMappable(norm=norm, cmap=cmap)
locator = mpl.ticker.MultipleLocator(10)
formatter = mpl.ticker.StrMethodFormatter('{x:.1f}')cbar = fig.colorbar(im, cax=ax, orientation='horizontal',ticks=locator, format=formatter
)
cbar.minorticks_on()

colorbar_ticks

直接在初始化 colorbar 的时候给出指定 ticksformat 参数即可。

小刻度则通过 minorticks_on 方法开启,可惜这个方法不提供任可控调节的参数,查看源码会发现,colorbar 是借助 matplotlib.ticker.AutoMinorLocator 实现小刻度的,其中小刻度的间隔数 n 被硬编码为默认值 None,所以小刻度的数目会根据大刻度的数值设为 3 个或 4 个,例如图中两个大刻度间就是 4 个小刻度。

2.2 locator 和 formatter 属性

cbar = fig.colorbar(im, cax=ax, orientation='horizontal')
cbar.locator = locator
cbar.formatter = formatter
cbar.minorticks_on()
cbar.update_ticks()

图跟 2.1 节的一样。直接修改 locatorformatter 属性,接着调用 update_ticks 方法刷新刻度,将这两个属性传给底层的 axes,从而使刻度生效。2.1 节中不需要刷新是因为初始化的最后会自动刷新。

2.3 set_ticks 和 set_ticklabels 方法

ticks = np.linspace(0, 100, 11)
ticklabels = [formatter(tick) for tick in ticks]
cbar = fig.colorbar(im, cax=ax, orientation='horizontal')
cbar.set_ticks(ticks)
cbar.set_ticklabels(ticklabels)
cbar.minorticks_on()

图跟 2.1 节的一样。这个方法适用于手动给出 ticks 和与之匹配的 ticklabels 的情况。同时 set_ticksset_ticklabels 都有一个布尔类型的 update_ticks 参数,效果同 2.2 节所述,因为默认为 True,所以可以不用管它。奇怪的是,set_ticks 方法还可以接受 Locator 对象,不过当 Locator 与 ticklabels 对不上时就会发出警告并产生错误的结果。

也许你会联想到 axes 设置刻度的方法,并进行这样的尝试

cbar.ax.set_xticks(ticks)
cbar.ax.set_xticklabels(ticklabels)

可惜这种方法行不通,也是会报警加出错。

2.4 set_major_locator 和 set_major_formatter 方法

cbar = fig.colorbar(im, cax=ax, orientation='horizontal')
cbar.ax.xaxis.set_major_locator(locator)
cbar.ax.xaxis.set_minor_locator(mpl.ticker.AutoMinorLocator(2))
cbar.ax.xaxis.set_major_formatter(formatter)
# cbar.update_ticks()

图跟 2.1 节的一样。虽然 2.3 中直接调用 set_xticksset_xticklabels 的方法失败了,但神秘的是直接调用 set_major_locatorset_major_formatter 却可以,你甚至可以用 set_minor_locator 来实现更细致的小刻度。这里因为 colorbar 是水平放置的,所以操作的是 xaxis,垂直方向换成 yaxis 即可。

这种方法的缺点是,colorbar 的 locator 属性与 xaxis 的并不一致

In : print(cbar.locator)
Out: <matplotlib.colorbar._ColorbarAutoLocator object at 0x000001B424E36AF0>
In : print(cbar.ax.xaxis.get_major_locator())
Out: <matplotlib.ticker.MultipleLocator object at 0x000001B424E366A0>

尽管画出来的图是 MultipleLocator 的效果,但 cbar.locator 依旧保留初始化时的默认值,cbar.formatter 同理。如果此时执行 cbar.update_ticks(),就会将 cbar.ax.xaxis 的 locator 和 formatter 更新成 cbar.locatorcbar.formatter 的值——即变回默认效果。奇怪的是 minor locator 并不受 update_ticks 的影响,小刻度依然得到保留。

2.5 对数刻度

1.1 节中展示过,当传入的 mappablenormLogNorm 时,colorbar 会自动采取对数刻度和科学计数法的标签,并开启小刻度。下面是一个不用科学计数法,并关掉小刻度的例子

norm = mpl.colors.LogNorm(vmin=1E0, vmax=1E3)
im = mpl.cm.ScalarMappable(norm=norm, cmap=cmap)cbar = fig.colorbar(im, cax=ax, orientation='horizontal',format=mpl.ticker.ScalarFormatter()
)
cbar.minorticks_off()

colorbar_log

2.6 更多设置

如果想进一步设置刻度的参数(刻度长度、标签字体等),需要通过底层的 cbar.ax.tick_params 方法来实现。例如

cbar.ax.tick_params(length=2, labelsize='x-small')

总结一下的话,colorbar 提供了设置刻度的接口,但做得还不够完善,以至于我们需要直接操作底层的 axes。希望以后 Matplotlib 能对此加以改善。

3. Contourf 中的 colorbar

pcolorimshow 等函数的返回值传给 colorbar 时,colorbar 中会显示连续完整的 colormap;但若把 contourf 函数的返回值传给 colorbar 时,显示的就不再是完整的 colormap,而是等高线之间的填色(填色规则请见 Matplotlib 系列:colormap 的设置 第 3.1 节),下面是一个 pcolormeshcontourf 相对比的例子

X, Y, Z = test_data()
cmap = mpl.cm.viridis
norm = mpl.colors.Normalize(vmin=0, vmax=100)
levels = [10, 20, 40, 80]fig, axes = plt.subplots(1, 2, figsize=(10, 5))
for ax in axes:ax.axis('off')# 第一张图画pcolormesh.
im = axes[0].pcolormesh(X, Y, Z, cmap=cmap, norm=norm, shading='nearest')
cbar = fig.colorbar(im, ax=axes[0], extend='both')
axes[0].set_title('pcolormesh')# 第二张图画contourf.
im = axes[1].contourf(X, Y, Z, levels=levels, cmap=cmap, norm=norm, extend='both')
cbar = fig.colorbar(im, ax=axes[1])
axes[1].set_title('contourf')plt.show()

pcolor_contourf

可以看到效果与上面描述的一致,colorbar 上颜色间的分界位置也与 levels 的数值大小相对应。第 2 节中提到过,colorbar 的显示范围由 cbar.vmincbar.vmax 决定,且这两个值与 cbar.norm.vmincbar.norm.vmax 相同——不过使用 contourf 的返回值作为 mappable 时则是例外,这里 cbar.vmincbar.vmaxlevels 的边界决定。所以上图中 colorbar 的范围为 [10, 80]。

另外若 contourf 中指定过 extend 参数,那么其返回值会带有 extend 的信息,初始化 colorbar 时就不应该再设定 extend 参数了。Matplotlib 3.3 以后同时使用 extend 参数的行为被废弃。

4. 为组图添加 colorbar

4.1 为每个子图添加

最简单的方法是在绘制每个子图的 colorbar 时,将 ax 参数指定为子图的 axes,缺点是会改变子图形状,不过可以之后用 ax.set_aspect 等方法进行调整。下面利用 1.2 节中的 add_right_cax 函数实现 cax 的版本

X, Y, Z = test_data()
cmap = mpl.cm.viridis
norm = mpl.colors.Normalize(vmin=0, vmax=100)fig, axes = plt.subplots(2, 2, figsize=(8, 8))
# 调节子图间的宽度,以留出放colorbar的空间.
fig.subplots_adjust(wspace=0.4)for ax in axes.flat:ax.axis('off')cax = add_right_cax(ax, pad=0.01, width=0.02)im = ax.pcolormesh(X, Y, Z, cmap=cmap, norm=norm, shading='nearest')cbar = fig.colorbar(im, cax=cax)plt.show()

subplots_1

更高级的方法是使用 mpl_toolkits.axes_grid1.ImageGrid 类,例如

from mpl_toolkits.axes_grid1 import ImageGridfig = plt.figure(figsize=(8, 8))
grid = ImageGrid(fig, 111, nrows_ncols=(2, 2), axes_pad=0.5,cbar_mode='each', cbar_location='right', cbar_pad=0.1
)
# 这里ax是mpl_toolkits.axes_grid1.mpl_axes.Axes
for ax in grid:ax.axis('off')im = ax.pcolormesh(X, Y, Z, cmap=cmap, norm=norm, shading='nearest')# 官网例子中的cax.colorbar(im)用法自Matplotlib 3.2起废弃.cbar = fig.colorbar(im, cax=ax.cax)plt.show()

结果跟上面一张图差不多。ImageGrid 适合创建子图宽高比固定的组图(例如 imshow 的图像或等经纬度投影的地图),并且对于 colorbar 位置和间距的设置非常便利。此外还有利用 matplotlib.gridspec.GridSpecmpl_toolkits.axes_grid1.axes_divider 的方法,这里就不细讲了。

4.2 为整个组图添加

其实 colorbar 的 ax 参数还可以接受 axes 组成的列表(数组),从而实现为列表中的所有 axes 只添加一个 colorbar。例如

fig, axes = plt.subplots(2, 2, figsize=(8, 8))for ax in axes.flat:ax.axis('off')im = ax.pcolormesh(X, Y, Z, cmap=cmap, norm=norm, shading='nearest')cbar = fig.colorbar(im, ax=axes)plt.show()

subplots_2

再举个 ImageGrid 的例子

fig = plt.figure(figsize=(8, 8))
grid = ImageGrid(fig, 111, nrows_ncols=(2, 2), axes_pad=0.5,cbar_mode='single', cbar_location='right', cbar_pad=0.2,
)
for ax in grid:ax.axis('off')im = ax.pcolormesh(X, Y, Z, cmap=cmap, norm=norm, shading='nearest')cbar = fig.colorbar(im, cax=ax.cax)plt.show()

结果同上一张图。如果有更复杂的需求,例如在不改变子图形状的前提下,组图中不同区域的子图共用不同的 colorbar,那么建议使用 add_axes 的方法(参考 1.2 节的 add_right_cax 函数),或利用 matplotlib.gridspec.GridSpec 将 cax 穿插在组图间。感兴趣的读者可以读读参考链接中最后那篇。

5. 参考链接

官方教程

Customized Colorbars Tutorial

Overview of axes_grid1 toolkit

Cartopy 的例子

Using Cartopy and AxesGrid toolkit

可能是全网最详细的 colorbar 调整教程

matplotlibのcolorbarを解剖してわかったこと、あるいはもうcolorbar調整に苦労したくない人に捧げる話


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

相关文章

Chrome谷歌浏览器,清除css或js文件缓存的方法

在写网站首页界面的时候&#xff0c;css文件中给新建的<div>增加了class类的样式&#xff0c;但是无论怎样刷新都没有这个样式的效果。 F12打开开发模式&#xff0c;对比这个<div>与其他的区别&#xff0c;发现右下角的尺寸图中没有position的值&#xff0c;而pos…

浏览器-清理页面中js的缓存

【问题分析】 修改完 js文件中的代码后&#xff0c;页面刷新好几次并没有重新加载 js的文件&#xff0c;开始以为是文件设置没有修改成功&#xff0c;后来想到应该是浏览器对于 js文件的缓存机制引起的。 【解决方案】 清理浏览器的缓存 1.按“F12” 或者 右键单击页面“检查”…

js 浏览器缓存机制

什么是浏览器缓存 Web缓存是指一个Web资源&#xff08;如html页面&#xff0c;图片&#xff0c;js&#xff0c;数据等&#xff09;存在于Web服务器和客户端&#xff08;浏览器&#xff09;之间的副本。缓存会根据进来的请求保存输出内容的副本&#xff1b;当下一个请求来到的时…

哈希表和红黑树

哈希表 哈希表顾名思义是一张表&#xff0c;可以用它来存储键值对这种对应的数据&#xff0c;大家都知道&#xff0c;哈希表的查找速度很快&#xff0c;时间复杂度伪O(1)&#xff0c;那么它的查找速度为什么很快呢&#xff1f;   实际上&#xff0c;哈希表将键值变为数组的下…

3.1 哈希算法

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

高效的搜索方式:哈希

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

默克尔树入门

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

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

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

区块链 — 默克尔树

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

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

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

二、哈希算法和Merkle Tree

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

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

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

哈希表与树的介绍

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

简单哈希树

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

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

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

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

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

图文详解HashTree(哈希树)

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

哈希树HashTree(trie树)

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

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

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