Python代码简单实现hash查找

Hash查找

  • 分析表

    • 哈希表: 是一个很容易就能便捷的定位到元素的一个集合,通常会被称为槽,每个槽都可以存放一个元素。
    • hash函数: 元素与元素所属的槽之间的映射关系称为hash函数。item % len(list),集合的元素乘除哈希表的长度。
    • 哈希值计算方法
      1. 余除法: 使用元素整除于hash表的长度得到的值
      2. 分组求和法: 假设现在有一串字符串11-22-33-44-55,可以将它们理解为11+22+33+44+55得到165,在将这个值整除于hash表的长度得到想要值。
      3. 平方取中法: 将元素进行平方,再取器中间的数值,整除于hash表的长度。
  • 案例

    • 假设哈希表的长度为6,也就是哈希表初始值为[None, None, None, None, None, None]
    • 此时想要存入一个值,例如11=‘dog’,通过hash函数的计算,也就是11%6=5,将dog放置,哈希表的第五个位置。
    • 然后现在又想存入一个17=‘cat’,通过hash函数的计算,发现17%6=5,此时发现哈希表的第五个位置已经有了元素,并且11!=17,所以会将指针向后偏移,来到hash表的第0个位置,并且发现第0个位置为空,于是就将cat放置第0个位置。
    • 最终结果为: ['cat', None, None, None, None, 'dog']
  • 代码实现

    • Map() 创建一个新的 map 。它返回一个空的 map 集合

    • put(key,value) 向 map 中添加一个新的键值对。如果键已经在 map 中,那么用新值替换旧值。

    • get(key) 给定一个键,返回存储在 map 中的值或 None。

    • del_data(key)方法,使用 del map[key] 形式的语句从 map 中删除键值对。

    • len_data()方法,使用len()返回存储在 map 中的键值对的数量。

    • in_data()方法,返回 True 对于 key in map 语句,如果给定的键在 map 中,否则为False。

    • class Map:
      
          def __init__(self, size=11):
              self.size = size
              self.slots = [None] * self.size  # 存放key
              self.data = [None] * self.size  # 存放value
      
          def hash_func(self, key, size):
              return key % size
      
          def re_hash(self, old_hash, size):
              return (old_hash + 1) % size
      
          def put(self, key, value):
              start_slot = self.hash_func(key, len(self.slots))
      
              if self.slots[start_slot] is None:
                  """ 没有冲突 """
                  self.slots[start_slot] = key
                  self.data[start_slot] = value
              else:
                  """ 存在冲突 """
                  if self.slots[start_slot] == key:
                      """ 已存在,而非冲突 """
                      self.data[start_slot] = value
                  else:
                      """ 存在冲突 """
                      next_slot = self.re_hash(start_slot, len(self.slots))
                      while self.slots[next_slot] is not None and self.slots[next_slot] != key:
                          """ 当没有找到空槽或者找到相同key的时候,执行循环 """
                          next_slot = self.re_hash(next_slot, len(self.slots))
                          if next_slot == start_slot:
                              # raise IndexError("hash表已满")
                              print("hash表已满")
                              return
      
                      # 走到这边说明已经找到了空槽或者找到了相同的key
                      if self.slots[next_slot] is None:
                          # 说明找到了空槽
                          self.slots[next_slot] = key
                          self.data[next_slot] = value
                      else:
                          # 说明已存在,而非冲突
                          self.data[next_slot] = value
      
          def get(self, key):
              start_slot = self.hash_func(key, len(self.slots))  # 获取该key%11
      
              data = None
              stop = False
              found = False
              position = start_slot
              while self.slots[position] is not None and not found and not stop:
                  # 没有找到空槽并且没有找到并且没有停止就继续循环
                  if self.slots[position] == key:
                      # 说明找到了
                      found = True
                      data = self.data[position]
                  else:
                      position = self.re_hash(position, len(self.slots))  # 依次向后
                      if position == start_slot:
                          # 说明找了一圈
                          stop = True
      
              return data
      
          def del_data(self, key):
              start_slot = self.hash_func(key, len(self.slots))
      
              stop = False
              found = False
              position = start_slot
              while not found and not stop:
                  """ 没有找到并且没有停止 """
                  if self.slots[position] == key:
                      self.slots[position] = None
                      self.data[position] = None
                      found = True
                  else:
                      position = self.re_hash(position, len(self.slots))
                      if position == start_slot:
                          stop = True
      
          def len_data(self):
              count = 0
              for i in self.slots:
                  if i is not None:
                      count += 1
              return count
      
          def in_data(self, key):
              start_slot = self.hash_func(key, len(self.slots))
      
              found = False
              stop = False
              position = start_slot
              while not found and not stop:
                  if self.slots[position] == key:
                      found = True
                  else:
                      position = self.re_hash(position, len(self.slots))
                      if position == start_slot:
                          stop = True
      
              return found
      
          def __getitem__(self, item):
              return self.get(item)
      
          def __setitem__(self, key, value):
              self.put(key, value)
      
          def __delitem__(self, key):
              self.del_data(key)
      
          def __len__(self):
              return self.len_data()
      
          def __contains__(self, item):
              return self.in_data(item)
      
      
      h = Map()
      h[1] = 'cat'
      h[2] = 'people'
      h[3] = 'people'
      h[4] = 'people'
      h[5] = 'people'
      h[6] = 'people'
      h[7] = 'people'
      h[8] = 'people'
      h[9] = 'people'
      h[10] = 'people'
      h[11] = 'people'
      h[12] = 'people'
      del h[1]
      print(2 in h)
      print(1 in h)
      print(len(h))
      print(h.slots)
      print(h.data)
      
      
  • 8
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 哈希表在 Python 中可以通过字典(dict)来实现。字典是一种无序的数据结构,由键值对组成,其中键是唯一的,可以用来快速查找和访问值。下面是一个简单哈希实现代码示例: ``` # 创建一个空字典 hash_table = {} # 添加键值对 hash_table['apple'] = 1 hash_table['banana'] = 2 hash_table['orange'] = 3 # 查找键对应的值 print(hash_table['apple']) # 输出 1 print(hash_table.get('banana')) # 输出 2 # 删除键值对 del hash_table['orange'] # 遍历字典 for key, value in hash_table.items(): print(key, value) ``` 在 Python 中,字典的实现使用了哈希表的思想,通过计算键的哈希值来快速定位对应的值。因此,字典的查找、插入和删除操作都具有很高的效率。 ### 回答2: 在Python中,可以使用字典(Dictionary)数据类型来实现哈希表。字典是一种可变容器模型,可以存储键-值对。每个键都是唯一的,对应着一个值。 下面是一个简单的示例代码实现哈希表: ``` class HashTable: def __init__(self): self.table = {} def put(self, key, value): self.table[key] = value def get(self, key): if key in self.table: return self.table[key] else: return None def remove(self, key): if key in self.table: del self.table[key] # 实例化一个哈希表对象 hashTable = HashTable() # 向哈希表中插入键-值对 hashTable.put("apple", 10) hashTable.put("banana", 5) hashTable.put("orange", 8) # 获取键对应的值 print(hashTable.get("apple")) # 输出:10 print(hashTable.get("banana")) # 输出:5 # 删除键-值对 hashTable.remove("orange") # 获取已删除的键对应的值 print(hashTable.get("orange")) # 输出:None ``` 在上面的代码中,`HashTable`类是哈希表的实现。它使用一个字典来存储键-值对,`put`方法用于插入键-值对,`get`方法用于获取键对应的值,`remove`方法用于删除键-值对。 通过实例化`HashTable`对象,并调用相应的方法,可以实现哈希表的功能,包括插入、获取和删除键-值对。 ### 回答3: 在Python中,可以使用内置的字典(dictionary)来实现哈希表。 哈希表是一种根据键(key)直接访问值(value)的数据结构。在Python中,字典就是一种哈希表,可通过键来查找对应的值。 下面是一个简单的示例代码,展示了如何使用Python的字典来实现哈希表: ```python # 创建一个空的哈希hash_table = {} # 向哈希表中添加键值对 hash_table['apple'] = 1 hash_table['banana'] = 2 hash_table['orange'] = 3 # 通过键获取值 print(hash_table['apple']) # 输出 1 # 修改键对应的值 hash_table['apple'] = 5 print(hash_table['apple']) # 输出 5 # 检查哈希表中是否存在某个键 if 'banana' in hash_table: print("存在") else: print("不存在") # 输出 存在 # 删除键值对 del hash_table['orange'] print(hash_table) # 输出 {'apple': 5, 'banana': 2} ``` 在上述代码中,`hash_table`是一个字典,可以通过键来访问对应的值。通过使用`hash_table[键]`的方式,可以获取该键对应的值。同时,利用`hash_table[键] = 值`的形式可以向哈希表中添加键值对。通过`del hash_table[键]`可以删除指定的键值对。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值