散列的实现

// 散列类 - 线性探测法
function HashTable () {
this.table = new Array(137);
this.values = [];
this.simpleHash = simpleHash;
this.betterHash = betterHash;
this.showDistro = showDistro;
this.put = put;
this.get = get;
}
function put (key, data) {
let pos = this.betterHash(key);
// this.table[pos] = data;
if (this.table[pos] === undefined) {
this.table[pos] = key;
this.values[pos] = data;
} else {
while (this.table[pos] !== undefined) {
++pos;
}
this.table[pos] = key;
this.values[pos] = data;
}
}
function get (key) {
// return this.table[this.betterHash(key)];
let hash = -1;
hash = this.betterHash(key);
if (hash > -1) {
for (let i = hash; this.table[hash] !== undefined; ++i) {
if (this.table[hash] === key) {
return this.values[hash];
}
}
}
return undefined;
}
function simpleHash (data) {
let total = 0;
for (let i = 0; i < data.length; ++i) {
total += data.charCodeAt(i);
}
return total % this.table.length;
}
function showDistro () {
let n = 0;
for (let i = 0; i < this.table.length; ++i) {
if (this.table[i] !== undefined) {
console.log(`${i}: ${this.table[i]}`);
}
}
}
function betterHash (string) {
const H = 7;
let total = 0;
for (let i = 0; i < string.length; ++i) {
total += H * total + string.charCodeAt(i);
}
total = total % this.table.length;
if (total < 0) {
total += this.table.length -1;
}
return parseInt(total, 10);
}

练习

使用线性探测法创建一个字典,用来保存单词的定义。该程序需要包含两个部分:第一部分将一组单词和它们的定义存储进散列表;第二部分让用户输入单词,程序给出该单词的定义。

// 字典类
function Dict () {
this.hashTable = new HashTable();
this.save = save;
this.find = find;
}
function save (word, description) {
this.hashTable.put(word, description);
}
function find (word) {
return this.hashTable.get(word);
}
// 示例
let d = new Dict();
d.save('Mazey', 'a strong man.');
d.save('Cherrie', 'a beautiful girl.');
d.save('John', 'unknown.');
console.log(d.find('John')); // unknown.
console.log(d.find('Mazey')); // a strong man.
console.log(d.find('Ada')); // undefined

JavaScript数据结构与算法-散列练习

JavaScript数据结构与算法-散列练习的更多相关文章

  1. javascript数据结构与算法--散列

    一:javascript数据结构与算法--散列  一:什么是哈希表? 哈希表也叫散列表,是根据关键码值(key,value)而直接进行访问的数据结构,它是通过键码值映射到表中一个位置来访问记录的,散列 ...

  2. 为什么我要放弃javaScript数据结构与算法(第七章)—— 字典和散列表

    本章学习使用字典和散列表来存储唯一值(不重复的值)的数据结构. 集合.字典和散列表可以存储不重复的值.在集合中,我们感兴趣的是每个值本身,并把它作为主要元素.而字典和散列表中都是用 [键,值]的形式来 ...

  3. 算法与数据结构(十二) 散列(哈希)表的创建与查找(Swift版)

    散列表又称为哈希表(Hash Table), 是为了方便查找而生的数据结构.关于散列的表的解释,我想引用维基百科上的解释,如下所示: 散列表(Hash table,也叫哈希表),是根据键(Key)而直 ...

  4. 为什么我要放弃javaScript数据结构与算法(第九章)—— 图

    本章中,将学习另外一种非线性数据结构--图.这是学习的最后一种数据结构,后面将学习排序和搜索算法. 第九章 图 图的相关术语 图是网络结构的抽象模型.图是一组由边连接的节点(或顶点).学习图是重要的, ...

  5. 为什么我要放弃javaScript数据结构与算法(第六章)—— 集合

    前面已经学习了数组(列表).栈.队列和链表等顺序数据结构.这一章,我们要学习集合,这是一种不允许值重复的顺序数据结构. 本章可以学习到,如何添加和移除值,如何搜索值是否存在,也可以学习如何进行并集.交 ...

  6. 为什么我要放弃javaScript数据结构与算法(第二章)—— 数组

    第二章 数组 几乎所有的编程语言都原生支持数组类型,因为数组是最简单的内存数据结构.JavaScript里也有数组类型,虽然它的第一个版本并没有支持数组.本章将深入学习数组数据结构和它的能力. 为什么 ...

  7. javascript数据结构与算法---栈

    javascript数据结构与算法---栈 在上一遍博客介绍了下列表,列表是最简单的一种结构,但是如果要处理一些比较复杂的结构,列表显得太简陋了,所以我们需要某种和列表类似但是更复杂的数据结构---栈 ...

  8. javascript数据结构与算法---列表

    javascript数据结构与算法---列表 前言:在日常生活中,人们经常要使用列表,比如我们有时候要去购物时,为了购物时东西要买全,我们可以在去之前,列下要买的东西,这就要用的列表了,或者我们小时候 ...

  9. 为什么我要放弃javaScript数据结构与算法(第十一章)—— 算法模式

    本章将会学习递归.动态规划和贪心算法. 第十一章 算法模式 递归 递归是一种解决问题的方法,它解决问题的各个小部分,直到解决最初的大问题.递归通常涉及函数调用自身. 递归函数是像下面能够直接调用自身的 ...

随机推荐

  1. android-seekbar的thumb图片不居中显示的处理办法

    seekbar更换图片后,发现thumb的图片不会居中(竖直方向)显示了,代码如下: <SeekBar android:id="@+id/wb_seekbar" androi ...

  2. Access 连接字符串全集

    连接 Access 2007 的操作方法   //无密码的连接字符串 string conStr = "Provider=Microsoft.Ace.OleDb.12.0;"; c ...

  3. 【C#】重载重写重构

    前言 前几篇博客说了重写和重载.今天主要说重构,顺便比較一下三者. 重构.重写.重载 重构就是通过调整程序代码改善软件的质量.性能,使其程序的设计模式和架构更趋合理.提高软件的扩展性和维护性. 通俗点 ...

  4. IIS如何添加m3u8流媒体类型

    m3u8,mime类型填写: application/x-mpegURL. ts ,mime类型填写: video/MP2T

  5. javaweb项目开发错误代码

    HTTP状态码(HTTP Status Code) 一些常见的状态码为:200 - 服务器成功返回网页 404 - 请求的网页不存在 503 - 服务不可用 所有状态解释:点击查看 1xx(临时响应) ...

  6. java - day14 - InnerClass

    内部类使用 package com.InnerClass; public class Mama { String name; Baby baby; Mama(String name){ this.na ...

  7. 学习spring in action 第一天

    这段时间,开始学习java吧,因为C sharp 学习了java的大量语法格式,所以,留意下,就不会错了,java 有的c sharp也有,而且之前我也学习过java的桌面开发,但是一下子上来就要自己 ...

  8. C# 子类实例化过程

    刚研究了一下C#子类实例化的过程. 首先我遇到了如下一个问题: 有类A,里面写了一个有参的构造函数,并没有提供默认的无参构造函数.现在类B继承了类A,没有写任何的构造函数. 这时如果想实例化类B就会产 ...

  9. HDU高精度总结(java大数类)

      HDU1002   A + B Problem II [题意]大数相加 [链接]http://acm.hdu.edu.cn/showproblem.php?pid=1002 Sample Inpu ...

  10. Blackey win10 + python3.6 + VSCode + tensorflow-gpu + keras + cuda8 + cuDN6N环境配置(转载)

    win10 + python3.6 + VSCode + tensorflow-gpu + keras + cuda8 + cuDN6N环境配置   写在前面的话: 再弄这个之前,我对python也好 ...