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. ibatis输入多个参数

    ibatis输入多个参数     在ibatis中,会发现其输入参数只能有一个,于是当出现需要进行多个输入参数的时候,就要想点办法了,我看到的有以下两种比较好的方法能够解决这个问题1) 用String ...

  2. C#利用AxImp工具在WPF中使用OCX控件

    一.注册OCX并利用工具生成dll @echo off color a ::Failed REGSVR32 /S /I "MSCOMCTL.OCX" if exist %windi ...

  3. jquery note--czx

    -------------------------------------------------------+++------------------------------------------ ...

  4. sublime text3 前端编译神器,浏览器实时显示

    前端编译器有很多,Dreamweaver,sublime text ,webstorm,但在使用之后感觉sublime text3就是前端的编译神器 首先sublime text3最好使用英文原版,虽 ...

  5. 随手编程---快速排序(QuickSort)-Java实现

    背景 快速排序,是在上世纪60年代,由美国人东尼·霍尔提出的一种排序方法.这种排序方式,在当时已经是非常快的一种排序了.因此在命名上,才将之称为"快速排序".这个算法是二十世纪的七 ...

  6. MySQL的create table as 与 like区别

    对于MySQL的复制相同表结构方法,有create table as 和create table like 两种,区别是什么呢? ? 1 create table t2 as select * fro ...

  7. Spring学习笔记之四----基于Annotation的Spring AOP编程

    你能使用@Aspect annotation将某个Java类标注为Aspect,这个Aspect类里的所有公有方法都可以成为一个Advice,Spring提供了5个Annotation去将某个方法标注 ...

  8. JavaScript随笔目录

    DOM DOM节点 浏览器环境 遍历节点 DOM的基本属性 Attribute和自定义Property 在DOM中搜索元素 对文档进行操作

  9. DOM的基本属性

    结构和内容属性1.1 nodeType1.2 nodeName, tagName1.3 innerHTML1.4 innerHTML pitFalls1.5 nodeValue 总结DOM节点是一个对 ...

  10. MVC Core

    .NET Core 1.1 发布 文档下载资源汇总 https://www.microsoft.com/net/core#windowsvs2015 https://docs.microsoft.co ...