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 相关文章推荐
『jQuery』取指定url格式及分割函数应用
Apr 22 Javascript
java、javascript实现附件下载示例
Aug 14 Javascript
JavaScript中的闭包介绍
Mar 15 Javascript
jquery特效 点击展示与隐藏全文
Dec 09 Javascript
基于Bootstrap使用jQuery实现输入框组input-group的添加与删除
May 03 Javascript
微信支付 JS API支付接口详解
Jul 11 Javascript
JavaScript使用键盘输入控制实现数字验证功能
Aug 19 Javascript
JS针对Array的各种操作汇总
Nov 29 Javascript
JS实现二叉查找树的建立以及一些遍历方法实现
Apr 17 Javascript
妙用Angularjs实现表格按指定列排序
Jun 23 Javascript
React Native基础入门之调试React Native应用的一小步
Jul 02 Javascript
关于javascript中的promise的用法和注意事项(推荐)
Jan 15 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
使用PHP数组实现无限分类,不使用数据库,不使用递归.
2006/12/09 PHP
PHP 程序授权验证开发思路
2009/07/09 PHP
DISCUZ在win2003环境下 Unable to access ./include/common.inc.php in... 的问题终极解决方案
2011/11/21 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
PHP二维数组矩形转置实例
2016/07/20 PHP
php类的自动加载操作实例详解
2016/09/28 PHP
PHP利用正则表达式将相对路径转成绝对路径的方法示例
2017/02/28 PHP
php统计数组不同元素的个数的实例方法
2019/09/26 PHP
checkbox全选/取消全选以及checkbox遍历jQuery实现代码
2009/12/02 Javascript
js 获取服务器控件值的代码
2010/03/05 Javascript
extjs grid设置某列背景颜色和字体颜色的实现方法
2010/09/06 Javascript
js中获取事件对象的方法小结
2011/03/13 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
jquery实现按Enter键触发事件示例
2013/09/10 Javascript
JQuery获取或设置ckeditor的数据(示例代码)
2013/11/15 Javascript
原生javascript获取元素样式
2014/12/31 Javascript
jquery+html5制作超酷的圆盘时钟表
2015/04/14 Javascript
Java中Timer的用法详解
2015/10/21 Javascript
AngularJS控制器controller正确的通信的方法
2016/01/25 Javascript
微信小程序 WXML、WXSS 和JS介绍及详解
2016/10/08 Javascript
微信小程序开发的四十个技术窍门总结(推荐)
2017/01/23 Javascript
Angular2 路由问题修复详解
2017/03/01 Javascript
JS处理数据四舍五入(tofixed与round的区别详解)
2017/10/26 Javascript
详解easyui 切换主题皮肤
2019/04/04 Javascript
vue 中固定导航栏的实例代码
2019/11/01 Javascript
[58:54]EG vs RNG 2019国际邀请赛小组赛 BO2 第一场 8.16
2019/08/18 DOTA
[01:11:21]DOTA2-DPC中国联赛 正赛 Phoenix vs CDEC BO3 第三场 3月7日
2021/03/11 DOTA
详解Python 2.6 升级至 Python 2.7 的实践心得
2017/04/27 Python
python模拟表单提交登录图书馆
2018/04/27 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
python实现向微信用户发送每日一句 python实现微信聊天机器人
2019/03/27 Python
阿迪达斯中国官网:Adidas中国
2020/12/14 全球购物
2014年最新版离婚协议书范本
2014/11/25 职场文书
解决Pytorch中关于model.eval的问题
2021/05/22 Python
关于Numpy之repeat、tile的用法总结
2021/06/02 Python
浅谈Python3中datetime不同时区转换介绍与踩坑
2021/08/02 Python