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 ===