数据结构-哈希表(一)

简介: 哈希表(Hash Table),也称为散列表,是一种常见的数据结构,用于存储键值对。它通过将键映射到一个特定的索引位置来实现高效的数据访问和查找。

哈希表(Hash Table),也称为散列表,是一种常见的数据结构,用于存储键值对。它通过将键映射到一个特定的索引位置来实现高效的数据访问和查找。


下面是哈希表的基本原理和操作:


  1. 哈希函数(Hash Function):哈希表使用哈希函数将键映射到索引位置。哈希函数将任意大小的输入映射为固定大小的输出,通常是一个整数。优秀的哈希函数应该将不同的键均匀地映射到不同的索引位置,以减少冲突。


  1. 数组存储桶:哈希表内部使用一个固定大小的数组作为存储桶。每个桶可以存储一个或多个键值对,通常使用链表或者更高效的数据结构如红黑树来处理桶中的冲突。


  1. 插入操作:当要向哈希表中插入一个键值对时,首先通过哈希函数计算键的索引位置。然后,将键值对存储在对应的桶中。如果存在冲突(即多个键映射到同一个索引位置),通常会使用链表或其他方法处理冲突,将键值对添加到冲突的桶中。


  1. 查找操作:要查找哈希表中的一个键,首先通过哈希函数计算键的索引位置。然后,检查对应的桶中是否存在该键。如果存在冲突,需要在冲突的桶中进行搜索。


  1. 删除操作:要删除哈希表中的一个键值对,首先通过哈希函数计算键的索引位置。然后,找到对应的桶,删除包含该键的节点。


哈希表的优点是可以在平均情况下实现快速的插入、查找和删除操作,时间复杂度通常为 O(1)。然而,在最坏情况下,哈希表的性能可能下降到 O(n),其中 n 是哈希表中的键值对数量。此外,哈希表的空间复杂度也比实际存储的键值对数量要高,因为需要预留足够的桶空间以减少冲突。


在实际应用中,哈希表广泛用于缓存、索引和唯一标识等场景。编程语言和标准库通常提供了哈希表的实现,可以直接使用或进行扩展。


1.有效的字母异位词

给定两个字符串 st ,编写一个函数来判断 t 是否是 s 的字母异位词。

注意:st 中每个字符出现的次数都相同,则称 st 互为字母异位词。

示例 1:

输入: s = "anagram", t = "nagaram"

输出: true

第一种方法我们使用字典哈希来解决


from collection import defaultdict
def isAnagram(s,t):
    hashMap=defaultdict(int)
    if len(t)!=len(s):   # 如果长度不相等则二者不可能为异位
        return False
    for i in s:
        hashMap[i]+=1    # 先将s中字符存到hash表中
    for i in t:
        hash[i]-=1
    for i in t:          # 判断t中字母是否在hash表中
        if hashMap!=0:
            return False
    return True

第二种我们利用数组来解决


def isAnagram(s,t):
    nums=[0] * 26
    for i in t:
        nums[ord(i)-ord(a)]+=1
    for i  in s:
        nums[ord(i)-ord(a)]-=1
    for i in range(26):
        if nums[i]!=0:
               return False
    return True

2.赎金信

这一题与上一题的不同之处就是在于最后遍历,第1题中我们需要判断二者是否相同所以我们需要将数组全部遍历,而本题则是判断ransomNote是否可以由magazine构成,因此最后遍历时,我们遍历包含ransomNote的数组,如果其值大于0则说明magazine中并没有对应字符

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。


如果可以,返回 true ;否则返回 false 。


magazine 中的每个字符只能在 ransomNote 中使用一次。


示例 1:


输入:ransomNote = "a", magazine = "b"

输出:false

class Solution:
    def canConstruct(ransomNote, magazine):
        nums=[0] * 26
        for i in ransomNote:
            nums[ord(i)-ord("a")]+=1
        for i in magazine:
            nums[ord(i)-ord("a")]-=1
        for i in ransomNote:
            if nums[ord(i)-ord("a")]>0:
                return False
        return True

3.字母异位词分组

给你一个字符串数组,请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。


字母异位词 是由重新排列源单词的所有字母得到的一个新单词。


示例 1:


输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]


输出: [["bat"],["nat","tan"],["ate","eat","tea"]]

def Group(strs):
     hashMap=collections.defaultdict(list)
     for i in range(0,len(strs)):
             key="".join(sorted(strs[i]))
             hashMap.append(strs[i])
     return lsit(hashMap.values())

4.找到字符串中所有字母异位词

给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。


异位词 指由相同字母重排列形成的字符串(包括相同的字符串)。


示例 1:


输入: s = "cbaebabacd", p = "abc"

输出: [0,6]

解释:

起始索引等于 0 的子串是 "cba", 它是 "abc" 的异位词。

起始索引等于 6 的子串是 "bac", 它是 "abc" 的异位词。

class Solution:
    def findAnagrams(s, p):
        n,m=len(s),len(p)
        res=[]
        s_cnt=[0]*26
        p_cnt=[0] *26
        if n<m:return res
        for i in range(m):
            p_cnt[ord(p[i])-ord("a")]+=1
            s_cnt[ord(s[i])-ord("a")]+=1
        if p_cnt==s_cnt:
            res.append(0)
        for i in range(m,n):
            s_cnt[ord(s[i-m])-ord("a")]-=1
            s_cnt[ord(s[i])-ord("a")]+=1
            if s_cnt==p_cnt:
                res.append(i-m+1)
        return res
相关文章
|
7月前
|
算法
数据结构-哈希表(二)
数据结构-哈希表(二)
80 0
|
7月前
|
存储 索引 Python
python中的哈希表数据结构
python中的哈希表数据结构
57 0
|
7月前
|
存储 C++ Python
【数据结构】哈希表—C/C++实现
【数据结构】哈希表—C/C++实现
97 0
|
2月前
|
算法 Java 数据库
数据结构与算法学习十五:哈希表
这篇文章详细介绍了哈希表的概念、应用实例、实现思路,并提供了使用Java实现的哈希表代码。
67 0
数据结构与算法学习十五:哈希表
|
2天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
3月前
|
存储 Java Serverless
【数据结构】哈希表&二叉搜索树详解
本文详细介绍了二叉搜索树和哈希表这两种数据结构。二叉搜索树是一种特殊二叉树,具有左子树节点值小于根节点、右子树节点值大于根节点的特点,并且不允许键值重复。文章给出了插入、删除和搜索等方法的具体实现。哈希表则通过哈希函数将键名映射为数组下标,实现快速查找,其插入、删除和查找操作时间复杂度理想情况下为O(1)。文中还讨论了哈希函数的设计原则、哈希冲突的解决方法及哈希表的实现细节。
69 8
【数据结构】哈希表&二叉搜索树详解
|
2月前
|
存储 缓存 Java
【数据结构】哈希表
【数据结构】哈希表
56 1
|
4月前
|
存储 Java
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
这篇文章通过Java代码示例展示了如何实现哈希表,包括定义结点类、链表类、数组存储多条链表,并使用简单的散列函数处理冲突,以及如何利用哈希表存储和查询学生信息。
数据结构中的哈希表(java实现)利用哈希表实现学生信息的存储
|
6月前
|
存储 NoSQL 算法
redis数据结构—哈希表
redis数据结构—哈希表
64 0
|
7月前
|
存储 算法 C++
数据结构/C++:哈希表
数据结构/C++:哈希表
83 2