Python之哈希表

Python之哈希表哈希表一、定义二、冲突三、Python中的应用3.1字典一、定义散列表(Hashtable,也叫哈希表),是根据关键码值(Key和value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键…

大家好,欢迎来到IT知识分享网。Python之哈希表"

一、定义

  • 散列表(Hash table,也叫哈希表),是根据关键码值(Key和value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。

  • 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

  • 个人理解:与列表不同的是,哈希表的索引是Key,直接通过Key值访问value,而不同于列表,通过整数 [ 0 , ∞ ) [0,\infty) [0,)作为索引存储值。

二、冲突

对不同的关键字可能得到同一散列地址,即k1≠k2,而f(k1)=f(k2),这种现象称为冲突(英语:Collision)。具有相同函数值的关键字对该散列函数来说称做同义词。综上所述,根据散列函数f(k)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为散列表,这一映射过程称为散列造表或散列,所得的存储位置称散列地址。

三、Python中的应用

3.1 字典

Python中的字典便应用了哈希表的原理,能使关键字和值一一对应。

  • 字典的初始化:
a = dict()
b = {}
c = {'a': 1, 'b': 2, 'b': '3'}  # 冒号左边是key,右边是value,由于存在重复的b,最后剩下右边的'b':3
  • 访问字典中的value
print "c['a']: ", c['a']
  • 修改字典
c['a'] = 0 # 将原来映射的1变为0
c['c'] = 4 # 添加新的键值对
  • 删除字典元素
del c['a'] #删除key为a的键值对
c.clear #清除字典c中所有的键值对
del c #直接删除字典c
  • 字典内置函数和方法
函数或方法 作用
cmp(dict1, dict2) 比较两个字典元素
len(dict) 字典长度
str(dict) 输出字典可打印的字符串表示
type(variable) 输出变量的类型
dict.clear() 删除字典内所有元素
dict.copy() 返回字典的一个复制
dict.fromkeys(seq[, val]) 创建一个新字典,以序列 seq 中元素做字典的键,val 为字典所有键对应的初始值
dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值
dict.has_key(key) 如果键在字典dict里返回true,否则返回false
dict.items() 以列表返回可遍历的(键, 值) 元组数组
dict.keys() 以列表返回一个字典所有的键
dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
dict.update(dict2) 把字典dict2的键/值对更新到dict里
dict.values() 以列表返回字典中的所有值
pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。 否则,返回default值。
popitem() 随机返回并删除字典中的一对键和值。

leetcode中的应用

  1. 两数之和(twosum)
class Solution(object):
    def twoSum(self, nums, target):
        """
        :type nums: List[int]
        :type target: int
        :rtype: List[int]
        """
        map_a = dict()
        k = len(nums)
        for i in range(0, k):   #一边将列表中的数添加到字典中,一边判断两数之差是否存在于字典中
            temp = target - nums[i]  
            if temp in map_a :  # 判断步骤
                return [map_a[temp], i]
            map_a[nums[i]] =  i  # 添加步骤(切记先判断再添加,以免key冲突)
  • 提交结果:
提交时间 状态 执行用时 语言
几秒前 通过 28 ms python
  • 时间复杂度:
    因为有循环,最坏的情况是循环n次(用n表示k),时间复杂度为o(n)
  1. 快乐数()
class Solution(object):
    def isHappy(self, n):
        """
        :type n: int
        :rtype: bool
        """

        dict_1 = {}

        while 1:
            sum = 0

            while n != 0:   #计算平方之和
                sum += (n % 10) ** 2
                n /= 10

            n = sum

            if n == 1:   #如果平方之和为1,证明n是快乐数,返回True
                return True
            elif dict_1.has_key(n):  #若平方之和已出现过(循环计算),证明加法之和不可能为1,n不是快乐数,返回False
                return False

            dict_1[n] = 0

提交结果:

提交时间 状态 执行用时 语言
几秒前 通过 28 ms python
  • 时间复杂度:
    时间复杂度不好计量,随着不断计算,应该不会很大

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/14018.html

(0)
上一篇 2024-03-03 19:33
下一篇 2024-03-04 12:45

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信