美文网首页
设计一个哈希表

设计一个哈希表

作者: MontyOak | 来源:发表于2018-06-30 22:58 被阅读31次

原文链接
作为演示代码,做了以下的简化处理:

  • 键类型仅支持int
  • 哈希冲突处理使用链存储
  • 不设置装载因子的处理
  • 不对输入进行校验
  • 默认数据大小可以完全放在内存中
class Item(object):

    def __init__(self, key, value):
        self.key = key
        self.value = value


class HashTable(object):

    def __init__(self, size):
        self.size = size
        self.table = [[] for _ in range(self.size)]

    def _hash_function(self, key):
        return key % self.size

    def set(self, key, value):
        hash_index = self._hash_function(key)
        for item in self.table[hash_index]:
            if item.key == key:
                item.value = value
                return
        self.table[hash_index].append(Item(key, value))

    def get(self, key):
        hash_index = self._hash_function(key)
        for item in self.table[hash_index]:
            if item.key == key:
                return item.value
        raise KeyError('Key not found')

    def remove(self, key):
        hash_index = self._hash_function(key)
        for index, item in enumerate(self.table[hash_index]):
            if item.key == key:
                del self.table[hash_index][index]
                return
        raise KeyError('Key not found')

简单说明一下,这里使用list的数据结构存放数据,哈希函数是最简单的key值对存储大小取余(这也是为什么key值仅支持int类型的原因)。
需要注意的几点是,哈希函数可以选用更为通用的函数,这样就能够支持更多的键数据类型;这里对于哈希冲突的解决采用了链式存储,在极端条件下(即所有哈希值都映射到同一个位置),set和get方法的时间复杂度将从O(1)退化到O(n);随着数据量的增加,哈希冲突发生的概率越来越大,所以应当引入装载因子进行动态扩容。

相关文章

  • 算法-哈希表算法总结

    1 哈希表模拟 思路:通过设计哈希表,模拟O(1)时间复杂度的哈希表。 2 数组作为哈希表 思路:数组就是简单的哈...

  • 刷穿剑指offer-Day15-哈希表II Python&Jav

    昨日回顾 昨天我们开始了哈希表的学习,讲解了哈希表的集中实现方式。并通过一道 设计哈希集合 的题目,让我们将哈希表...

  • Leet Code 705. 设计哈希集合

    不使用任何内建的哈希表库设计一个哈希集合 具体地说,你的设计应该包含以下的功能 add(value):向哈希集合中...

  • 哈希表在查询搜索的优势

    什么是哈希表? 哈希表是使用一个下标范围比较大的数组A来存储元素,设计一个函数h,对于要存储的线性表的每个元素no...

  • 你使用过的应用服务器优化技术有哪些?

    ① 分布式缓存:缓存的本质就是内存中的哈希表,如果设计一个优质的哈希函数,那么理论上哈希表读写的渐近时间复杂度为O...

  • 706. 设计哈希映射

    不使用任何内建的哈希表库设计一个哈希映射 具体地说,你的设计应该包含以下的功能 put(key, value):向...

  • 设计一个哈希表

    原文链接作为演示代码,做了以下的简化处理: 键类型仅支持int 哈希冲突处理使用链存储 不设置装载因子的处理 不对...

  • redis数据结构--字典

    Redis的字典底层就是哈希表。 哈希表 首先给出哈希表的定义: 其中可以看到,table是一个哈希表节点的数组,...

  • 哈希表—链地址法

    冰冻非一日之寒 哈希冲突是不可避免的,所以我们在设计哈希函数的同时,也要设计解决哈希冲突的办法。 哈希表本质就是一...

  • Day 10 字母异位词分组

    设计哈希表时,选择合适的键是一门艺术。 这次 「Day 10:字母异位词分组」 打卡题来训练一下,如何为哈希表设计...

网友评论

      本文标题:设计一个哈希表

      本文链接:https://www.haomeiwen.com/subject/lmpxuftx.html