返回顶部
首页 > 资讯 > 精选 >Hash表怎么实现
  • 846
分享到

Hash表怎么实现

2023-06-02 09:06:03 846人浏览 独家记忆
摘要

本篇内容介绍了“Hash表怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是Hash表Hash,一般翻译做“散列”,也有直接音译为

本篇内容介绍了“Hash表怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

什么是Hash表

Hash,一般翻译做“散列”,也有直接音译为“哈希”的,它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。

 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。比如我们存储70个元素,但我们可能为这70个元素申请了100个元素的空间。70/100=0.7,这个数字称为负载(加载)因子。我们之所以这样做,也 是为了“快速存取”的目的。我们基于一种结果尽可能随机平均分布的固定函数H为每个元素安排存储位置,以达到快速存取。但是由于此随机性,也必然导致一个问题就是冲突。所谓冲突,即两个元素通过散列函数H得到的地址相同,那么这两个元素称为“同义词”。这类似于70个人去一个有100个椅子的饭店吃饭。散列函数的计算结果是一个存储单位地址,每个存储单位称为“桶”。设一个散列表有m个桶,则散列函数的值域应为[0,m-1]。  

  这些元素是按照什么样的规则存储到数组中呢。一般情况是通过hash(key)%len获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中,12%16=12,28%16=12,108%16=12,140%16=12。所以12、28、108以及140都存储在数组下标为12的位置

2.hash表扩容的理解

可是当哈希表接近装满时,因为数组的扩容问题,性能较低(转移到更大的哈希表中).

Java默认的散列单元大小全部都是2的幂,初始值为16(2的4次幂)。假如16条链表中的75%链接有数据的时候,则认为加载因子达到默认的0.75。HahSet开始重新散列,也就是将原来的散列结构全部抛弃,重新开辟一个散列单元大小为32(2的5次幂)的散列结果,并重新计算各个数据的存储位置。以此类推下去.....

负载(加载)因子:0.75.-->hash表提供的空间是16 也就是说当到达12的时候就扩容

3.排重机制的实现

假如我们有一个数据(散列码76268),而此时的HashSet有128个散列单元,那么这个数据将有可能插入到数组的第108个链表中(76268%128=108)。但这只是有可能,如果在第108号链表中发现有一个老数据与新数据equals()=true的话,这个新数据将被视为已经加入,而不再重复丢入链表。

4.优点

哈希表的插入和查找是很优秀的.

对于查找:直接根据数据的散列码和散列表的数组大小计算除余后,就得到了所在数组的位置,然后再查找链表中是否有这个数据即可。因为数组本身查找速度快,所以查找的效率高低体现在链表中,但是真实情况下在一条链表中的数据又很少,有的甚至没有,所以几乎没有什么迭代的代价。所以散列表的查找效率建立在散列单元所指向的链表中数据的多少上.

对于插入:数组的插入速度慢,而链表的插入速度快.当我们使用哈希表时,不需要更改数组的结构,只需要在找到对应的数组下标后,进入对应的链表,操作链表即可.所以hash表的整体插入速度也很快.

5.模拟实现代码

node

```

public class Node {

// key、value模拟键值对的数据

    public Integer key;

    public String value;

    // 下一节点的引用

    public Node next;

    public Node() {

    }

    public Node(int key, String value) {

        this.key = key;

        this.value = value;

    }

}

```

MyLinkedList类

```

    public class MyLinkedList {

    // 根节点

    private Node root;

    public MyLinkedList() {

        root = new Node();

    }

    

    public void add(int key, String value) {

        Node newNode = new Node(key, value);

        Node current = root;

        while (current.next != null) {

            if(current.next.key == key) {

                current.next.value = value;

                return;

            }

            current = current.next;

        }

        current.next = newNode;

    }

    

    public boolean delete(int key) {

        Node current = root;

        while (current.next != null) {

            if(current.next.key == key) {

                current.next = current.next.next;

                return true;

            }

            current = current.next;

        }

        return false;

    }

    

    public String get(int key) {

        Node current = root;

        while (current.next != null) {

            if(current.next.key == key) {

                return current.next.value;

            }

            current = current.next;

        }

        return null;

    }

    

    public String list() {

        String str = "";

        Node current = root.next;

        while (current != null) {

            str += "(" + current.key + "," + current.value + "),";

            current = current.next;

        }

        return str;

    }

    @Override

    public String toString() {

        return list();

    }

}

```

MyHashMap

```

// 哈希表

public class MyHashMap {

    // 链表数组,数组的每一项都是一个链表

    private MyLinkedList[] arr;

    // 数组的大小

    private int maxSize;

    

    public MyHashMap() {

        maxSize = 10;

        arr = new MyLinkedList[maxSize];

    }

    

    public MyHashMap(int maxSize) {

        this.maxSize = maxSize;

        arr = new MyLinkedList[maxSize];

    }

    

    public void put(int key, String value) {

        int index = getHashIndex(key);

        if(arr[index] == null) {

            arr[index] = new MyLinkedList();

        }

        arr[index].add(key, value);

    }

    

    public boolean delete(int key) {

        int index = getHashIndex(key);

        if(arr[index] != null) {

            return arr[index].delete(key);

        }

        return false;

    }

    

    public String get(int key) {

        int index = getHashIndex(key);

        if(arr[index] != null) {

            return arr[index].get(key);

        }

        return null;

    }

    

    private int getHashIndex(Integer key) {

        return key.hashCode() % maxSize;

    }

    

    public String list() {

        String str = "[ ";

        for (int i = 0; i < maxSize; i++) {

            if(arr[i] != null) {

                str += arr[i].toString();

            }

        }

        str = str.substring(0, str.length()-1);

        str += " ]";

        return str;

    }

    @Override

    public String toString() {

        return list();

    }

}

```

测试

```

public class Test {

    public static void main(String[] args) {

        MyHashMap map = new MyHashMap(20);

        map.put(5, "aaa");

        map.put(8, "bbb");

        map.put(3, "ccc");

        map.put(8, "bbb");

        map.put(2, "DDD");

        map.put(9, "eee");

        System.out.println(map);

        System.out.println(map.get(3));

        System.out.println(map.delete(2));

        System.out.println(map);

    }

}

“Hash表怎么实现”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

--结束END--

本文标题: Hash表怎么实现

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

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

猜你喜欢
  • Hash表怎么实现
    本篇内容介绍了“Hash表怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么是Hash表Hash,一般翻译做“散列”,也有直接音译为...
    99+
    2023-06-02
  • 怎么使用C语言实现Hash表
    这篇“怎么使用C语言实现Hash表”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“怎么使用C语言实现Hash表”文章吧。什么是...
    99+
    2023-07-05
  • MYSQL INNODB中hash查找表的实现
    原创有误请指出: 版本:5.7.14 源码位置为hash0hash.h hash0hash.cc 作为一种时间复杂度最优为O(1)的数据结构,但是最坏时间复杂对位O(n)的一种数据结构,但是在 ...
    99+
    2024-04-02
  • redis中hash是怎么实现的
    在Redis中,Hash是通过字典(dict)来实现的。字典是一种内部实现为哈希表的数据结构,用于存储键值对。字典的实现原理如下:1...
    99+
    2023-09-05
    redis
  • Ngnix中怎么利用hash表实现请求快速反应
    本篇文章给大家分享的是有关Ngnix中怎么利用hash表实现请求快速反应,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。考虑到保存键及其值的Ng...
    99+
    2024-04-02
  • golang实现hash
    哈希(Hash)指的是将任意长度的二进制串映射为固定长度的二进制串的一种方法,该映射规则就是哈希算法,也称为散列算法。哈希算法经常被用来加密、检验数据完整性以及散列表查找等应用中。Go语言(golang)提供了标准库中的hash包,该包提供...
    99+
    2023-05-16
  • 如何在redis中实现hash表的内容
    本篇文章给大家分享的是有关如何在redis中实现hash表的内容,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。hash:Redis hash是...
    99+
    2024-04-02
  • golang如何实现hash
    本篇内容介绍了“golang如何实现hash”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!哈希(Hash)指的是将任意长度的二进制串映射为固...
    99+
    2023-07-06
  • Hash算法的Mysql分表怎么处理
    本篇内容主要讲解“Hash算法的Mysql分表怎么处理”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Hash算法的Mysql分表怎么处理”吧!  我们在分表里的...
    99+
    2024-04-02
  • redis的hash实现原理是什么
    Redis的Hash实现原理是使用哈希表(Hash Table)来存储数据。哈希表是一种数据结构,可以快速、高效地查找和存储键值对。...
    99+
    2024-04-03
    redis
  • redis中hash如何实现的
    这篇文章主要介绍redis中hash如何实现的,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!0.前言redis是KV型的内存数据库, 数据库存储的核心就是Hash表, 我们执行sel...
    99+
    2024-04-02
  • 基于Python实现Hash算法
    目录1 前言2 一般hash算法2.1 算法逻辑2.2 代码实现2.3 总结3 一致性hash算法3.1 算法逻辑3.2 代码实现3.3 总结1 前言 Simhash的算法简单的来说...
    99+
    2024-04-02
  • ava实现一致性Hash算法
    目录1. 实现原理2. 解决数据倾斜的问题什么是数据倾斜?解决3. 代码实现3.1 ConsistentHash3.2 Hash3.3 Utils3.4 main1. 实现原理 将k...
    99+
    2023-03-24
    Java哈希算法 Hash算法实现一致性
  • redis删除hash的实现方式
    目录Redis删除hash方式redis之hash类型解读redis中存取hash类型常用命令hash命令小结总结redis删除hash方式 在工作中遇到删除hash类型的缓存时遇到了,怎样也删不掉redis里面的缓存,...
    99+
    2023-01-28
    redis删除hash redis hash redis hash删除
  • php如何实现Redis的Hash操作
    小编给大家分享一下php如何实现Redis的Hash操作,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Hash操作//为hash...
    99+
    2024-04-02
  • 基于Python如何实现Hash算法
    本篇内容主要讲解“基于Python如何实现Hash算法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“基于Python如何实现Hash算法”吧!1 前言Simhash的算法简单的来说就是,从海量文...
    99+
    2023-06-29
  • AmazeUI列表怎么实现
    这篇文章主要介绍AmazeUI列表怎么实现,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!AmazeUI 列表<!doctype html><html class="no...
    99+
    2023-06-09
  • Java列表怎么实现
    这篇文章主要介绍“Java列表怎么实现”,在日常操作中,相信很多人在Java列表怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java列表怎么实现”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!El...
    99+
    2023-06-03
  • Golang列表怎么实现
    本文小编为大家详细介绍“Golang列表怎么实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“Golang列表怎么实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。列表是一种常见的数据结构,在Golang中也不...
    99+
    2023-07-05
  • php文件Hash怎么用
    这篇文章主要介绍php文件Hash怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、说明在很多下载站,都会提供下载文件的Hash 值进行校验对比,来确定下载的文件是否完整相同。这种就是文件 Hash的应用。即提...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作