zoukankan      html  css  js  c++  java
  • JavaScript实现没有解决冲突的哈希表

    散列算法的作用是尽可能快地在数据结构中找到一个值

    散列函数的作用是给定一个键值,然后返回值在表中的地址

    class ValuePair {                       //用于存放一对键值对
        constructor(key, value) {
            this.key = key;
            this.value = value;
        }
        toString() {
            return `[#${this.key}:${this.value}]`;
        }
    }
    
    class HashTable {
        constructor() {
            this.table = {};
        }
        toStrFn(str) {
            if (str === null) {
                return 'null';
            } else if (str === undefined) {
                return 'undefined';
            } else {
                return str.toString();
            }
        }
        loseloseHashTable(key) {    //散列函数
            if (typeof key === 'number') {  //key如果是数值直接返回
                return key;
            }
            let hash = 0;  //用来储存每个字符的ASCII码之和
            const tableKey = this.toStrFn(key);
            for (let i = 0; i < tableKey.length; i++) {
                hash += tableKey.charCodeAt(i);
            }
            return hash % 37;   //为了得到一个比较小的值
        }
        hashCode(key) {
            return this.loseloseHashTable(key);
        }
    
        put(key, value) {
            if (key == null || value == null) {   //检验key和value是否合法
                return false;
            }
            const position = this.hashCode(key);
            this.table[position] = new ValuePair(key, value);  //为了信息备份将key保存下来
            return true;
        }
        get(key) {
            let valuePair = this.table[this.hashCode(key)];
            return valuePair == null ? undefined : valuePair.value;
        }
        remove(key) {
            if (this.table[this.hashCode(key)] != null) {
                delete this.table[this.hashCode(key)];
                return true;
            }
            return false;
        }
        size() {
            return Object.keys(this.table).length;
        }
        isEmpty() {
            return this.size() === 0;
        }
        toString() {
            if (this.isEmpty()) {
                return "";
            }
            let keys = Object.keys(this.table);
            let objString = `{${keys[0]}=>${this.table[keys[0]]}}`;
            for (let i = 1; i < keys.length; i++) {
                objString = `${objString},{${keys[i]}=>${this.table[keys[i]]}}`;
            }
            return objString;
        }
    
    
    
    
    
    }
    //测试用例
    
    const hash = new HashTable();
    
    console.log(hash.hashCode('Gandalf') + ' - Gandalf');
    console.log(hash.hashCode('John') + ' - John');
    console.log(hash.hashCode('Tyrion') + ' - Tyrion');
    
    console.log(' ');
    
    console.log(hash.hashCode('Ygritte') + ' - Ygritte');
    console.log(hash.hashCode('Jonathan') + ' - Jonathan');
    console.log(hash.hashCode('Jamie') + ' - Jamie');
    console.log(hash.hashCode('Jack') + ' - Jack');
    console.log(hash.hashCode('Jasmine') + ' - Jasmine');
    console.log(hash.hashCode('Jake') + ' - Jake');
    console.log(hash.hashCode('Nathan') + ' - Nathan');
    console.log(hash.hashCode('Athelstan') + ' - Athelstan');
    console.log(hash.hashCode('Sue') + ' - Sue');
    console.log(hash.hashCode('Aethelwulf') + ' - Aethelwulf');
    console.log(hash.hashCode('Sargeras') + ' - Sargeras');
    
    hash.put('Ygritte', 'ygritte@email.com');
    hash.put('Jonathan', 'jonathan@email.com');
    hash.put('Jamie', 'jamie@email.com');
    hash.put('Jack', 'jack@email.com');
    hash.put('Jasmine', 'jasmine@email.com');
    hash.put('Jake', 'jake@email.com');
    hash.put('Nathan', 'nathan@email.com');
    hash.put('Athelstan', 'athelstan@email.com');
    hash.put('Sue', 'sue@email.com');
    hash.put('Aethelwulf', 'aethelwulf@email.com');
    hash.put('Sargeras', 'sargeras@email.com');
    
    console.log('**** Printing Hash **** ');
    
    console.log(hash.toString());
    // {4 => [#Ygritte: ygritte@email.com]},{5 => [#Aethelwulf: aethelwulf@email.com]},{7 => [#Athelstan: athelstan@email.com]},{8 => [#Jasmine: jasmine@email.com]},{9 => [#Jake: jake@email.com]},{10 => [#Sargeras: sargeras@email.com]}
    
    console.log('**** Get **** ');
    
    console.log(hash.get('Ygritte')); // ygritte@email.com
    console.log(hash.get('Loiane')); // jasmine@email.com
    
    console.log('**** Remove **** ');
    
    hash.remove('Ygritte');
    console.log(hash.get('Ygritte')); // undefined
    
    console.log(hash.toString());
    // {5 => [#Aethelwulf: aethelwulf@email.com]},{7 => [#Athelstan: athelstan@email.com]},{8 => [#Jasmine: jasmine@email.com]},{9 => [#Jake: jake@email.com]},{10 => [#Sargeras: sargeras@email.com]}
  • 相关阅读:
    LAMP环境搭建博客
    PHP项目中经常用到的无限极分类函数
    在PHP项目中,每个类都要有对应的命名空间,为什么?
    一键解决docker pull hello-world的问题
    网盘10M速度下载-亿寻下载器
    《提问的智慧》
    idea出现 Error:(1, 1) java: 非法字符: 'ufeff'解决方式
    多线程的四种实现方式
    Java中的get()方法和set()方法
    Java构造器(构造方法/constructor)
  • 原文地址:https://www.cnblogs.com/WP-WangPin/p/13940120.html
Copyright © 2011-2022 走看看