JavaScript 数据结构(八):散列表

JavaScript 数据结构系列目录

JavaScript 数据结构(一): 数组

JavaScript 数据结构(二): 栈

JavaScript 数据结构(三):队列

JavaScript 数据结构(四):双端队列

JavaScript 数据结构(五):链表

JavaScript 数据结构(六):集合

JavaScript 数据结构(七):字典

JavaScript 数据结构(八):散列表

JavaScript 数据结构(九): 树

JavaScript 数据结构(十):二叉堆和堆排序

JavaScript 数据结构(十一):图



一、散列表的概述

散列表(Hash table) 又称 哈希表,其是根据关键码值(Key Value)而直接进行访问的一种数据结构。

也就是说,它通过将关键码值映射到表中的某个位置来访问记录,方便加快查找速度。

那么这个映射函数叫做 散列函数

如图所示:

在这里插入图片描述

二、创建散列表类

知道了散列表的概念后,那我们像往常一眼动手创建一个表示散列表的类。

当然我们还需要一个辅助函数 auxiliaryFn 与一个辅助类 ValuePair。

const auxiliaryFn = item => {
   
    if ( item === null ) return 'NULL';
    else if ( item === undefined ) return "UNDEFINED";
    else if ( typeof item === "string" || item instanceof String ) return `${
     item}`;
    
    return item.toString();
}

class ValuePair {
   
    constructor(key,value) {
   
        this.key = key;
        this.value = value;
    }

    toString() {
   
        return `[#${
     this.key}: ${
     this.value}]`;
    }
}

class HashTable {
   
    constructor(toStrFn = auxiliaryFn) {
   
        this.toStrFn = toStrFn;
        this.table = {
   }
    }
}

然后为类添加一些基本方法 ( put,remove,get )。

三、为散列表类补充方法

1、loseloseHashCode 方法

在实现这几个基本方法前,我们首先要实现的第一个方法是散列函数。

loseloseHashCode(key) {
   
    if ( typeof key === 'number' ) return key;

    let tableKey = this.toStrFn(key),
        hash = 0;

     for ( let i = 0; i < tableKey.length; i++ ) hash += tableKey.charCodeAt(i);
     
     return hash % 37;
}

hashCode(key) {
   
	return this.loseloseHashCode(key);
}

hashCode 方法简单的调用了 loseloseHashCode 方法,将 key 作为参数传入,获取 loseloseHashCode 返回回来的 key 值并返回。

在 loseloseHashCode 方法中,其作用是将我们传过来的 key 值转化成 ASCII 码方便我们直接去散列表里查找记录。

如果它传回来的是数字类型的 key 话我们就直接返回。

如果不是,那么我们先通过辅助函数将其转化成字符串,并且声明一个变量 hash 保存该字符里每个字符的 ASCII 码。

声明完毕后我们通过循环将字符串里的每个字符都迭代一次。

最后返回这个字符里的 ASCII 码的总和 余以37避免超过数值变量最大表示范围的风险(当然可能会出现重复情况,这个我们留到下面再讲)。

2、put 方法

put(key,value) {
   
    if ( key === null || value ===
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值