数据结构Javascript实现 | 哈希表 hashTable

概念

通过哈希函数访问内存地址的数据结构,哈希函数可以通过系列运算将key值转为散列的地址值。

图示

在这里插入图片描述

代码

不处理冲突的哈希表:

class HashTable_WithoutSolveClash {
  constructor(size) {
    this.table = new Array(size);
  }

  /** 哈希函数 - 除留余数法 */
  hash(key) {
    let total = 0;
    for (let i = 0; i < key.length; i++) {
      total += key.charCodeAt(i);
    }
    return total % this.table.length;
  }

  set(key, value) {
    const pos = this.hash(key);
    this.table[pos] = value;
  }

  get(key) {
    return this.table[this.hash(key)];
  }

  delete(key) {
    const pos = this.hash(key);
    delete this.table[pos];
  }

  show() {
    for (let i = 0; i < this.table.length; i++) {
      if (this.table[i] !== undefined) {
        console.log(i + ':' + this.table[i]);
      }
    }
  }
}

示例1:

const h1 = new HashTable_WithoutSolveClash(1993);
h1.set('X', 'xwz');
h1.set('H', 'hjy');
h1.set('X', 'xxs'); // 和第一条数据冲突

console.log(h1.get('X')); // xxs (冲突数据覆盖了之前的数据)

h1.delete('X');

h1.show();

处理冲突的哈希表:

class HashTable_WithSolveClash {
  constructor(size) {
    this.table = new Array(size);
  }

  /** 哈希函数 - 平方求和法 */
  hash(key) {
    let total = 0;
    for (let i = 0; i < key.length; i++) {
      total += key.charCodeAt(i);
    }
    const s = total * total + '';
    return s.charAt(s.length / 2 - 1) * 10 + s.charAt(s.length / 2) * 1;
  }

  /** 解决哈希冲突 - 线性开放定址法 */
  solveClash(index, value) {
    const table = this.table;
    for (let i = 0; index + i < table.length; i++) {
      if (table[index + 1] == null) {
        table[index + 1] = value;
        break;
      }      
    }
  }

  set(key, value) {
    const pos = this.hash(key);
    if (this.table[pos] == null) {
      this.table[pos] = value;
    } else {
      this.solveClash(pos, value);
    }
  }

  show() {
    for (let i = 0; i < this.table.length; i++) {
      if (this.table[i] !== undefined) {
        console.log(i + ':' + this.table[i]);
      }
    }
  }
}

示例2:

const h2 = new HashTable_WithSolveClash(1993);

h2.set('X', 'xwz');
h2.set('H', 'hjy');
h2.set('X', 'xxs');

h2.show(); // 原先被覆盖的值正常显示了
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值