JS散列表碰撞处理、开链法、HashTable散列示例


Posted in Javascript onFebruary 08, 2019

本文实例讲述了JS散列表碰撞处理、开链法、HashTable散列。分享给大家供大家参考,具体如下:

/**
 * 散列表碰撞处理、开链法、HashTable散列。
 * 将数组里的元素位置,也设置为数组,当两个数据的散列在同一个位置时,
 * 就可以放在这个位置的二维数组里,解决了散列函数的碰撞处理问题
 */
function HashTable() {
  this.table = new Array(137);
  this.betterHash = betterHash;//散列函数
  this.showDistro = showDistro;//显示散列表里的数据
  this.buildChains = buildChains;//生成二维数组
  this.put = put;//将数据存储到散列表
  this.get = get;//从散列表中取出某个数据
}
// put for separate chaining
function put(key, data) {
  var pos = this.betterHash(key);
  var index = 0;
  if (this.table[pos][index] == undefined) {
    this.table[pos][index] = data;
  }else {
    while (this.table[pos][index] != undefined) {
      ++index;
    }
    this.table[pos][index] = data;
  }
}
/*散列函数*/
function betterHash(string) {
  const H = 37;
  var total = 0;
  for (var 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);
}
function showDistro() {
  var n = 0;
  for (var i = 0; i < this.table.length; ++i) {
    if (this.table[i][n] != undefined) {
      console.log(i + ": " + this.table[i]);
    }
  }
}
function buildChains() {
  for (var i = 0; i < this.table.length; ++i) {
    this.table[i] = new Array();
  }
}
// get for separate chaining
function get(key) {
  var index = 0;
  var pos = this.betterHash(key);
  while ((this.table[pos][index] != undefined)&&(this.table[pos][index] != key)) {
    index += 1;
  }
  if(this.table[pos][index] == key) {
    console.log(key+" 的键值为: "+this.table[pos][index]);
    return this.table[pos][index];
  }else{
    console.log("无该键值");
    return undefined;
  }
}
/*测试开链法*/
var someNames = ["David", "Jennifer", "Donnie", "Raymond",
  "Cynthia", "Mike", "Clayton", "Danny", "Jonathan"];
var hTable = new HashTable();
hTable.buildChains();
for (var i = 0; i < someNames.length; ++i) {
  hTable.put(someNames[i],someNames[i]);
}
hTable.showDistro();
hTable.betterHash("Jennifer");
hTable.get("Jennidfer");
hTable.get("Jennifer");

使用在线HTML/CSS/JavaScript代码运行工具:http://tools.3water.com/code/HtmlJsRun测试上述代码,可得如下运行结果:

JS散列表碰撞处理、开链法、HashTable散列示例

希望本文所述对大家JavaScript程序设计有所帮助。

Javascript 相关文章推荐
语义化 H1 标签
Jan 14 Javascript
ajax 缓存 问题 requestheader
Aug 01 Javascript
深入理解JavaScript系列(6) 强大的原型和原型链
Jan 15 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
Nov 15 Javascript
在Iframe中获取父窗口中表单的值(示例代码)
Nov 22 Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 Javascript
angular5 子组件监听父组件传入值的变化方法
Sep 30 Javascript
JavaScript中工厂函数与构造函数示例详解
May 06 Javascript
Vue.js中该如何自己维护路由跳转记录
May 19 Javascript
基于JavaScript 实现拖放功能
Sep 12 Javascript
vscode 使用Prettier插件格式化配置使用代码详解
Aug 10 Javascript
写一个Vue loading 插件
Nov 09 Javascript
ES6 对象的新功能与解构赋值介绍
Feb 05 #Javascript
Vue从TodoList中学父子组件通信
Feb 05 #Javascript
详解webpack编译速度提升之DllPlugin
Feb 05 #Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 #Javascript
利用Dectorator分模块存储Vuex状态的实现
Feb 05 #Javascript
小程序页面动态配置实现方法
Feb 05 #Javascript
PHP实现基于Redis的MessageQueue队列封装操作示例
Feb 02 #Javascript
You might like
打造计数器DIY三步曲(下)
2006/10/09 PHP
浅析php变量作用域的一些问题
2013/08/08 PHP
跟我学Laravel之快速入门
2014/10/15 PHP
推荐几个开源的微信开发项目
2014/12/28 PHP
JavaScript类和继承 constructor属性
2010/03/04 Javascript
Js放到HTML文件中的哪个位置有什么区别
2013/08/21 Javascript
jQuery实现的多级下拉菜单效果代码
2015/08/24 Javascript
jQuery中bind(),live(),delegate(),on()绑定事件方法实例详解
2016/01/19 Javascript
sea.js常用的api简易文档
2016/11/15 Javascript
详解Vue微信授权登录前后端分离较为优雅的解决方案
2018/06/29 Javascript
微信小程序实现聊天对话(文本、图片)功能
2018/07/06 Javascript
在element-ui的select下拉框加上滚动加载
2019/04/18 Javascript
layui当点击文本框时弹出选择框,显示选择内容的例子
2019/09/02 Javascript
Python解析树及树的遍历
2016/02/03 Python
Python绘制3D图形
2018/05/03 Python
Python实现的根据IP地址计算子网掩码位数功能示例
2018/05/23 Python
Python访问MongoDB,并且转换成Dataframe的方法
2018/10/15 Python
Python docx库用法示例分析
2019/02/16 Python
使用Python做定时任务及时了解互联网动态
2019/05/15 Python
python梯度下降算法的实现
2020/02/24 Python
VScode连接远程服务器上的jupyter notebook的实现
2020/04/23 Python
python绘制趋势图的示例
2020/09/17 Python
通过Python pyecharts输出保存图片代码实例
2020/11/25 Python
LEGO玩具英国官方商店:LEGO Shop GB
2018/03/27 全球购物
.net面试题
2016/09/17 面试题
学校运动会开幕演讲稿
2014/01/04 职场文书
青年文明号复核材料
2014/02/11 职场文书
机械系毕业生求职信
2014/05/28 职场文书
小学学校评估方案
2014/06/08 职场文书
上班时间打瞌睡检讨书
2014/09/26 职场文书
2016年春节慰问信息
2015/03/25 职场文书
Linux安装Nginx步骤详解
2021/03/31 Servers
MySQL sql_mode的使用详解
2021/05/08 MySQL
如何搭建 MySQL 高可用高性能集群
2021/06/21 MySQL
什么是SOLID
2022/03/24 Javascript
Mysql如何查看是否使用到索引
2022/12/24 MySQL