美文网首页
12 【HashMap】js 利用分离链接(拉链法)解决散列冲突

12 【HashMap】js 利用分离链接(拉链法)解决散列冲突

作者: 狩秋之人 | 来源:发表于2019-11-18 11:41 被阅读0次

昨天有考试...结果回寝室就已经半夜了,根本来不及学习很多东西,看了眼散列冲突的拉链法和线性探查法,敲了一点代码报错,头疼就睡了。今天补上。

首先这里有个勘误,之前的linkedlist(链表),不影响链表使用,但影响调用,修改如下:

  // 原来的代码

  // 获取头文件
  getHead () {
    return this.head.element
  }

这里的getHead 方法不应该获取head 的element ,这会导致调用时无法获取head节点,权限变低,修改为:

  // 现在的代码

  // 获取头文件
  getHead () {
    return this.head
  }

做完这些,就可以利用拉链法解决散列冲突问题了。

注:拉链法本质是在hashmap 中插入链表。

'use strict';

let linkedList = require('./linkedlist.js')

// 内部类,定义链表节点内容
class valuePire {
    constructor (key, value) {
        this.key = key;
        this.value = value
    
        this.toString = function () {
            return '[ k:' + this.key + 'value: ' + this.value + ']'
        }
    } 
}
class HashMap {
    constructor () {
        this.table = []
    }
    // 散列函数
    loseloseHashCode (key) {
        let hash = 0;
        for(let i = 0; i < key.length; i++) {
            hash += key[i].charCodeAt()
        }
        return hash % 37
    }


    // 存放
    put (key, value) {
        let position = this.loseloseHashCode(key)

        if (this.table[position] == undefined) {
            this.table[position] = new linkedList()
        }
        this.table[position].append(new valuePire (key, value))
        return 'ok'
    }

    remove (key) {
        let position = this.loseloseHashCode(key)

        if (this.table[position] !== undefined) {
            let current = this.table[position].getHead()
            let previous = current

            while (current) {
                if (current.element.key === key) {
                    previous.next = current.next
                    current.next = null
                    return true
                }
                previous = current
                current = current.next
            }
        }
        return undefined
    }

    get (key) {
        let position = this.loseloseHashCode(key)

        if (this.table[position] !== undefined) {
            // 先拿到链表的头节点
            let current = this.table[position].getHead()
            while (current) {
                if (current.element.key === key) {
                    return current.element.value
                }
                    current = current.next
            }
        }
        return undefined
    }
}

let hashmap = new HashMap();
hashmap.put('Gandalf', 'gandalf@email.com')

hashmap.put('Tyrion', 'tyrion@email.com')
hashmap.put('Aaron', 'Aaron@email.com')

hashmap.put('Donnie', 'Donnie@email.com')
hashmap.put('Ana', 'Ana@email.com')

hashmap.put('Jonathan', 'Jonathan@email.com')
hashmap.put('Jamie', 'Jamie@email.com')
hashmap.put('Sue', 'Sue@email.com')
hashmap.remove('Jamie')
let temp = hashmap.get('Jonathan')
console.log('====');
console.log(temp);

相关文章

  • 12 【HashMap】js 利用分离链接(拉链法)解决散列冲突

    昨天有考试...结果回寝室就已经半夜了,根本来不及学习很多东西,看了眼散列冲突的拉链法和线性探查法,敲了一点代码报...

  • HashMap若干问题

    HashMap就是一个散列表,它是通过“拉链法”解决哈希冲突的。 1. 哈希表-拉链法 2. HashMap的存取...

  • HashMap深度分析疑问

    hashMap底层是基于散列算法实现,散列算法分为散列再探测和拉链式。hashmap使用了拉链式散列算法,在jdk...

  • 解决哈希冲突

    解决哈希冲突的三种方法(拉链法、开放地址法、再散列法) https://blog.csdn.net/qq_3259...

  • 散列表

    散列函数将被查找的键转换为数组的索引 解决冲突的方法:拉链法和线性探测法 将整数散列最常见的方法是除留余数法,通常...

  • 开放地址法散列

    开放地址法 开放地址法是另一种(相对于分离链接法)解决散列冲突的方法。适用于装填因子(散列表中元素个数和散列表长度...

  • hashmap、hashtable

    Hashmap:数组+链表通过hash函数计算下标值 哈希冲突解决办法:开放寻址法,再散列函数法,链地址法 Has...

  • 散列(二)

    上一章 散列(一) 主要介绍了散列的基本概念以及冲突解决方法--分离链表法。这一章主要介绍解决冲突的另一种方法--...

  • 4 查找

    静态查找 顺序查找法 折半查找法 散列 散列的概念 散列函数 冲突解决方法 散列算法设计与分析

  • HashMap

    HashMap 解决Hash冲突 java 中的HashMap 通过链表法解决Hash冲突 链表法 链表法就是将相...

网友评论

      本文标题:12 【HashMap】js 利用分离链接(拉链法)解决散列冲突

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