摘自:http://blog.csdn.net/yang_yulei/article/details/46337405

哈希树的理论基础

质数分辨定理
简单地说就是:n个不同的质数可以“分辨”的连续整数的个数和他们的乘积相等。“分辨”就是指这些连续的整数不可能有完全相同的余数序列。
(这个定理的证明详见:http://wenku.baidu.com/view/16b2c7abd1f34693daef3e58.html)

例如:
从2起的连续质数,连续10个质数就可以分辨大约M(10) =2*3*5*7*11*13*17*19*23*29= 6464693230 个数,已经超过计算机中常用整数(32bit)的表达范围。连续100个质数就可以分辨大约M(100) = 4.711930 乘以10的219次方。
而按照目前的CPU水平,100次取余的整数除法操作几乎不算什么难事。在实际应用中,整体的操作速度往往取决于节点将关键字装载内存的次数和时间。一般 来说,装载的时间是由关键字的大小和硬件来决定的;在相同类型关键字和相同硬件条件下,实际的整体操作时间就主要取决于装载的次数。他们之间是一个成正比 的关系。

插入

我们选择质数分辨算法来建立一棵哈希树。
选择从2开始的连续质数来建立一个十层的哈希树。第一层结点为根结点,根结点下有2个结点;第二层的每个结点下有3个结点;依此类推,即每层结点的子节点数目为连续的质数。到第十层,每个结点下有29个结点。
同一结点中的子结点,从左到右代表不同的余数结果。
例如:第二层结点下有三个子节点。那么从左到右分别代表:除3余0,除3余1,除3余2.
对质数进行取余操作得到的余数决定了处理的路径。

结点结构:结点的关键字(在整个树中是唯一的),结点的数据对象,结点是否被占据的标志位(标志位为真时,关键字才被认为是有效的),和结点的子结点数组。
哈希树的节点结构

[cpp] view plaincopy
  1. struct Node
  2. {
  3. keyType      key ;
  4. ValueType    value ;
  5. bool         occupied ;    //用occupied来表示节点是否被占据。如果节点的关键字(key)有效,那么occupied应该设置位true,否则设置为false。
  6. struct Node* subNodes[1] ; //我们用subNodes[i]来表示节点的第i个子节点的地址。(此技术在跳跃表中有介绍,可翻看前面博客)
  7. } ;

(如果在建立当初就建立所有的节点,那么所消耗的计算时间和磁盘空间是巨大的。在实际使用当中,只需要初始化根节点就可以开始工作。子节点的建立是在有更多的数据进入到哈希树中的时候建立的。因此可以说哈希树和其他树一样是一个动态结构。)

下面我们以随机的10个数的插入为例,来图解HashTree的插入过程,这个史上最清晰的图解,你一定能看的明白^_^

有读者可能有疑问,如果一直冲突下去怎么办?首先,若关键字是整型,我们的10层哈希树完全可以分辨出来它们,这是质数分辨算法决定的。

(我们其实也可以把所有的键-值节点放在哈希树的第10层叶节点处,这第10层的满节点数就包含了所有的整数个数,但是如果这样处理的话,所有的非叶子节点作为键-值节点的索引,这样使树结构庞大,浪费空间)

【这里没有说的太清楚,此图是以2开始的连续质数创建的,即:从上到下的层级中的每个节点中的子树个数为2、3、5、7、11、13、17、19、23、29。第一层中的每个节点的子树个数为2,第二层中的每个节点子树个数为5.。。。。

上图中的子树上的数字,是其父节点的子树指针数组的索引值】

查找

哈希树的节点查找过程和节点插入过程类似,就是对关键字用质数序列取余,根据余数确定下一节点的分叉路径,直到找到目标节点。
如上图,最小”哈希树(HashTree)在从4G个对象中找出所匹配的对象,比较次数不超过10次。也就是说:最多属于O(10)。在实际应用中,调整 了质数的范围,使得比较次数一般不超过5次。也就是说:最多属于O(5)。因此可以根据自身需要在时间和空间上寻求一个平衡点。

删除

哈希树的节点删除过程也很简单,哈希树在删除的时候,并不做任何结构调整。
只是先查到到要删除的节点,然后把此节点的“占位标记”置为false即可(即表示此节点为空节点,但并不进行物理删除)。

优点

1、结构简单

2、查找迅速

3、结构不变

从删除算法中可以看出,哈希树在删除的时候,并不做任何结构调整

缺点

非排序性

哈希树可以广泛应用于那些需要对大容量数据进行快速匹配操作的地方。例如:数据库索引系统、短信息中的收条匹配、大量号码路由匹配、信息过滤匹配。哈希树不需要额外的平衡和防止退化的操作,效率十分理想。

转载于:https://www.cnblogs.com/bonelee/p/6249605.html

HashTree(哈希树) ——和trie类似,只是将字符换成了质数,sphinx用到了???...相关推荐

  1. 012-数据结构-树形结构-哈希树[hashtree]、字典树[trietree]、后缀树

    一.哈希树概述 1.1..其他树背景 二叉排序树,平衡二叉树,红黑树等二叉排序树.在大数据量时树高很深,我们不断向下找寻值时会比较很多次.二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都 ...

  2. 哈希树HashTree(trie树)

    引 在各种数据结构(线性表.树等)中,记录在结构中的相对位置是随机的.因此在机构中查找记录的时需要进行一系列和关键字的比较.这一类的查找方法建立在"比较"的基础上.查找的效率依赖于 ...

  3. 图文详解HashTree(哈希树)

    引 在各种数据结构(线性表.树等)中,记录在结构中的相对位置是随机的.因此在机构中查找记录的时需要进行一系列和关键字的比较.这一类的查找方法建立在"比较"的基础上.查找的效率依赖于 ...

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

    引 在各种数据结构(线性表.树等)中,记录在结构中的相对位置是随机的.因此在机构中查找记录的时需要进行一系列和关键字的比较.这一类的查找方法建立在"比较"的基础上.查找的效率依赖于 ...

  5. 哈希树(HashTree)

    作者 罗堃 (此文为原创,若需要引用请注明出处) 从2000年开始,作者开始研究基于TCP/IP的短信息传输技术.这种技术目前在国际上的标准被成为SMPP(Short Message Peer to ...

  6. 哈希树 (HashTree)

    在讲hash树之前首先我们来理解一下质数分辨定理.     什么是质数分辨定理?         什么是质数 : 即只能被 1 和 本身 整除的数. 为什么用质数:因为N个不同的质数可以 " ...

  7. 实现字典树(前缀树、Trie树)并详解其应用

    今天看到一个比较好的数据结构,字典树,做一下记录,以供自己后期复习和读者朋友的参考. 1.定义 字典树又称单词查找树.前缀树.Trie树等,是一种树形结构,是一种哈希树的变种.典型应用是用于统计,排序 ...

  8. 字典树(Trie/前缀树)

    目录 字典树的概念 字典树的逻辑 字典树的实现 易混点剖析 代码示例 字典树的概念 字典树(Trie)是一种空间换时间的数据结构,是一棵关于"字典"的树.主要用于统计.排序和保存大 ...

  9. 哈希树总结-java版

    目录 哈希树的理论基础 质数分辨定律 余数分辨定理 哈希树简介 查找 删除 优点 缺点 哈希树的java实现 节点 哈希树 哈希树的应用 哈希树的理论基础 质数分辨定律 这个定理可以简单的表述为:n个 ...

最新文章

  1. C语言常用排序方法大全
  2. 《Shell脚本学习指南》第四章 文本处理工具
  3. java中除金额_《java中把金额以3位分开的计数法》
  4. BZOJ 1624 Usaco Clear And Present Danger
  5. 【CodeForces - 520B】Two Buttons (bfs或dp或时光倒流,trick)
  6. iOS开发 UILabel实现自适应高宽
  7. 【Spring】Spring 报错 AbstractMethodError hikari MicrometerMetricsTrackerFactory create
  8. 实验5.4 编程实现两字符串的连接(使用string类定义字符串对象)
  9. 开源机器学习工具SQLFlow
  10. 销售记账管理系统php源码,crm客户销售管理系统销售统计ERP系统源php源码源码办公审批管理...
  11. 【毕业设计】基于SSM图书信息管理系统
  12. python100份教材/教程分享学习,初中高级总有适合你的
  13. Idea修改主题,字体等常规操作
  14. 【JAVASCRIPT】-【AES加密解密】01、前端AES加密解密的方式
  15. 生还者+感染者+物品的轮廓颜色修改方法
  16. 模具怎么报价?快速报价的计算方法
  17. 2022年Github学生包白嫖!
  18. Android: 主动抛出异常调试
  19. C语言学习笔记——堆区空间申请(一)
  20. iRelax for Mac(定时休息提醒工具)

热门文章

  1. Linux 执行文件 path,linux可执行文件添加到PATH环境变量的方法
  2. 将数组存入mysql数据库,将数组值写入mysql数据库
  3. php 多长时间前,php 多长时间之前 的函数
  4. java sessionid放入cookie_sessionID和cookie
  5. 三菱fb功能块手册中文_技成周报33期 | 三菱、西门子全系列这34个问题值得一看!...
  6. python开发框架 代码生成_我的第一个python web开发框架(28)——定制ORM(四)...
  7. 【深度学习】基于注意力机制的Transformer处理医疗影像
  8. 【Network Security!】DOS基本命令与批处理(看不懂来打我)
  9. python实训报告pygame_20181218 实验四《Python程序设计》实验报告
  10. 剑指offerpython_剑指offer系列python实现 日更(一)