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. iOS代码签名理解

    前言 做了几年iOS app coder了,对于证书的生成.使用流程烂熟于心,然而对于这套机制的原理却一直不甚理解.近来由于工作需要仔细研究了一下,特将自己的学习经验记录于此,以供大家学习指正. 问题 ...

  2. TP框架常用配置

    <?php// +----------------------------------------------------------------------// | ThinkPHP [ WE ...

  3. 200行代码搞定炸金花游戏(PHP版)

    <?php/* * 游戏名称:炸金花(又名三张牌.扎金花) * 开发时间:2009.1.14 * 编 程:多菜鸟 * 来 源:http://blog.csdn.net/kingerq/archi ...

  4. 接口性能测试--JMeter

    1.JMeter Java Sampler介绍 setupTest做些初始化的工作,每个线程只执行一次 teardownTest做些清理工作,每个线程只执行一次 1.JMeter Java Sampl ...

  5. 关于针对class自定义new操作符失败的函数处理

    #include <iostream> #include <new> using namespace std; class CSaveCurHandler //用于管理new_ ...

  6. Javascript模块化编程(二):AMD规范(转)

    这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块. (接上文) 七.模块的规范 先想一想,为什么模块很重要? 因为有了模块,我们就可以更方便地使用别人的代码,想要 ...

  7. SourceInsight阅读Python---张子芳

    首先从http://www.sourceinsight.com/public/languages/下载Python的配置文件Python.CLF ,然后对SourceInsight作如下配置: (1) ...

  8. js基础练习一之tab选项卡

    最近在学习前端,当然包括js,css,html什么的,在听课时做的一些小练习,记录下来: 实例一: --Tab选项卡-- <script type="text/javascript&q ...

  9. Android 短信广播接收相关问题

    本人是Android新手,最近做了一个关于监听手机短信功能的应用,我在网上看资料了解到广播分为有序广播和无序广播,有序广播:无序广播又称普通广播,其中的利弊我也一时没搞清楚,我用的是有序广播实现的,具 ...

  10. .NET 泛型分析

    .NET 泛型解析 一.问题背景 我们在编程的时候往往因为需要处理不同类型的数据或者对象,重复编写很多类似的代码,造成代码的冗余,代码也显得不那么优雅,泛型的出现,正好是为了解决这个问题,实现继承. ...