function Dictionary() {
var items={};
this.set=function (key,value) {
items[key]=value;
};
this.remove=function (key) {
if(this.has(key)){
delete items[key];
return true;
}
return false;
};
this.has=function (key) {
return key in items;
};
this.get=function(key){
return this.has(key)?items[key]:undefined;
};
this.clear=function(){ };
this.size=function(){ };
this.keys=function () { };
this.values=function () {
var values=[];
for (var k in items) {
if (this.has(k)) {
values.push(items[k]);
}
}
return values;
};
this.getItems=function(){
return items;
}; }
// 解决散列值重复的三种方法:分离链接、线性探查、双散列法。
// 1、分离链接法为散列表的每一个位置创建一个链表并将元素存储在里面
//分离链接的哈希表
//被注释的为普通的哈希表
function HashTable() {
var table=[];
var loseHashCode=function(key){
var hash=0;
for(var i=0;i<key.length;i++){
hash+=key.charCodeAt(i);
}
return hash%37;
};
var ValuePair=function (key,value) {
this.key=key;
this.value=value;
this.toString=function () {
return "["+this.key+"-"+this.value+"]";
}
}
this.put=function(key,value){
var position=loseHashCode(key);
// console.log(position,"-",key);
// table[position]=value;
if(table[position]==undefined){
//每一个位置都是一个链表
table[position]=new LinkedList();
}
table[position].append(new ValuePair(key,value));
};
this.remove=function(key){
//table[loseHashCode(key)]=undefined;
var position=loseHashCode(key);
if(table[position]!==undefined){
var current=table[position].getHead();
while(current.next){
if(current.element.key===key){
table[position].remove(current.element);
if(table[position].isEmpty()){
table[position]=undefined;
}
return true;
}
current=current.next;
}
if(current.element.key===key){
table[position].remove(element);
if(table[position].isEmpty()){
table[position]=undefined;
}
return true;
}
}
return false;
};
this.get=function(key){
//return table[loseHashCode(key)];
var position=loseHashCode(key);
if (table[position]!==undefined) {
var current=table[position].getHead();
while (current.next) {
if (current.element.key===key) {
return current.element.value;
}
current=current.next;
}
if (current.element.key===key) {
return current.element.value;
}
}
return undefined;
};
this.print=function(){
for (var i = 0; i < table.length; i++) {
if(table[i]!=undefined){
console.log(i,":",table[i]);
}
}
};
}
//2、线性探查
// 当想向表中某个位置加入一个新的元素时,如果索引为index的位置已经被占据了,
// 就尝试index+1的位置。如果index+1的位置也被占据了,就尝试index+2的位置
// 以此类推
function LDHashTable() {
// ... 省略重复的代码
this.put=function (key,value) {
if(table[position]==undefined){
table[position]=new KeyValuePair(key,value);
}else{
var index=++position;
while (table[index]!=undefined) {
index++
}
table[position]=new KeyValuePair(key,value);
}
}
this.get=function (key) {
var position=loseHashCode(key);
if(table[position]!==undefined){
if(table[position].key===key){
return table[position].value;
}else{
var index=++index;
// 原书中是 table[index]===undefined || table[index].key!==key
while (table[index]!==undefined && table[index].key!==key) {
index++;
}
if(table[index] && table[index].key===key){
return table[index].value;
}
}
}
}
} // 更好的散列函数
var djb2HashCode=function (key) {
var hash=5381;//一个质数,大多数情况下为5381
for (var i = 0; i < key.length; i++) {
hash=hash*33+key.charCodeAt(i);
}
return hash%1013;//1013为比散列表大小要大的一个质数
}

  

Javascript中的字典和散列的更多相关文章

  1. JavaScript中创建字典对象(dictionary)实例

    这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...

  2. Python中的hashable(散列)

    Python文档中的解释: 一个对象是可散列的,那么在它的生命周期中它的hash 值是不变的. 可散列的对象需要2个方法:__hash__()方法和__eq__()方法.两个可散列的对象相等,那么它们 ...

  3. javascript中的字典

    1.概念 字典是一种以键值对的形式存储的数据结构,就系那个电话本中的名字和电话号码一样.要找到一个电话首先要找到名字,再根据名字找到电话号码.这里的键就是指用来查找的东西,值就是查找得到的结果. Ja ...

  4. JavaScript中常见数据结构

    数据结构 栈:一种遵从先进后出 (LIFO) 原则的有序集合:新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端为栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 队列:与上相反,一种遵循先进 ...

  5. JavaScript数据结构——集合、字典和散列表

    集合.字典和散列表都可以存储不重复的值. 在集合中,我们感兴趣的是每个值本身,并把它当作主要元素.在字典和散列表中,我们用 [键,值] 的形式来存储数据. 集合(Set 类):[值,值]对,是一组由无 ...

  6. JavaScript数据结构——字典和散列表的实现

    在前一篇文章中,我们介绍了如何在JavaScript中实现集合.字典和集合的主要区别就在于,集合中数据是以[值,值]的形式保存的,我们只关心值本身:而在字典和散列表中数据是以[键,值]的形式保存的,键 ...

  7. DotNet加密方式解析--散列加密

    没时间扯淡类,赶紧上车吧. 在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念, ...

  8. 【Java集合学习】HashMap源码之“拉链法”散列冲突的解决

    1.HashMap的概念 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io ...

  9. java 散列

    原文:https://www.cnblogs.com/younghao/p/8333795.html 为什么要设计散列这种数据结构呢?在现实世界中,实体之间可能存在着映射关系(key-value),比 ...

随机推荐

  1. git 远程版本库,github提供服务原理,git自动更新发送邮件

    1.安装好Linux,安装好Git(192.168.1.239) 2.创建一个用户zph(让此用户提供git on server),密码设置为12345678 # useradd zph # pass ...

  2. Android tween 动画 XML 梳理

    前言: Tween动画是展现出旋转.渐变.移动.缩放的这么一种转换过程,即补间动画.Tween动画有两种定义方式:XML形式,编码形式.这次主要来梳理XML的方式配置动画 (1)XML定义动画,按照动 ...

  3. 简单粗暴地理解 JavaScript 原型链 (一个充满歪门邪理的理解方法,有助于新手哦!)

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

  4. getPhysicalNumberOfCells 与 getLastCellNum的区别

    用org.apache.poi的包做excel导入,无意间发明若是excel文件中有空列,空列后面的数据全部读不到. 查来查去本来是HSSFRow供给两个办法:getPhysicalNumberOfC ...

  5. paper 125:NSCT——Nonsubsampled contourlet 变换程序(尺度不变性问题研究)

    原文地址:NSCT——Nonsubsampled contourlet 变换程序开发教程1作者:向望大海的鱼 08年,被老板逼得走投无路,xx所得项目看来是实在躲不过去,只好硬着头皮上.开发一款图像处 ...

  6. Node.js Express 框架

    Node.js Express 框架 Express 简介 Express 是一个简洁而灵活的 node.js Web应用框架, 提供了一系列强大特性帮助你创建各种 Web 应用,和丰富的 HTTP ...

  7. 【Arduino】旋转编码器的Arduino使用方法

    以前用CRT显示器的时候,调整显示器的时候用一个圆盘转动和点击的方法就可以实现选择菜单和修改设置项的值,比多个按钮的方式方便很多. 鼠标滚轮也是这种操作方法,旋转+点击,只是方向不同.最近在网上买了旋 ...

  8. 用实例讲解RSA加密算法(精)

    RSA是第一个比较完善的公开密钥算法,它既能用于加密,也能用于数字签名.RSA以它的三个发明者Ron Rivest, Adi Shamir, Leonard Adleman的名字首字母命名,这个算法经 ...

  9. OC-03类的声明和实现

    例子 //类名:Car//属性:轮胎个数.时速//行为:跑 #import<Foundation/Foundation.h >//完整的写一个函数:函数的声明和定义(实现)//完整的写一个 ...

  10. Qt QObject

    [1]Qt的QObject 1.测试代码如下: #include<QApplication> #include<QPushButton> #include<QDebug& ...