返回顶部
首页 > 资讯 > 精选 >Java中哈希表的示例分析
  • 606
分享到

Java中哈希表的示例分析

2023-06-29 00:06:55 606人浏览 八月长安
摘要

这篇文章将为大家详细讲解有关Java中哈希表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1,概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过

这篇文章将为大家详细讲解有关Java中哈希表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

    1,概念

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

    理想的搜索方法:可以不经过任何比较,一次直接从表中得到要搜索的元素。 如果构造一种存储结构,通过某种函 数(hashFunc)使元素的存储位置与它的关键码之间能够建立一一映射的关系,那么在查找时通过该函数可以很快找到该元素。

    当向该结构中:

    插入元素

    根据待插入元素的关键码,以此函数计算出该元素的存储位置并按此位置进行存放

    搜索元素

    对元素的关键码进行同样的计算,把求得的函数值当做元素的存储位置,在结构中按此位置取元素比较,若关键码相等,则搜索成功

    例如:数据集合{1,7,6,4,5,9};

    哈希函数设置为:hash(key) = key % capacity; capacity为存储元素底层空间总的大小。

    Java中哈希表的示例分析

    2,冲突-避免

    首先,我们需要明确一点,由于我们哈希表底层数组的容量往往是小于实际要存储的关键字的数量的,这就导致一 个问题,冲突的发生是必然的,但我们能做的应该是尽量的降低冲突率。

    3,冲突-避免-哈希函数设计

    常见哈希函数

    直接定制法--(常用)

    取关键字的某个线性函数为散列地址:Hash(Key)= A*Key + B 优点:简单、均匀 缺点:需要事先知道关 键字的分布情况 使用场景:适合查找比较小且连续的情况

    除留余数法--(常用)

    设散列表中允许的地址数为m,取一个不大于m,但最接近或者等于m的质数p作为除数,按照哈希函数: Hash(key) = key% p(p<=m),将关键码转换成哈希地址

    平方取中法--(了解)

    假设关键字为1234,对它平方就是1522756,抽取中间的3位227作为哈希地址; 再比如关键字为4321,对 它平方就是18671041,抽取中间的3位671(或710)作为哈希地址 平方取中法比较适合:不知道关键字的分 布,而位数又不是很大的情况

    4,冲突-避免-负载因子调节

    Java中哈希表的示例分析

     负载因子和冲突率的关系粗略演示

    Java中哈希表的示例分析

    所以当冲突率达到一个无法忍受的程度时,我们需要通过降低负载因子来变相的降低冲突率。 、已知哈希表中已有的关键字个数是不可变的,那我们能调整的就只有哈希表中的数组的大小。

    5,冲突-解决-闭散列

    闭散列:也叫开放定址法,当发生哈希冲突时,如果哈希表未被装满,说明在哈希表中必然还有空位置,那么可以 把key存放到冲突位置中的“下一个” 空位置中去。

    ①线性探测

    比如上面的场景,现在需要插入元素44,先通过哈希函数计算哈希地址,下标为4,因此44理论上应该插在该 位置,但是该位置已经放了值为4的元素,即发生哈希冲突。 线性探测:从发生冲突的位置开始,依次向后探测,直到寻找到下一个空位置为止。

    插入

    通过哈希函数获取待插入元素在哈希表中的位置 如果该位置中没有元素则直接插入新元素,如果该位置中有元素发生哈希冲突,使用线性探测找到 下一个空位置,插入新元素

    Java中哈希表的示例分析

    采用闭散列处理哈希冲突时,不能随便物理删除哈希表中已有的元素,若直接删除元素会影响其他 元素的搜索。比如删除元素4,如果直接删除掉,44查找起来可能会受影响。因此线性探测采用标 记的伪删除法来删除一个元素。

    ②二次探测

    线性探测的缺陷是产生冲突的数据堆积在一块,这与其找下一个空位置有关系,因为找空位置的方式就是挨 着往后逐个去找,因此二次探测为了避免该问题,找下一个空位置的方法为: = ( + )% m, 或者: = ( - )% m。其中:i = 1,2,3…, 是通过散列函数Hash(x)对元素的关键码 key 进行计算得到的位置, m是表的大小。 对于2.1中如果要插入44,产生冲突,使用解决后的情况为:

    Java中哈希表的示例分析

    研究表明:当表的长度为质数且表装载因子a不超过0.5时,新的表项一定能够插入,而且任何一个位置都不 会被探查两次。因此只要表中有一半的空位置,就不会存在表满的问题。在搜索时可以不考虑表装满的情 况,但在插入时必须确保表的装载因子a不超过0.5,如果超出必须考虑增容。

    6,冲突-解决-开散列/哈希桶

    开散列法又叫链地址法(开链法),首先对关键码集合用散列函数计算散列地址,具有相同地址的关键码归于同一子 集合,每一个子集合称为一个桶,各个桶中的元素通过一个单链表链接起来,各链表的头结点存储在哈希表中。

    Java中哈希表的示例分析

    Java中哈希表的示例分析

          static class node {         public int key;         public int val;         public Node next;          public Node(int key, int val) {             this.key = key;             this.val = val;         }     }      private Node[] array;     public int usedSize;      public HashBucket() {         this.array = new Node[10];         this.usedSize = 0;     }

    Java中哈希表的示例分析

    Java中哈希表的示例分析

     public void put(int key,int val){        int index = key % this.array.length;        Node cur = array[index];        while (cur != null){            if(cur.val == key){                cur.val = val;                return;            }            cur = cur.next;        }        //头插法         Node node = new Node(key,val);        node.next = array[index];        array[index] = node;        this.usedSize++;        if(loadFactor() >= 0.75){            resize();        }    }
    public int get(int key) {         //以什么方式存储的  那就以什么方式取         int index = key % this.array.length;         Node cur = array[index];         while (cur != null) {             if(cur.key == key) {                 return cur.val;             }             cur = cur.next;         }         return -1;//     }

    Java中哈希表的示例分析

    Java中哈希表的示例分析

    Java中哈希表的示例分析

    public void resize(){         Node[] newArray = new Node[2*this.array.length];        for (int i = 0; i < this.array.length; i++){            Node cur = array[i];            Node curNext = null;            while (cur != null){                 curNext = cur.next;                int index = cur.key % newArray.length;                cur.next = newArray[i];                newArray[i] = cur;                cur = curNext.next;                cur = curNext;             }        }        this.array = newArray;    }

    7,完整代码

     class HashBucket {      static class Node {         public int key;         public int val;         public Node next;          public Node(int key, int val) {             this.key = key;             this.val = val;         }     }      private Node[] array;     public int usedSize;      public HashBucket() {         this.array = new Node[10];         this.usedSize = 0;     }      public void put(int key,int val) {         //1、确定下标         int index = key % this.array.length;         //2、遍历这个下标的链表         Node cur = array[index];         while (cur != null) {             //更新val             if(cur.key == key) {                 cur.val = val;                 return;             }             cur = cur.next;         }         //3、cur == null   当前数组下标的 链表  没要key         Node node = new Node(key,val);         node.next = array[index];         array[index] = node;         this.usedSize++;         //4、判断  当前 有没有超过负载因子         if(loadFactor() >= 0.75) {             //扩容             resize();         }     }      public int get(int key) {         //以什么方式存储的  那就以什么方式取         int index = key % this.array.length;         Node cur = array[index];         while (cur != null) {             if(cur.key == key) {                 return cur.val;             }             cur = cur.next;         }         return -1;//     }       public double loadFactor() {         return this.usedSize*1.0 / this.array.length;     }       public void resize(){         Node[] newArray = new Node[2*this.array.length];        for (int i = 0; i < this.array.length; i++){            Node cur = array[i];            Node curNext = null;            while (cur != null){                 curNext = cur.next;                int index = cur.key % newArray.length;                cur.next = newArray[i];                newArray[i] = cur;                cur = curNext.next;                cur = curNext;             }        }        this.array = newArray;    }  }

    关于“Java中哈希表的示例分析”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。

    --结束END--

    本文标题: Java中哈希表的示例分析

    本文链接: https://lsjlt.com/news/321626.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Java中哈希表的示例分析
      这篇文章将为大家详细讲解有关Java中哈希表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1,概念顺序结构以及平衡树中,元素关键码与其存储位置之间没有对应的关系,因此在查找一个元素时,必须要经过...
      99+
      2023-06-29
    • Java超详细分析讲解哈希表
      目录哈希表概念哈希函数的构造平均数取中法折叠法保留余数法哈希冲突问题以及解决方法开放地址法再哈希函数法公共溢出区法链式地址法哈希表的填充因子代码实现哈希函数添加数据删除数据判断哈希表...
      99+
      2024-04-02
    • C++实现哈希散列表的示例
      散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这...
      99+
      2024-04-02
    • Laravel中加密解密与哈希实例的分析
      这篇文章给大家分享的是有关Laravel中加密解密与哈希实例的分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、加密解密当你的应用程序中需要用到加密和解密的地方时可以使用Laravel自带的加密解密工具。La...
      99+
      2023-06-14
    • 怎么在Java中实现哈希表
      本篇文章为大家展示了怎么在Java中实现哈希表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、哈希表头插法放入元素public class HashBuck {&nb...
      99+
      2023-06-15
    • Java哈希表和有序表实例代码讲解
      目录哈希表(HashMap)按值传递按址传递内存大小比较有序表(TreeMap)哈希表(HashMap) hash查询的时间复杂度是O(1) 按值传递 Character,Short...
      99+
      2023-05-15
      Java哈希表和有序表 Java哈希表 Java有序表
    • java哈希表的原理是什么
      Java哈希表的原理是利用哈希函数将键(key)映射到存储位置,通过对键进行哈希运算得到一个索引,然后将值(value)存储在该索引...
      99+
      2023-08-24
      java
    • Java中链表的示例分析
      这篇文章将为大家详细讲解有关Java中链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。题目一 解法class Solution {  &nbs...
      99+
      2023-06-29
    • Java数据结构中实现哈希表的分离链接法
      这篇文章主要介绍“Java数据结构中实现哈希表的分离链接法”,在日常操作中,相信很多人在Java数据结构中实现哈希表的分离链接法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构中实现哈希表的分离...
      99+
      2023-06-20
    • C++中的数组、链表与哈希表
      目录数组和链表数组链表什么是链表?链表的操作双向链表(list)list的成员函数哈希表什么是哈希表?哈希碰撞哈希表应用场景构建哈希表哈希表基本使用Leetcode对应题目前缀和差分...
      99+
      2024-04-02
    • Java实现哈希表的基本功能
      目录一、哈希表头插法放入元素二、哈希表尾插法放入元素三、哈希表头插、尾插扩容四、找到key对应的value五、运行结果六、哈希表的泛型实现七、为什么JDK1.7及之前使用头插法而JD...
      99+
      2024-04-02
    • php中哈希表指的是什么
      这篇文章给大家分享的是有关php中哈希表指的是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。php有什么特点1、执行速度快。2、具有很好的开放性和可扩展性。3、PHP支持多种主流与非主流的数据库。4、面向对象...
      99+
      2023-06-14
    • Java顺序表的示例分析
      这篇文章主要介绍Java顺序表的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一 、前言顺序表常用的一种,学习并了解显得十分重要,顺序表为以后的学习打下了基石。二、顺序的定义顺序表示在计算机内存中以数组的形式...
      99+
      2023-06-25
    • Java数据结构之实现哈希表的分离链接法
      哈希表的分离链接法 原理 Hash Table可以看作是一种特殊的数组。他的原理基本上跟数组相同,给他一个数据,经过自己设置的哈希函数变换得到一个位置,并在这个位置当中放置该数据。哦...
      99+
      2024-04-02
    • 分析Redis中的字典、哈希算法和ReHash原理
      本篇内容介绍了“分析Redis中的字典、哈希算法和ReHash原理”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有...
      99+
      2024-04-02
    • 讲解Java 哈希表(google 公司的上机题)
      这篇文章主要介绍“讲解Java 哈希表(google 公司的上机题)”,在日常操作中,相信很多人在讲解Java 哈希表(google 公司的上机题)问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”讲解Java ...
      99+
      2023-06-07
    • Java真题实练掌握哈希表的使用
      目录1.多数元素题目描述思路详解代码与结果2.数组中的k-diff数对题目描述思路详解代码与结果3.缺失的第一个正数题目描述思路详解代码与结果1.多数元素 题目描述 思路详解 这个...
      99+
      2024-04-02
    • Java中正则表达式的示例分析
      这篇文章主要介绍了Java中正则表达式的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前几天线上一个项目监控信息突然报告异常,上到机器上后查看相关资源的使用情况,发现...
      99+
      2023-06-15
    • 一文详解Python中哈希表的使用
      目录1. 前言2. 哈希表2.1 哈希函数2.2 哈希算法2.3 常见哈希算法2.4 哈希冲突3.总结1. 前言 哈希表或称为散列表,是一种常见的、使用频率非常高的数据存储方案。 哈...
      99+
      2024-04-02
    • Java复杂链表的示例分析
      这篇文章将为大家详细讲解有关Java复杂链表的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1.题目请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 ...
      99+
      2023-06-28
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作