广告
返回顶部
首页 > 资讯 > 后端开发 > Python >哈希表的原理及实现代码
  • 901
分享到

哈希表的原理及实现代码

原理代码哈希表 2023-01-31 00:01:08 901人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

哈希表可以表述为,是一种可以根据关键字快速查询数据的数据结构 一. 哈希表有哪些优点? 不论哈希表中数据有多少,增加,删除,改写数据的复杂度平均都是O(1),效率非常高 二. 实现哈希表 1. 哈希表原理 如果说每一个数据它都对应着一个固

哈希表可以表述为,是一种可以根据关键字快速查询数据的数据结构

一. 哈希表有哪些优点?

不论哈希表中数据有多少,增加,删除,改写数据的复杂度平均都是O(1),效率非常高

二. 实现哈希表

1. 哈希表原理

如果说每一个数据它都对应着一个固定的位置,那我们查找特定一个数据时,就可以直接查看这个数据对应的位置是否存在数据。一个形象的例子就是学生在教室中的位置,开学的时候,老师会给学生每一个人分配一个位置,而且不允许学生随便乱坐位置,以后老师要查看今天李刚同学有没有上课,直接看李刚同学的位置是不是有人就可以判断,没必要点了全班同学的名才可以知道李刚同学来了没有。

2. 实现简单的哈希表

根据上面的原理,首先,我们要分配一片空间用来存储我们数据,比如是一个空的数组

然后,有数据存进来的时候,按照特定规则得出这个数据在数组中的位置,将数据存进这个位置

我们就以存进一个整型数据为例,特定规则就是取余

根据计算出来的值,将这些数据放入对应的位置,我们的数组变为

我们已经把数据插入到了哈希表中,现在,我们要查找一个数据,只要按照取余规则计算出这个数据在数组中对应的位置,然后查看数组的这个位置,就可以取出这个数据了,比如我们要从哈希表中取出52,根据取余规则,52的计算出来的位置是8,数组中8这个位置是空的,52不在哈希表中,找不到52的数据;从哈希表中取出77,77计算出来的位置是0,数组中0这个位置有值,而且值就是77,从哈希表中取出77的值。

至此,我们知道实现了一个很简单的哈希表的原理,其实还存在很多问题,这个我们接下来讨论,这儿先把我们前面的一些概念用专业的术语替换一下,前面我们所说的特定规则,我们称之为哈希函数,用特定股则计算出来的值称之为哈希值。

3. 还存在哪些问题?

  1. 有可能两个数据通过哈希函数计算出来的哈希值有可能相等,比如77,88计算出来的位置值都是0

  2. 如果哈希表满了,该怎么扩容

第一个问题就是如何解决这种冲突

有开放定址法,链定址法,我们说一下开放定址法,就是将这个冲突的数据再重新计算一个空的位置,将其存进去,比如我们要存放88,哈希值是0,数组这个位置已经有值了,那我们再获取一个哈希值,比如在原哈希值的基础上加1,得到1,1的位置是空,我将88放进去。有人会问,1这个位置被占了,那下一个数据是1这个位置怎么办,这时候,我们还是同样的做法,给这个数据再计算一个哈希值。

插入88后的数组变为

 

冲突解决了,但我们读取数据的时候,好像又出现问题了,88的哈希值是0,发现数组0位置不是空的,那我们确定88在哈希表中?肯定不行,0这个位置存储的是77,不是88。我们的解决方法是判断0这个位置的值是不是88,不是的话,再计算88的哈希值是1,判断是1这个位置是否为空,为空,则88不在哈希表中;不为空,判断值是否为88,若是88,确定在哈希表中;如果值不是88,我们则继续计算哈希值是2,依次下去,直到找到88或者值为空的位置。

第二个问题,哈希表扩容

一个简单的解决办法是,当插入数据时,发现所有的位置都满了,我们就再分配一个大于原先空间的一片空间,把原来空间中的值重新哈希到新的空间中。

4. 哈希表的python实现

python中的字典就是哈希表,下面代码实现了一个简单的字典

class Dict:
    def __init__(self, size=10):
        self.size = size
        self.key = [None] * self.size
        self.data = [None] * self.size

    def __setitem__(self, key, value):
        assert isinstance(key, int)
        index = self.hash(key)
        if not self.key[index]:
            self.key[index] = key
            self.data[index] = value
        elif self.key[index] == key:
            self.data[index] = value
        else:
            start = index
            while self.key[index] and self.key[index] != key:
                index = self.re_hash(index)
                if index == start:
                    raise Exception('dict is full')

            if self.key[index]:
                self.data[index] = value
            else:
                self.key[index] = key
                self.data[index] = value

    def __getitem__(self, item):
        assert isinstance(item, int)
        index = self.hash(item)
        if not self.key[index]:
            raise KeyError(item)
        else:
            if self.key[index] == item:
                return self.data[index]
            else:
                start = index
                while self.key[index] and self.key[index] != item:
                    index = self.re_hash(index)
                    if start == index:
                        raise KeyError(item)

                if self.key[index] == item:
                    return self.data[index]
                else:
                    raise KeyError(item)

    def __contains__(self, item):
        assert isinstance(item, int)
        index = self.hash(item)
        if not self.key[index]:
            return False
        else:
            if self.key[index] == item:
                return True
            else:
                start = index
                while self.key[index] and self.key[index] != item:
                    index = self.re_hash(index)
                    if start == index:
                        break

                if self.key[index] == item:
                    return True
                else:
                    return False

    def hash(self, key):
        index = key % self.size
        return int(index)

    def re_hash(self, index):
        return index+1


a = Dict()
a[1]='3'
a[2]='4'
print(a[5])

 

三. 总结

哈希表对于数据的插入,删除,更新操作复杂的平均是O(1),效率非常高,如果不关心数据的存储顺序,我们可以选取这种数据结构

 

--结束END--

本文标题: 哈希表的原理及实现代码

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 哈希表的原理及实现代码
    哈希表可以表述为,是一种可以根据关键字快速查询数据的数据结构 一. 哈希表有哪些优点? 不论哈希表中数据有多少,增加,删除,改写数据的复杂度平均都是O(1),效率非常高 二. 实现哈希表 1. 哈希表原理 如果说每一个数据它都对应着一个固...
    99+
    2023-01-31
    原理 代码 哈希表
  • java哈希表的原理是什么
    Java哈希表的原理是利用哈希函数将键(key)映射到存储位置,通过对键进行哈希运算得到一个索引,然后将值(value)存储在该索引...
    99+
    2023-08-24
    java
  • Java哈希表和有序表实例代码讲解
    目录哈希表(HashMap)按值传递按址传递内存大小比较有序表(TreeMap)哈希表(HashMap) hash查询的时间复杂度是O(1) 按值传递 Character,Short...
    99+
    2023-05-15
    Java哈希表和有序表 Java哈希表 Java有序表
  • JavaScript实现哈希表的方法
    本篇内容主要讲解“JavaScript实现哈希表的方法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“JavaScript实现哈希表的方法”吧!哈希表通常是基于数...
    99+
    2022-10-19
  • Java实现哈希表的基本功能
    目录一、哈希表头插法放入元素二、哈希表尾插法放入元素三、哈希表头插、尾插扩容四、找到key对应的value五、运行结果六、哈希表的泛型实现七、为什么JDK1.7及之前使用头插法而JD...
    99+
    2022-11-12
  • C++实现哈希散列表的示例
    散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这...
    99+
    2022-11-13
  • C++数据结构之哈希表的实现
    目录哈希表概念散列函数直接定址法除留余数法平方取中法哈希冲突线性探测二次探测链地址法哈希表的实现闭散列开散列哈希表概念 二叉搜索树具有对数时间的表现,但这样的表现建立在一个假设上:输...
    99+
    2023-03-11
    C++数据结构 哈希表 C++哈希表 C++数据结构
  • Java数据结构之实现哈希表的分离链接法
    哈希表的分离链接法 原理 Hash Table可以看作是一种特殊的数组。他的原理基本上跟数组相同,给他一个数据,经过自己设置的哈希函数变换得到一个位置,并在这个位置当中放置该数据。哦...
    99+
    2022-11-12
  • C++哈希表之闭散列方法的模拟实现详解
    目录哈希概念冲突闭散列线性探测哈希表闭散列的模拟实现模拟实现的闭散列中的问题与改进哈希 概念 可以不经过任何比较,直接从表中得到要搜索的元素。 关键在于通过某种函数,使元素的存储位置...
    99+
    2022-11-13
    C++哈希表实现闭散列 C++ 闭散列 C++哈希表
  • Java数据结构中实现哈希表的分离链接法
    这篇文章主要介绍“Java数据结构中实现哈希表的分离链接法”,在日常操作中,相信很多人在Java数据结构中实现哈希表的分离链接法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java数据结构中实现哈希表的分离...
    99+
    2023-06-20
  • android长截屏原理及实现代码
    小米系统自带的长截屏应该很多人都用过,效果不错。当长截屏时listview就会自动滚动,当按下停止截屏时,就会得到一张完整的截屏。该篇就介绍一下长截屏的原理上篇中介绍了android屏幕共享实现方式,该篇的原理和上一篇基本一致。获取view...
    99+
    2023-05-30
    android 长截屏 roi
  • Python伪代码分析点赞器实现原理及代码
    目录前言一、简介1.适用场景2.核心逻辑二、代码实现1.模拟登录2.点赞接口分析3.点赞器伪代码实现三、总结前言 许多社区类平台都具备点赞功能,应运而生的就是自动点赞器,今天用Pyt...
    99+
    2022-11-10
  • Android基站定位原理及实现代码
    代码如下: import java.io.BufferedReader; import java.io.InputStreamReader; import org.apach...
    99+
    2022-06-06
    定位 Android
  • MyBatisPlus代码生成器的原理及实现详解
    目录一、代码生成器原理分析二、代码生成器实现一、代码生成器原理分析 我们在观察之前写的代码的时候,会发现很多重复的内容。  一个Book模板,,只需要把红色部分的内容全部...
    99+
    2022-11-13
    MyBatisPlus代码生成器原理 MyBatisPlus代码生成器实现 MyBatisPlus 代码生成器
  • android IntentService实现原理及内部代码分享
        很多网友可能发现Android中除了Service还有一个IntentService,他们之间到底有哪些区别呢 在继承关系上而言Inten...
    99+
    2022-06-06
    intentservice Android
  • jQuery实现图片放大预览实现原理及代码
    对于一些比较小的图片,通过鼠标移动到图片上进行放大显示,原理很简单,就是将图片显示的尺寸变大后放在浏览器的一个指定位置,从而实现图片的放大预览。以下是代码: 复制代码 代码如下: &...
    99+
    2022-11-15
    jQuery 图片放大预览
  • python实现希尔密码加密的示例代码
    目录原理实现原理 希尔密码是运用基本矩阵论原理的替换密码,由Lester S. Hill在1929年发明。 每个字母当作26进制数字:A=0, B=1, C=2… 一串字母当成n维向量,跟一个n×n的矩阵相乘,再将得...
    99+
    2022-06-02
    python 希尔密码加密 python 希尔密码
  • Linux shell传递参数实现原理及代码实例
    Shell 传递参数 我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… 以下实例我们向脚本传递两...
    99+
    2022-06-03
    Linux shell 传递参数
  • Java拦截器Interceptor实现原理及代码示例
      1,拦截器的概念 java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执...
    99+
    2022-11-12
  • Android Handler 原理分析及实例代码
    Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler...
    99+
    2022-06-06
    handler Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作