高效查找的数据结构-HashTree(哈希树)

本文参考资源:

痴人说Hash - 哈希树 (HashTree)_Java_PinusLee阳光灿烂的生活-CSDN博客

查找——图文翔解HashTree(哈希树)Java菜鸟的自留地-mooyang-CSDN博客

该数据结构的设计者编写的文档:哈希树HashTree - 百度文库

概述

二叉排序树,平衡二叉树,红黑树等二叉排序树在数据量大的时候树高很深,我们不断向下找寻值时会比较很多次。二叉排序树自身是有顺序结构的,每个结点除最小结点和最大结点外都有前驱和后继,不论是排序还是搜索它的综合性能比较好,但是单独在搜索这一方面二叉排序树的性能就没有这次要讲的Hash树快了。

理论基础

Hash树的理论基础为质数分辨定理:

n个不同的质数可以“分辨”的连续整数的个数和他们的乘积相等。“分辨”就是指这些连续的整数不可能有完全相同的余数序列。

基于这个理论,假设我们取前十个素数,能分辨的整数有2*3*5*7*9*...*29 = 6 469 693 230个数,也就是说如果有21亿个数字的话,我们查找的哪怕是最底层的也仅仅需要计算10次就能找到对应的数字,而这已经超出int类型的范围。

而这个要分辩的整数,可以是数据库中的主键,可以是唯一标识某一对象的哈希码(不用哈希函数,保证不同对象的哈希码不冲突)。

哈希树的实现

哈希树的结构:每一层节点的最大子节点数都不一样,对应这一层代表的质数值:

高效查找的数据结构-HashTree(哈希树)

java代码:

private class Node{  //定义了一个内部类,每一个结点会有一个next数组  
    public Node[] next = null;    //用来装子节点的下标表示余数
    public Integer data = 0;        //数值
    public boolean isDel = false;   //是否被删除的标记,作删除用
    public Node(Integer data,Integer level){    //构造函数
        next = new Node[level];
        this.data = data;
    }
    public Node(Integer data){    //构造函数
        this.data = data;
    }
}

插入

求余看对应位置的结点,如果为空则在空处插入一个新节点,如果被逻辑删除了替换值再逻辑恢复,如果有值就继续往下找,继续求余判断。

高效查找的数据结构-HashTree(哈希树)

查找

查找和插入的逻辑一样,按除余的方法一直找到某个位置

删除

HashTree的删除节点并不要求真正删除节点,只需要逻辑性地删除节点,先按查找的方法获取对应节点,把节点的isDel标记为true,这样如果新加入节点需要放在这个位置也能直接替换它。

原创文章,作者:彭晨涛,如若转载,请注明出处:https://www.codetool.top/article/%e9%ab%98%e6%95%88%e6%9f%a5%e6%89%be%e7%9a%84%e6%95%b0%e6%8d%ae%e7%bb%93%e6%9e%84-hashtree%ef%bc%88%e5%93%88%e5%b8%8c%e6%a0%91%ef%bc%89/

(0)
彭晨涛彭晨涛管理者
上一篇 2020年2月16日
下一篇 2020年2月17日

相关推荐

  • 海量数据去重-由BitMap引出的布隆过滤器

    本文参考资源: 那些惊艳的算法们(一)——布隆过滤器_C/C++_xinzhongtianxia的博客-CSDN博客 详解布隆过滤器的原理、使用场景和注意事项 - 简书 概述 昨天…

    2020年2月28日
    01.3K0
  • 拉帮结派的数据结构-并查集

    本文参考资源: 超超有爱爱-----并查集~~~chen_zan_yu的博客-CSDN博客 概述 并查集通常用作集合的合并。 并查集是一种树形结构,又叫“不相交集合”,保持了一组不…

    2020年2月17日
    0140
  • leetcode705-设计哈希集合

    原题 不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中插入一个值。 contains(value) :返回哈希集合…

    算法 2019年12月18日
    0140
  • 带有优先级的完全二叉树-堆

    堆的概念 堆是一种完全二叉树(除了最后一层每个节点的子节点都是满的,最后一层的节点也是集中在左边) 虽然堆是一棵二叉树,但也由于它是一棵完全二叉树的原因,可以使用一个数组来表示堆。…

    算法 2020年2月9日
    0180
  • leetcode706-设计哈希映射

    原题 不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向哈希映射中插入(键,值)的数值对。如果键对应的值已经存在,更…

    算法 2019年12月18日
    0120
  • leetcode380-常数时间插入、删除和获取随机元素

    原题 设计一个支持在平均 时间复杂度 O(1) 下,执行以下操作的数据结构。 insert(val):当元素 val 不存在时,向集合中插入该项。 remove(val):元素 v…

    2019年12月28日
    0100
  • leetcode385-迷你语法分析器

    原题 给定一个用字符串表示的整数的嵌套列表,实现一个解析它的语法分析器。 列表中的每个元素只可能是整数或整数嵌套列表 提示: 你可以假定这些字符串都是格式良好的: 字符串非空 字符…

    算法 2020年1月28日
    02260
  • 跳表-披着链表外衣的伪搜索树

    本文参考资源: 【数据结构与算法】之跳表(Java实现)---第九篇Java震哥聊校招-CSDN博客 跳表的原理及实例 - Rogn - 博客园 跳表Java实现Java偏离的定弦…

    2020年3月28日
    0670
  • leetcode232-用栈实现队列

    原题 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – …

    算法 2019年12月13日
    0560
  • AVL树-自平衡的二叉搜索树

    本文图片来源:手把手教,手写AVL树 - 不止是编程 - 博客园 AVL树的概念 自平衡 当二叉搜索树处于平衡状态的时候,其操作时间复杂度为O(logN),但当二叉搜索树是单支树的…

    2019年11月25日
    0430

发表回复

登录后才能评论