当前位置: 首页 > news >正文

哈希树讲解

       哈希树(HashTree)是哈希(Hash)算法的一种延续。传统数据结构中对如何避免哈希冲突都有一定的描述和解释,但是这些描述和解释都是泛泛而谈,并没有提出比较好的解决方案。这里所提到的哈希树(HashTree)算法就是要提供一种在理论上和实际应用中均能有效地处理冲突的方法。
        有关哈希树(HashTree)算法的理论解释以及与其他算法的评估可以参考文档《哈希树(HashTree)》。文中的理论和有关的数据操作描述还不见得完善,这里可以给出有关的源代码和相关编译后的可验证文件。点击这里下载源代码和可验证文件。整个代码使用Java编写,建议使用Eclipse、JBuilder或者NetBean等Java编译工具进行编译。
        本文中所提到的哈希树(HashTree)算法与其他哈希(Hash)算法相比有如下特点:
        (1)本文中解决哈希树(HashTree)冲突的算法是以“无限定”算法映射“无限定”范围的键值,因此解决冲突的方法永远有效。实际应用中会有一定限制,例如:最多4G个对象。
        (2)本文中哈希树(HashTree)算法对键值的长度和类型范围没有任何要求。可以是整数,也可以是字符串;不需要对键值压缩或者重新编码。实际应用中会对键值范围有一定限定,例如:键值最长为64字节。
        当然也可以调整程序全局设置,使其支持256字节甚至更长的键值。这种调整不会影响算法理论上的效率。算法理论上的效率仅和所需要分辨的对象个数有关,与键值长度无关。
        (3)“最小”哈希树(HashTree)在从4G个对象中找出所匹配的对象,比较次数不超过10次。也就是说:最多属于O(10)。在实际应用中,调整了质数的范围,使得比较次数一般不超过5次。也就是说:最多属于O(5)。因此可以根据自身需要在时间和空间上寻求一个平衡点。
        (4)本文中哈希树(HashTree)算法对哈希(Hash)算法对空间需求的无限膨胀提出了有效的解决方法。一般的哈希(Hash)算法都是O(1)的,而且基本是以空间换时间。这很容易导致对存储空间无限制的需求。
        本文中哈希树(HashTree)算法在实际操作中使用了一些技巧使得对空间的需求控制在一定范围内。即空间需求仅和所需要存储的对象个数有关,不会无限制地“膨胀”下去。
        (5)在一些索引算法中,如果遇到数据的反复增、删、改过程,很容易导致数据结构的退化。为了避免这种退化,就需要经常对数据结构作出“平衡”调整。
        本文中哈希树(HashTree)算法在数据的反复增、删、改过程中,无需对数据结构做出任何“平衡”操作。即使长期处于复杂的数据操作过程中,仍能很好地保持其基本性质。
        所提供的代码已经经过实际六年以上的运行检验,完全可以值得信赖。有关理论方面的了解还是请参考文档《哈希树(HashTree)》。这里主要介绍有关代码使用方面的问题。
        基于哈希树(HashTree)算法的文件存储模式核心代码文件就两个:HashFileNodeBuffer.java和HashFileContainer.java。这两个类均在目录“/source/com/simpleteam/container/hash”下。如果想使用数据包的功能,可以参考HashFileContain下面的main函数,里面有一个标准的例子。主要的步骤如下:
        步骤1.创建一个文件。

File file = new File("container.file");

        步骤2.创建一个类要求使用指定的文件,以及定义存储数据的空间。这个空间要求数据都能存储在里面,不能超过此空间大小要求。

HashFileContainer container = new HashFileContainer(file,pageSize);


步骤3.检查文件是否安全关闭。如果没有安全关闭可以选择重建所有数据。如果数据量很大,重建数据可能会需要很多时间。

if(!container.isSafelyClosed()) {……container = rebuild(container)……}

        步骤4.在以上操作完毕之后,可以进行以下相关操作:
        (1)检查容器中是否存在某键值。

if(container.exists(key)) {……}

        (2)获得键值所对应的数值。

Object value = container.get(key);

        (3)存储键值以及其所对应的数据。常见的Integer、Long、byte[]、String均可存储,可存储对象要求至少能Serializable。对于Expiration可以填写,也可以不填写。

container.put(key,value);container.put(key,value,expiration);

        (4)删除键值所对应的数据。如果提取到数据,那么原始数据将从数据文件中被删除。

Object value = container.remove(key);

        步骤5.安全关闭该容器。

container.close();

        以上所有操作均不是线程安全的。也就是说如果想将该容器类用于多线程操作,请单独进行安全操作封装。
        HashFileContainer.main函数的主要意图是建立了一个线性表用来验证哈希数(HashTree)操作的正确性和有效性。测试中要求对1000000数据进行反复的增、删操作。打印部分展示了有关哈希树(HashTree)的三个参数:数据量(size);当前1000个数据的平均操作时间;总的数据平均操作时间。一般来说随着数据量的增加,操作时间会逐渐增加。
        由于该程序使用Java编写,而且所有的操作基本基于磁盘操作,因此效率有限。如果使用C/C++根据原理改写相关的代码,效率至少在3~10倍以上

相关文章:

哈希树讲解

哈希树(HashTree)是哈希(Hash)算法的一种延续。传统数据结构中对如何避免哈希冲突都有一定的描述和解释,但是这些描述和解释都是泛泛而谈,并没有提出比较好的解决方案。这里所提到的哈希树(HashTree)算法就是要提供一种在理论上和实际应用中均能有效地处…...

vue 项目启动后一直不断的刷新停不下来

新建的vue 项目,配置了代理后项目一直刷新,停不下来,各种查找最后发现是vue.config.js 中的热更新配置项目开启的原因 const {defineConfig } require(vue/cli-service) const AutoImport require(unplugin-auto-import/webpack) const Co…...

makesense在线yolov5标注

文章目录 一、创建图片文件夹和label.txt二、在线标注数据 参考文章博主:风吹落叶花飘荡 一、创建图片文件夹和label.txt 创建一个放置图片的文件夹images,存放需要标注的图片(图片最好重命名为1,2,3…避免后面混淆) 创建label.t…...

python 之 矩阵相关操作

文章目录 1. **创建矩阵**:2. **矩阵加法**:3. **矩阵乘法**:4. **矩阵转置**:5. **元素级操作**:6. **汇总统计**:7. **逻辑操作**: 理解你的需求,我将为每个功能写一个单独的代码块…...

敢问路在何方

从2022年进入软件行业到现在,二十二年眨眼之间过去了,依然奋斗在编码第一线,挣扎在第一线,借此程序员佳节之际回顾一下这许多年的历程。 由于本人混得实在不好,工作过的地方都用某单位某公司来代替实际的,到…...

复习mysql中的事务

一个事务的开始和结尾必须是 start transaction | commit; rollback 事务特性 1.原子性:多个操作打包成一个整体,要么全部执行,要么一个都不执行。 不过这里的“一个都不执行”并不是真正的全不执行,只是看起来与没执行一样。…...

力扣刷题 day52:10-22

1.数组拆分 给定长度为 2n 的整数数组 nums ,你的任务是将这些数分成 n 对, 例如 (a1, b1), (a2, b2), ..., (an, bn) ,使得从 1 到 n 的 min(ai, bi) 总和最大。 返回该 最大总和 。 方法一:排序 #方法一:排序 def arrayPai…...

ELK概述部署和Filebeat 分布式日志管理平台部署

ELK概述部署、Filebeat 分布式日志管理平台部署 一、ELK 简介二、ELK部署2.1、部署准备2.2、优化elasticsearch用户拥有的内存权限2.3、启动elasticsearch是否成功开启2.4、浏览器查看节点信息2.5、安装 Elasticsearch-head 插件2.6、ELK Logstash 部署(在 Apache 节…...

分享一下我家网络机柜,家庭网络设备推荐

家里网络机柜搞了几天终于搞好了,非专业的,走线有点乱,勿喷。 从上到下的设备分别是: 无线路由器(当ap用):TL-XDR6088 插排:德木pdu机柜插排 硬盘录像机:TL-NVR6108-L8P 第二排左边…...

uboot移植之mx6ull_alientek_nand.h文件详解三

一. 简介 mx6ull_alientek_nand.h文件是 开发板的 uboot的一个配置文件。每个开发板都有一个 .h的配置文件。 mx6ull_alientek_nand.h 文件其实是 之前针对正点原子ALPHA开发板移植的 Uboot配置文件。 本文继上一篇文章的学习,地址如下:uboot移植之m…...

[Docker]一.Docker 简介与安装

一、Docker简介与为什么要用 Docker 1.1、Docker 介绍 Docker 是一个跨平台的开源的 应用容器引擎 ,诞生于 2013 年初,基于 Go语言 并遵从 Apache2.0 协议开源, Docker 可以把它理解成虚拟机,但是 Docker 和传统虚拟化方式 有所不同 …...

计算机网络-计算机网络体系结构-传输层

目录 一、UDP 二、TCP 特点 首部格式 连接管理 可靠传输 流量控制(点对点) 拥塞控制(全局) 三、拥塞控制算法 慢开始&拥塞避免 快重传&快恢复 功能一:提供进程与进程之间的逻辑通信 功能二:复用和分用 功能三:对收到的报…...

buuctf[HCTF 2018]WarmUp 1

题目环境&#xff1a; 发现除了表情包&#xff0c;再无其他F12试试发现source.php文件访问这个文件&#xff0c;格式如下&#xff1a;url/source.php回显如下&#xff1a;PHP代码审计&#xff1a; <?php highlight_file(__FILE__); class emmm {public static function ch…...

开源博客项目Blog .NET Core源码学习(4:生成验证码)

开源博客项目Blog中的后台管理登录界面中支持输入验证码&#xff08;如下图所示&#xff09;&#xff0c;本文学习并记录项目中验证码的生成及调用方式。   博客项目中调用VerifyCode类生成验证码&#xff0c;该类位于App.Framwork项目中&#xff0c;命名空间为App.Framwork…...

gin框架39--重构 BasicAuth 中间件

gin框架39--重构 BasicAuth 中间件 介绍gin BasicAuth 解析自定义newAuth实现基础认证注意事项说明 介绍 每当我们打开一个网址的时候&#xff0c;会自动弹出一个认证界面&#xff0c;要求我们输入用户名和密码&#xff0c;这种BasicAuth是最基础、最常见的认证方式&#xff0…...

编译pycaffe过程中遇到的问题及解决

pycaffe是python调用caffe的方式&#xff0c;编译它就是要得到一个so库_pycaffe.so。 如题&#xff0c;在caffe的源码目录下&#xff0c;执行make pycaffe&#xff0c;跳出来一个错误: $ make pycaffe CXX/LD -o python/caffe/_caffe.so python/caffe/_caffe.cpp /usr/bin/ld…...

自然语言处理---Transformer机制详解之Transformer优势

1 Transformer的并行计算 对于Transformer比传统序列模型RNN/LSTM具备优势的第一大原因就是强大的并行计算能力. 对于RNN来说&#xff0c;任意时刻t的输入是时刻t的输入x(t)和上一时刻的隐藏层输出h(t-1)&#xff0c;经过运算后得到当前时刻隐藏层的输出h(t)&#xff0c;这个…...

改进YOLO系列 | YOLOv5/v7 引入 Dynamic Snake Convolution | 动态蛇形卷积

准确分割拓扑管状结构,如血管和道路,在各个领域中至关重要,可以确保下游任务的准确性和效率。然而,许多因素使任务复杂化,包括细小的局部结构和可变的全局形态。在这项工作中,我们注意到管状结构的特殊性,并利用这一知识来引导我们的DSCNet,以在三个阶段同时增强感知:…...

postgresql14-表的管理(四)

表table 创建表 CREATE TABLE table_name --表名 (column_name data_type column_constraint, --字段名、字段类型、约束字段&#xff08;可选&#xff09;column_name data_type, --表级别约束字段...,table_constraint );CREATE TABLE emp1 --创建表 AS SELECT * FROM empl…...

Java--Object类

Java中Object类是所有类的父类&#xff0c;是Java中最高层的类。用户创建一个类时&#xff0c;除非指定继承了某个类&#xff0c;否则都是继承于Object类。 由于所有类都继承于Object类&#xff0c;所以所有类都可以重写Object类中的方法。但是Object类中被final修饰的getClass…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

三维GIS开发cesium智慧地铁教程(5)Cesium相机控制

一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点&#xff1a; 路径验证&#xff1a;确保相对路径.…...

visual studio 2022更改主题为深色

visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中&#xff0c;选择 环境 -> 常规 &#xff0c;将其中的颜色主题改成深色 点击确定&#xff0c;更改完成...

el-switch文字内置

el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

[Java恶补day16] 238.除自身以外数组的乘积

给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&#xff0c;且在 O(n) 时间复杂度…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

脑机新手指南(七):OpenBCI_GUI:从环境搭建到数据可视化(上)

一、OpenBCI_GUI 项目概述 &#xff08;一&#xff09;项目背景与目标 OpenBCI 是一个开源的脑电信号采集硬件平台&#xff0c;其配套的 OpenBCI_GUI 则是专为该硬件设计的图形化界面工具。对于研究人员、开发者和学生而言&#xff0c;首次接触 OpenBCI 设备时&#xff0c;往…...

AI语音助手的Python实现

引言 语音助手(如小爱同学、Siri)通过语音识别、自然语言处理(NLP)和语音合成技术,为用户提供直观、高效的交互体验。随着人工智能的普及,Python开发者可以利用开源库和AI模型,快速构建自定义语音助手。本文由浅入深,详细介绍如何使用Python开发AI语音助手,涵盖基础功…...