返回顶部
首页 > 资讯 > 精选 >Java哈希表问题怎么解决
  • 181
分享到

Java哈希表问题怎么解决

2023-06-30 18:06:47 181人浏览 薄情痞子
摘要

这篇“Java哈希表问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java哈希表问题怎么解决”文章吧。哈希表概念

这篇“Java哈希表问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java哈希表问题怎么解决”文章吧。

哈希表概念

  • 散列表,又称为哈希表(Hash table),采用散列技术将记录存储在一块连续的存储空间中。

  • 在散列表中,我们通过某个函数f,使得存储位置 = f(关键字),这样我们可以不需要比较关键字就可获得需要的记录的存储位置。

  • 散列技术的记录之间不存在什么逻辑关系,它只与关键字有关联。因此,散列主要是面向查找的存储结构。

哈希函数的构造

构造原则:

  • 计算简单

散列函数的计算时间不应该超过其他查找技术与关键字比较的时间。

  • 散列地址分布均匀

解决冲突最好的办法就是尽量让散列地址均匀地分布在存储空间中。

  • 保证存储空间的有效利用,并减少为处理冲突而耗费的时间。

构造方法:

平均数取中法

假设关键字是1234,那么它的平方就是1522756.在抽取中间的3位就是227,用作散列地址。再比如关键字4321,那么它的平方就是18671041,抽中间三位数就是671或710。平方去中法比较适合不知道关键字的分布,而位数又不是很多的情况。

折叠法

折叠法是将关键字从左到右分割成位数相等的几部分(注意最后一部分位数不够时可以短一些),然后将这几部分叠加求和,并按散列表表长,取几位作为散列表地址。

比如我们的关键字是9 8 7 6 5 4 3 2 1 0,散列表表长为3位,我们将它分为四组,987|654|321|0,然后将他们叠加求和987+654+321+0=1962,再求后3位得到散列地址为962。

有时可能这还不能够保证分布均匀,不妨从一端向另一端来回折叠后对齐相加。比如我们将987和321反转,再与654和0相加,变成789+654+123+0=1566,此时散列地址为566。

折叠法事先不需要知道关键字的分布,适合关键字位数较多的情况。

保留余数法

此方法为最常用的构造哈希函数的方法。

公式为:

f(key) = key mod p (p <= m)

代码如下:

public int hashFunc(int key){        return key % length;    }

哈希冲突问题以及解决方法

哈希冲突就是,两个不同的关键字,但是通过散列函数得出来的地址是一样的。

key1 &ne; key2,但是f(key1)= f(key2)

同义词

此时的key1 和key2就被称为这个散列函数的同义词

那可不行啊,一件单人间怎么可以住两个人呢?

别担心,这个问题自然已经被神通广大的大佬们解决了。

开放地址法

开发定址法就是一旦发生了冲突,就去寻找下一个空的散列地址,只需要散列表足够大,空的散列地址总能找到,并将记录存入

例子:
19 01 23 14 55 68 11 86 37
要存储在表长11的数组中,其中H(key)=key MOD 11

再哈希函数法

对于我们的哈希表来说,我们事先需要准备多个哈希函数。每当发生散列地址冲突时,就换一个哈希函数,总有一个哈希函数能够使关键字不聚集。

公共溢出区法

在原先基础表的基础上再添加一个溢出表

当发生冲突时,就将该数据放到溢出表中

在查找时,对给定值通过散列函数计算出散列地址后,先与基本表的相应位置进行对比,如果相等就查找成功,如果不相等,则到溢出表进行顺序查找。

Java哈希表问题怎么解决

链式地址法

就时用链表将发生冲突的数据链起来,在查找时,只需要遍历链表即可,此方法也是最常用的方法。

如图:

Java哈希表问题怎么解决

哈希表的填充因子

填充因子就是 :填入表中的键值对个数 / 哈希表长度

填充因子标志着哈希表的装满程度,散列表的平均查找长度取决于填充因子,而不是取决于查找集合的键值对个数。Java中的HashMap默认初始容量为16,默认加载因子为0.75(当底层数组容量占用75%时,数组开始扩容,扩容后容量是原容量的二倍),此时虽然浪费了一定空间,但是换来的是查找效率的大大提升。

代码实现

下面用链式地址法来实现哈希表。

public class HashTableDemo {    //哈希表每个位置链表的节点    class node{    //关键字        int key;        String value;        Node next;        //无参构造        Node(){}        //有参构造        Node(int key, String value){            this.key = key;            this.value = value;            next = null;        }        //重写哈希表的equals()方法        public boolean equals(Node node){            if(this == node) return true;            else{                if(node == null) return false;                else{                    return this.value == node.value && this.key == node.key;                }            }        }    }    //哈希表的长度    int length;    //哈希表存的键值对个数    int size;    //存储数据容器    Node table[];    //不指定初始化长度的无参构造    public HashTableDemo(){        length = 16;        size = 0;        table = new Node[length];        //为哈希表每一个位置初始化        for (int i = 0; i < length; i++) {            table[i] = new Node(i,null);        }    }    //指定初始化长度的有参构造    public HashTableDemo(int length){            this.length = length;            size = 0;            table = new Node[length];            for (int i = 0; i < length; i++) {                table[i] = new Node(i,null);            }        }}

哈希函数

public int hashFunc(int key){        return key % length;    }

添加数据

思路:

  • 先通过哈希函数算出该键值对在table中的位置。

  • 遍历该处的链表的每一个节点,若发现某节点的key与传入的key相等,那么就更新此处的value。

  • 若未发现相等的key,那么在链表末尾添加新的节点.

  • 最后返回value。

代码如下:

   public String put(int key, String value){        int index = hashFunc(key);            //保证cur2始终是cur的前一个节点。            Node cur = table[index].next;            Node cur2 = table[index];            while(cur != null){                if(cur.key == key){                    cur.value = value;                    return value;                }                cur = cur.next;                cur2 = cur2.next;            }            cur2.next = new Node(key, value);            size++;        return value;    }

删除数据

思路:

  • 先通过哈希函数算出该键值对在table中的位置。

  • 遍历该处的链表的每一个节点,若发现某节点的key与传入的key相等,那么就删除此节点,并返回它的value。

  • 若未发现相等的key,返回null。

代码如下:

 public String remove(int key){        int index = hashFunc(key);        Node cur = table[index];        while(cur.next != null){            if(cur.next.key == key){                size--;                String value = cur.next.value;                cur.next = cur.next.next;                return value;            }            cur = cur.next;        }        return null;    }

判断哈希表是否为空

思路:判断哈希表每个位置处的链表是否为空。

public boolean isEmpty(){        for(int i = 0; i < length; i++){            if(table[i].next != null)                return false;        }        return true;    }

遍历哈希表

 public void print(){        for(int i = 0; i < length; i++){            Node cur = table[i];            System.out.printf("第%d条链表: ",i);            if(cur.next == null){                System.out.println("null");                continue;            }            cur = cur.next;            while(cur != null){                System.out.print(cur.key + "---"+ cur.value + "  ");                cur = cur.next;            }            System.out.println();        }    }

获得哈希表已存键值对个数

//返回哈希表已存数据个数    public int size(){        return size;    }

以上就是关于“Java哈希表问题怎么解决”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网精选频道。

--结束END--

本文标题: Java哈希表问题怎么解决

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

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

猜你喜欢
  • Java哈希表问题怎么解决
    这篇“Java哈希表问题怎么解决”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java哈希表问题怎么解决”文章吧。哈希表概念...
    99+
    2023-06-30
  • 怎么用Java哈希桶方式解决哈希冲突
    这篇文章主要介绍了怎么用Java哈希桶方式解决哈希冲突的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么用Java哈希桶方式解决哈希冲突文章都会有所收获,下面我们一起来看看吧。一. 实现形式一(键值对只能为整数...
    99+
    2023-06-29
  • Java中HashMap怎么解决哈希冲突
    这篇文章主要介绍“Java中HashMap怎么解决哈希冲突”,在日常操作中,相信很多人在Java中HashMap怎么解决哈希冲突问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java中HashMap怎么解决哈...
    99+
    2023-06-30
  • Java数据结构哈希算法之哈希桶方式解决哈希冲突
    一. 实现形式一(键值对只能为整数) 我们可以先实现一个比较简单的哈希表,使用java中解决哈希冲突的方法,即哈希桶(开散列)方式实现,其中注意: 可以使用内部类方式定义节...
    99+
    2024-04-02
  • 怎么在Java中实现哈希表
    本篇文章为大家展示了怎么在Java中实现哈希表,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。一、哈希表头插法放入元素public class HashBuck {&nb...
    99+
    2023-06-15
  • 讲解Java 哈希表(google 公司的上机题)
    这篇文章主要介绍“讲解Java 哈希表(google 公司的上机题)”,在日常操作中,相信很多人在讲解Java 哈希表(google 公司的上机题)问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”讲解Java ...
    99+
    2023-06-07
  • Java哈希表和有序表怎么实现
    本文小编为大家详细介绍“Java哈希表和有序表怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java哈希表和有序表怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。哈希表(HashMap)hash查...
    99+
    2023-07-06
  • java哈希冲突如何解决
    在Java中,哈希冲突可以通过以下几种方式来解决:1. 链地址法(链表法):当发生哈希冲突时,将冲突的元素存储在一个链表中。在查找元...
    99+
    2023-08-25
    java
  • php哈希冲突怎么解决
    这篇文章主要介绍了php哈希冲突怎么解决,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。php有什么用php是一个嵌套的缩写名称,是英文超级文本预处理语言,它的语法混合了C、J...
    99+
    2023-06-14
  • java中怎么使用hashmap解决哈希冲突
    哈希冲突在HashMap中是通过链表解决的,即使用链表来存储冲突的元素。以下是使用HashMap解决哈希冲突的步骤:1. 创建一个H...
    99+
    2023-09-14
    java
  • java哈希表的原理是什么
    Java哈希表的原理是利用哈希函数将键(key)映射到存储位置,通过对键进行哈希运算得到一个索引,然后将值(value)存储在该索引...
    99+
    2023-08-24
    java
  • Java超详细分析讲解哈希表
    目录哈希表概念哈希函数的构造平均数取中法折叠法保留余数法哈希冲突问题以及解决方法开放地址法再哈希函数法公共溢出区法链式地址法哈希表的填充因子代码实现哈希函数添加数据删除数据判断哈希表...
    99+
    2024-04-02
  • Java真题实练掌握哈希表的使用
    目录1.多数元素题目描述思路详解代码与结果2.数组中的k-diff数对题目描述思路详解代码与结果3.缺失的第一个正数题目描述思路详解代码与结果1.多数元素 题目描述 思路详解 这个...
    99+
    2024-04-02
  • 【数据结构】 | java中 哈希表及其冲突解决
    🎗️ 博客新人,希望大家一起加油进步 🎗️ 乾坤未定,你我皆黑马 目录 1、哈希表概念2、冲突 - 概念3、冲突 - 避免 -哈希函数设计4、冲突 - 避免 -负载因子调节5、冲突 - 解决5....
    99+
    2023-08-24
    数据结构 java 散列表 哈希表 哈希
  • PHP 哈希表的原理、实现与常见问题
    哈希表通过哈希函数将键映射到数组下标,实现快速查找、插入和删除。php 使用数组和 md5() 哈希函数实现哈希表,通过线性探查解决冲突。常见问题包括哈希冲突(可通过增加数组大小或优化哈...
    99+
    2024-05-07
    php 哈希表
  • Java中HashMap如何解决哈希冲突
    目录1. Hash算法和Hash表2. Hash冲突3. 解决Hash冲突的方法有四种4.HashMap在JDK1.8版本的优化1. Hash算法和Hash表 了解Hash冲突首先了...
    99+
    2024-04-02
  • 服务器哈希冲突怎么解决
    本篇内容主要讲解“服务器哈希冲突怎么解决”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“服务器哈希冲突怎么解决”吧!一、哈希表概述哈希表的哈希函数输入一个键,并向返回一个哈希表的索引。可能的键的集...
    99+
    2023-06-03
  • Java哈希表和有序表实例代码讲解
    目录哈希表(HashMap)按值传递按址传递内存大小比较有序表(TreeMap)哈希表(HashMap) hash查询的时间复杂度是O(1) 按值传递 Character,Short...
    99+
    2023-05-15
    Java哈希表和有序表 Java哈希表 Java有序表
  • Java哈希法代码怎么写
    这篇文章主要介绍了Java哈希法代码怎么写的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java哈希法代码怎么写文章都会有所收获,下面我们一起来看看吧。1、哈希函数的引入大家都用过字典,字典的优点是我们可以通过...
    99+
    2023-06-28
  • Go语言中如何处理并发哈希表访问问题?
    Go语言中如何处理并发哈希表访问问题?在Go语言中,使用哈希表可以高效地存储和检索数据。然而,在多个并发的goroutine中同时访问和修改哈希表容易导致竞态条件和数据不一致的问题。解决这些问题需要使用适当的并发控制机制,如互斥锁和读写锁。...
    99+
    2023-10-22
    并发 哈希表 处理
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作