前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据结构于JS也可以成为CP(七)散列

数据结构于JS也可以成为CP(七)散列

作者头像
萌兔IT
发布2019-07-26 14:05:46
5340
发布2019-07-26 14:05:46
举报
文章被收录于专栏:萌兔it萌兔it

Hello小伙伴们大家好~~今天带来的是散列,这个其实是一个很重要然而很多人不是很理解的技术。散列是什么呢,是一种数据存储技术,能够达到经过散列后的数据可以快速地插入或取用,这种结构就是散列表。

HashTable的实现

在此处我们还是基于数组来实现,使用散列表存储数据时,通过一个散列函数将键映射为一个数字,每个键值映射为一个唯一的数组索引。还是原来的老步骤,一个散列表会需要什么呢?计算散列值、向散列中插入数据、从散列中读取数据,并显示散列表中数据分布的方法。

代码语言:javascript
复制
function HashTable() {
  this.table = new Array(137);
  this.simpleHash = simpleHash;
  this.showDistro = showDistro;
  this.put = put;
  this.get = get;
}
// 散列函数的选择依赖于键值的数据类型。如果键是整型,最简单的散列函数就是以数组的长度对键取余
// 如果键是随机的整数,则散列函数应该更均匀地分布这些键。这种散列方式称为除留余数法
function simpleHash(data) {
  var total = 0;
  for (var i = 0; i < data.length; ++i) {
     total += data.charCodeAt(i);
  }
  return total % this.table.length;
}
function get(key) {
  return this.table[this.betterHash(key)];
}
// 用来将数据存入散列表
function put(data) {
  var pos = this.simpleHash(data);
  this.table[pos] = data;
}
// 用来显示散列表中的数据
function showDistro() {
  var n = 0;
  for (var i = 0; i < this.table.length; ++i) { 
    if (this.table[i] != undefined) {
      print(i + ": " + this.table[i]);
    }
  } 
}

Tips:将两个键映射成为同一个值的可能性还是存在的,这叫做碰撞,当碰撞产生时,还是要解决的。那么我们要怎么解决呢?这里我们采用一个较小的质数来计算散列。

代码语言:javascript
复制
function betterHash(string, arr) {
  const H = 37;
  var total = 0;
  for (var i = 0; i < string.length; ++i) {
     total += H * total + string.charCodeAt(i);
  }
  total = total % arr.length;
  return parseInt(total);
}

HashTable碰撞的处理

1)开链法:开链法是指实现散列表的底层数组中,每个数组 元素又是一个新的数据结构,比如另一个数组,这样就能存储多个键了。使用这种技术,即使两个键散列后的值相同,依然被保存在同样的位置,只不过它们在第二个数组中的位置不一样罢了。

2)线性探测法:线性探测法隶属于一种更一般化的散列技术:开放 寻址散列。当发生碰撞时,线性探测法检查散列表中的下一个位置是否为空。如果为空,就将数据存入该位置;如果不为空,则继续检查下一个位置,直到找到一个空的位置为止

今天的分享就到这里啦,喜欢兔妞的文章就请在看+关注吧,多多转发也是极好的,能够在后台告诉兔妞哪里需要改进就更好啦~~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 萌兔it 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档