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

 更新时间:2019年02月08日 08:41:38   作者:白杨-M   我要评论

这篇文章主要介绍了JS散列表碰撞处理、开链法、HashTable散列,结合实例形式分析了散列表碰撞处理、开链法、HashTable散列的定义及简单使用操作技巧,需要的朋友可以参考下

本文实例讲述了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.jb51.net/code/HtmlJsRun测试上述代码,可得如下运行结果:

更多关于JavaScript相关内容感兴趣的读者可查看本站专题:《JavaScript数学运算用法总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript数组操作技巧总结》、《JavaScript排序算法总结》、《JavaScript遍历算法与技巧总结》、《JavaScript查找算法技巧总结》及《JavaScript错误与调试技巧总结

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

相关文章

  • JS中script标签defer和async属性的区别详解

    JS中script标签defer和async属性的区别详解

    这篇文章主要介绍了JS中script标签defer和async属性的区别详解的相关资料,需要的朋友可以参考下
    2016-08-08
  • javascript 一个函数对同一元素的多个事件响应

    javascript 一个函数对同一元素的多个事件响应

    具体方法如下该方法实现了对一个按钮的mouseover和click事件的响应
    2009-07-07
  • JavaScript随机生成颜色的方法

    JavaScript随机生成颜色的方法

    这篇文章主要介绍了JavaScript随机生成颜色的方法的相关资料,非常不错,代码简单易懂,具有参考借鉴价值,需要的朋友可以参考下
    2016-10-10
  • JS获取dom 对象 ajax操作 读写cookie函数

    JS获取dom 对象 ajax操作 读写cookie函数

    一些常用的JS (JONEAjax) 获取dom 对象,ajax操作,读写cookie类代码,需要的朋友可以参考下。
    2009-11-11
  • 深入浅析JS中的严格模式

    深入浅析JS中的严格模式

    严格模式就是使JS编码更加规范化的模式,消除Javascript语法的一些不合理、不严谨之处,减少一些怪异行为。下面通过代码相结合的形式给大家介绍js中的严格模式,感兴趣的朋友一起看看吧
    2018-06-06
  • javascript常用对话框小集

    javascript常用对话框小集

    对话框,大家对这个词汇可谓是各有所解,本文有个不错的例子,里面包含了各种常见对话框的实现,感兴趣的朋友可以了解下
    2013-09-09
  • JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))

    JavaScript面向对象知识串结(读JavaScript高级程序设计(第三版))

    最近在看JavaScript高级程序设计(第三版),面向对象一章20多页,来来回回看了三五遍,每次看的收获都不一样
    2012-07-07
  • JavaScript 继承的实现

    JavaScript 继承的实现

    正因为JavaScript本身没有完整的类和继承的实现,并且我们也看到通过手工实现的方式存在很多问题, 因此对于这个富有挑战性的任务网上已经有很多实现了
    2009-07-07
  • javascript动画浅析

    javascript动画浅析

    最近一直在弄手机端的游戏,接触到各种动画。加之对之前的自己那个动画类不满意,就有心想写个新的。然后翻看各种博客,查资料。也学到一些新的东西
    2012-08-08
  • 手挽手带你学React之React-router4.x的使用

    手挽手带你学React之React-router4.x的使用

    这篇文章主要介绍了手挽手带你学React之React-router4.x的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-02-02

最新评论