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中sort()方法的用法
Nov 04 Javascript
IE JS编程需注意的内存释放问题
Jun 23 Javascript
JS面向对象编程 for Cookie
Sep 19 Javascript
JS去掉第一个字符和最后一个字符的实现代码
Feb 20 Javascript
微信小程序 navigation API实例详解
Oct 02 Javascript
js 文字超出长度用省略号代替,鼠标悬停并以悬浮框显示实例
Dec 06 Javascript
常用JS图片滚动(无缝、平滑、上下左右滚动)代码大全(推荐)
Dec 20 Javascript
jQuery EasyUI ProgressBar进度条组件
Feb 28 Javascript
xmlplus组件设计系列之下拉刷新(PullRefresh)(6)
May 03 Javascript
layui监听select变化,以及设置radio选中的方法
Sep 24 Javascript
ant design vue嵌套表格及表格内部编辑的用法说明
Oct 28 Javascript
vue实现滑动解锁功能
Mar 03 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
一个简单的php路由类
2016/05/29 PHP
PHP分享图片的生成方法
2018/04/25 PHP
php如何实现数据库的备份和恢复
2020/11/30 PHP
Jquery中增加参数与Json转换代码
2009/11/20 Javascript
jquery点击页面任何区域实现鼠标焦点十字效果
2013/06/21 Javascript
jquery中邮箱地址 URL网站地址正则验证实例代码
2013/09/15 Javascript
jquery遍历数组与筛选数组的方法
2013/11/05 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
Bootstrap学习笔记之css样式设计(1)
2016/06/07 Javascript
Node.JS中快速扫描端口并发现局域网内的Web服务器地址(80)
2017/09/18 Javascript
微信小程序实现左右联动的实战记录
2018/07/05 Javascript
微信打开网址添加在浏览器中打开提示的办法
2019/05/20 Javascript
JavaScript实现的弹出遮罩层特效经典示例【基于jQuery】
2019/07/10 jQuery
微信小程序scroll-view锚点链接滚动跳转功能
2019/12/12 Javascript
JS 设计模式之:单例模式定义与实现方法浅析
2020/05/06 Javascript
vant实现购物车功能
2020/06/29 Javascript
vue中解决chrome浏览器自动播放音频和MP3语音打包到线上的实现方法
2020/10/09 Javascript
vue实现下拉菜单树
2020/10/22 Javascript
JavaScript实现复选框全选和取消全选
2020/11/20 Javascript
[06:07]DOTA2-DPC中国联赛3月5日Recap集锦
2021/03/11 DOTA
python爬虫使用cookie登录详解
2017/12/27 Python
Python开发最牛逼的IDE——pycharm
2018/08/01 Python
如何使用django的MTV开发模式返回一个网页
2019/07/22 Python
Python日志logging模块功能与用法详解
2020/04/09 Python
python 生成器需注意的小问题
2020/09/29 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
C#如何允许一个类被继承但是避免这个类的方法被重载?
2015/02/24 面试题
财务管理个人自荐书范文
2013/11/24 职场文书
三年级科学教学反思
2014/01/29 职场文书
机械制造专业毕业生求职信
2014/03/02 职场文书
中学生寄语大全
2014/04/03 职场文书
大学生联谊活动策划书(光棍节)
2014/10/10 职场文书
员工自我评价范文
2015/03/11 职场文书
2015年工商所工作总结
2015/05/21 职场文书
党校培训学习心得体会
2016/01/06 职场文书
Go缓冲channel和非缓冲channel的区别说明
2021/04/25 Golang