代码随想录day5|哈希表

哈希表基础知识

定义: 哈希表可以通过索引下标对元素进行快速的访问,

  • 哈希表内部实现原理:哈希表由一个直接寻址表和哈希函数构成,h(k)返回元素的存储下标。
  • 哈希函数:h(k) = k mod 7
  • 哈希碰撞:哈希表的存储大小有限,而存储值的数量时无限的,因此会存在两个不同的元素,映射到同一个位置上,那么这同一个位置上的元素便会产生冲突,成为哈希碰撞。
    h(0) = h(7) = h(14)
  • 常见哈希表的区别:
  • python如何实现hash表:
    • 数组
    • 集合(set)
    • map(映射)->字典方式
dic = {}
dic.get(num)
dic.keys()
dic.values()
dic,items()
del dic['']

适用场景

当遇到了要快速判断一个元素是否出现集合里的时候,就要考虑哈希法。
哈希法也是牺牲了空间换取了时间,因为我们要使用额外的数组,set或者是map来存放数据,才能实现快速的查找。

242.有效的字母异位词:哈希-数组表示

思路: 将第一个字母的元素进行存储并计数,再将第二个单词的字母进行相减,判断此时hash表中的元素是否为0

  • 数组:由于a-z之间的ASCII值是连续的,所以可以利用数组进行哈希表的表示hash[26],第一个字符串做加法,第二个字符串做减法,值为0.(数值较小,范围可控)
  • 字典:有值
  • 集合:数值比较大
    相关函数:
  1. ord(x):获取字母的ASCII值,能用数组尽量使用数组,数组的运算比较快,利用数组做映射时最直接的。
  2. 如果键已经存在字典中就返回它的值,如果没有就将默认值保存并且返回该默认值。但是如果直接使用dict={},就需要先生成对应key的值。
    from collections import defaultdict
    s_dict = defaultdict(int)

    在这里插入图片描述
    哈希函数: 只要把对应的ASCII值减去,得到的就是数组的下标。
# 方式1:
		# 出现次数使用
        res = {}
        if len(s) != len(t):
            return False
        # 如果等长创建字典记录s中字符出现的个数
        for a in s:
            if a not in res:
                res[a] = 1
            else:
                res[a] += 1
        # 再遍历t,如果出现则进行相减
        for b in t:
            if b not in res:
                return False
            else:
                res[b] = res[b] - 1
        # 如果所有的元素均为0,则说明两个字符串的个数相同
        return all(value == 0 for value in res.values())
**# 方法2:** 
		from collections import Counter
        a_count = Counter(s)
        b_count = Counter(t)
        return a_count == b_count
**# 方法3:**
		record = [0] * 26
        for i in s:
            #并不需要记住字符a的ASCII,只要求出一个相对数值就可以了
            record[ord(i) - ord("a")] += 1
        for i in t:
            record[ord(i) - ord("a")] -= 1
        for i in range(26):
            if record[i] != 0:
                #record数组如果有的元素不为零0,说明字符串s和t 一定是谁多了字符或者谁少了字符。
                return False
        return True
# 方法4:
		from collections import defaultdict
        s_dict = defaultdict(int)
        t_dict = defaultdict(int)

        for x in s:
            s_dict[x] += 1
        
        for x in t:
            t_dict[x] += 1

        return s_dict == t_dict

349.两个数组的交集:哈希-数组表示

思路: nums1进行处理生成哈希表,然后再利用nums2中的值在哈希表中进行寻找。

# 先将一个单词的字母放到数组中,此后再将剩余的元素进行判断即可
res = {}
a = []
for num in nums1:
    res[num] = 1
for num in nums2:
    if num in res.keys() and res[num] == 1:
        a.append(num)
        res[num] -= 1
return a

202.快乐数:哈希-元组表示

思路: 本题的关键点在于会无限循环,那么什么时候出现无限循环呢?即当下一个值在之前的过程中出现则会出现无限循环,当我们遇到了要快速判断一个元素是否出现集合里的时候用哈希表,根据这个特性很容易得到对应的方法,循环若在哈希表中出现则跳出循环。

class Solution:
    def isHappy(self, n: int) -> bool:
        # 判断一个数是否为快乐数
        s = {
            '0':0,
            '1':1,
            '2':4,
            '3':9,
            '4':16,
            '5':25,
            '6':36,
            '7':49,
            '8':64,
            '9':81}
        res = {} # 如果之后的数在之前出现过那么不成立,关键是建立哈希表看是否出现过
        while n != 1:
            if n in res:
                return False
            if n not in res:
                res[n] = 1 
            n = sum([s[x] for x in str(n)])
        return True

python中集合的有关操作

set.add(2)

总结:

哈希表使用情形:判断元素是否出现过,更像是建立一个中间表,后续的过程需要依照这个中间表进行不断求解。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值