最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 创建一个简单的哈希表你会吗?|刷题打卡

    正文概述 掘金(灬青芒灬)   2021-03-14   540

    平时我们在编程的时候,经常会用到哈希表处理和储存数据,那么如果让你实现一个简单的哈希表,你会怎么实现呢?

    原题链接705. 设计哈希集合

    一、先看题

    不使用任何内建的哈希表库设计一个哈希集合(HashSet)。

    实现 MyHashSet 类:

    • void add(key) 向哈希集合中插入值 key 。
    • bool contains(key) 返回哈希集合中是否存在这个值 key 。
    • void remove(key) 将给定值 key 从哈希集合中删除。如果哈希集合中没有这个值,什么也不做。

    示例:

    提示:

    • 0<=key<=106 0 <= key <= 10^60<=key<=106
    • 最多调用 104 次 addremovecontains

    二、整理思路

    在我们实现简易哈希表的数据结构之前,我们首先要分析,对于题中给出的简易哈希表应该要有哪些功能,以及初步的实现思路。

    第一步:

    确认输入输出:

    输入: 01060-10^60−106的数

    输出: 由示例可知,只有contains方法有bool值返回,其他方法无需返回值

    第二步

    怎么实现这个数据结构?

    作为一个哈希表,我们首先肯定要有存储数据的属性,我们将其命名为data。

    除了data外,还有题干中给出的三种方法:add、contains、remove。

    由于无法使用内建的哈希表库,因此我们可以采取数组来进行模拟。除了题中的三种方法,也没有其他的要求,因此我们可以采取一些优化措施,比如存储的时候将数进行分组,从而避免冲突。

    在这里我们使用整数除法来作为哈希函数。为了尽量避免冲突,我们将除数BASE定为一个质数。

    因此,得到了下面的算法:

    /**
     * Initialize your data structure here.
     */
    var MyHashSet = function () {
        this.BASE = 971;
        this.data = new Array(this.BASE).fill(0).map(() => new Array())
    };
    
    /** 
     * @param {number} key
     * @return {void}
     */
    MyHashSet.prototype.add = function (key) {
        const h = key % this.BASE
        for (let ele of this.data[h]) {
            if (ele === key) return
        }
        this.data[h].push(key)
    };
    
    /** 
     * @param {number} key
     * @return {void}
     */
    MyHashSet.prototype.remove = function (key) {
        const h = key % this.BASE
        for (let i = 0; i < this.data[h].length; i++) {
            if (this.data[h][i] === key) {
                this.data[h].splice(i, 1)
                return
            }
        }
    };
    
    /**
     * Returns true if this set contains the specified element 
     * @param {number} key
     * @return {boolean}
     */
    MyHashSet.prototype.contains = function (key) {
        const h = key % this.BASE
        return this.data[h].includes(key)
    };
    
    /**
     * Your MyHashSet object will be instantiated and called as such:
     * var obj = new MyHashSet()
     * obj.add(key)
     * obj.remove(key)
     * var param_3 = obj.contains(key)
     */
    

    对于为什么质数取模,采用leetcoder@果然翁的原话就是:

    三、总结

    对于平时用习惯的基础数据结构,我们也应该适当深入了解下实现原理,这样才能更好地使用这些工具,最大化他们的使用价值。

    本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情


    起源地下载网 » 创建一个简单的哈希表你会吗?|刷题打卡

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元