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 相关文章推荐
显示js对象所有属性和方法的函数
Oct 16 Javascript
使用jQuery动态加载js脚本文件的方法
Apr 03 Javascript
Extjs Label的 fieldLabel和html属性值对齐的方法
Jun 15 Javascript
浅析Bootstrip的select控件绑定数据的问题
May 10 Javascript
JavaScript的ExtJS框架中数面板TreePanel的使用实例解析
May 21 Javascript
使用开源工具制作网页验证码的方法
Oct 17 Javascript
JS滚动到指定位置导航栏固定顶部
Jul 03 Javascript
Bootstrap Tooltip显示换行和左对齐的解决方案
Oct 11 Javascript
vue配置接口域名方法总结
May 12 Javascript
element-ui 实现响应式导航栏的示例代码
May 08 Javascript
vue从后台渲染文章列表以及根据id跳转文章详情详解
Dec 14 Vue.js
如何理解Vue简单状态管理之store模式
May 15 Vue.js
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
DISCUZ 分页代码
2007/01/02 PHP
PHP页面间传递参数实例代码
2008/06/05 PHP
php中in_array函数用法探究
2014/11/25 PHP
tagName的使用,留一笔
2006/06/26 Javascript
用jscript实现新建word文档
2007/06/15 Javascript
javascript中的几个运算符
2007/06/29 Javascript
JavaScript函数、方法、对象代码
2008/10/29 Javascript
JavaScript Sort 表格排序
2009/10/31 Javascript
JQuery与iframe交互实现代码
2009/12/24 Javascript
提升你网站水平的jQuery插件集合推荐
2011/04/19 Javascript
小试JQuery的AutoComplete插件
2011/05/04 Javascript
javascript:;与javascript:void(0)使用介绍
2013/06/05 Javascript
用jQuery实现一些导航条切换,显示隐藏的实例代码
2013/06/08 Javascript
Jquery 模板数据绑定插件的使用方法详解
2013/07/08 Javascript
javascript写的一个模拟阅读小说的程序
2014/04/04 Javascript
JavaScript前端图片加载管理器imagepool使用详解
2014/12/29 Javascript
Web前端开发之水印、图片验证码
2016/11/27 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
AngularJS使用ocLazyLoad实现js延迟加载
2017/07/05 Javascript
vue-cli的eslint相关用法
2017/09/29 Javascript
详解简单易懂的 ES6 Iterators 指南和示例
2019/09/24 Javascript
JS深入学习之数组对象排序操作示例
2020/05/01 Javascript
[02:33]2014DOTA2 TI每日综述 LGD涉险晋级DK闯入胜者组
2014/07/14 DOTA
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
python中sympy库求常微分方程的用法
2020/04/28 Python
Python3 Tensorlfow:增加或者减小矩阵维度的实现
2020/05/22 Python
亚马逊中国官方网站:amazon.cn
2017/05/25 全球购物
反腐倡廉警示教育活动总结
2014/05/05 职场文书
班主任工作经验交流材料
2014/05/13 职场文书
财务助理岗位职责范本
2014/10/09 职场文书
办公室主任个人对照检查材料思想汇报
2014/10/11 职场文书
公积金接收函格式
2015/01/30 职场文书
经营场所使用证明
2015/06/19 职场文书
浅谈Python numpy创建空数组的问题
2021/05/25 Python
MYSQL(电话号码,身份证)数据脱敏的实现
2021/05/28 MySQL
vue实现登陆页面开发实践
2022/05/30 Vue.js