JavaScript中实现键值对应的字典与哈希表结构的示例


Posted in Javascript onJune 12, 2016

字典(Dictionary)的javascript实现
编程思路:

  • 使用了裸对象datastore来进行元素存储;
  • 实现了两种得到字典长度的方法,一种为变量跟踪,一种为实时计算。

代码:

function(){
  "use strict";

  function Dictionary(){
    this._size = 0;
    this.datastore = Object.create(null);
  }

  Dictionary.prototype.isEmpty = function(){
    return this._size === 0;
  };

  Dictionary.prototype.size = function(){
    return this._size;
  };

  Dictionary.prototype.clear = function(){
    for(var key in this.datastore){
      delete this.datastore[key];
    }
    this._size = 0;
  };

  Dictionary.prototype.add = function(key, value){
    this.datastore[key] = value;
    this._size++;
  };

  Dictionary.prototype.find = function(key){
    return this.datastore[key];
  };

  Dictionary.prototype.count = function(){
    var n = 0;
    for(var key in this.datastore){
      n++;
    }
    return n;
  };

  Dictionary.prototype.remove = function(key){
    delete this.datastore[key];
    this._size--;
  };

  Dictionary.prototype.showAll = function(){
    for(var key in this.datastore){
      console.log(key + "->" + this.datastore[key]);
    }
  };

  module.exports = Dictionary;
})();

散列(hashtable)的javascript实现
编程思路:

  • 以链表来解决实现开链法来解决碰撞,并使用自己写的单链表库LinkedList(详见3water之前的https://3water.com/article/86394.htm);
  • 用裸对象来存储;
  • ValuePair简单封装键值对;
  • 以模块模式组织代码;

代码:

valuePair.js

(function(){
  "use strict";

  function ValuePair(key, value){
    this.key = key;
    this.value = value;
  }

  ValuePair.prototype.toString = function(){
    return "[" + this.key + ":" + this.value + "]";
  };

  module.exports = ValuePair;

})();

hashtable.js

(function(){

  "use strict";

  var ValuePair = require("./lib/ValuePair");
  var LinkedList = require("./LinkedList");

  function Hashtable(){
    this.table = Object.create(null);
    this._size = 0;
  }

  Hashtable.prototype.isEmpty = function(){
    return this._size === 0;
  };

  Hashtable.prototype.size = function(){
    return this._size;
  };

  Hashtable.prototype.remove = function(key){
    var index = hashCode(key);

    if(this.table[index] == null){
      return false;
    }else{
      var currNode = this.table[index].getHead();
      while(currNode.next){
        currNode = currNode.next;
        if(currNode.element.key == key){
          this.table[index].remove(currNode.element);
          this._size--;
          return true;
        }
      }
      return false;
    }
  };

  Hashtable.prototype.get = function(key){
    var index = hashCode(key);

    if(this.table[index] == null){
      return null;
    }else{
      var currNode = this.table[index].getHead();
      while(currNode.next){
        currNode = currNode.next;
        if(currNode.element.key == key){
          return currNode.element;
        }
      }
      return null;
    }
  };

  Hashtable.prototype.put = function(key, value){
    var index = hashCode(key);

    if(this.table[index] == null){
      this.table[index] = new LinkedList();
    }

    var currNode = this.table[index].getHead();
    while(currNode.next){            //key若已经存在,修改value值为新值
      currNode = currNode.next;
      if(currNode.element.key == key){
        currNode.element.value = value;
        break;
      }
    }

    if(currNode.next == null && currNode.element.value != value){         //key不存在,加入新值.注意边界值
      this.table[index].add(new ValuePair(key,value));
      this._size++;
    }

    return this;
  };

  Hashtable.prototype.display = function(){
    for(var key in this.table){
      var currNode = this.table[key].getHead();
      while(currNode.next){
        currNode = currNode.next;
        console.log(currNode.element.toString());
      }
    }
  };


  /*********************** Utility Functions ********************************/

  function hashCode(key) {        //霍纳算法,质数取37
    var hashValue = 6011;
    for (var i = 0; i < key.length; i++) {
      hashValue = hashValue * 37 + key.charCodeAt(i);
    }
    return hashValue % 1019;
  }

  module.exports = Hashtable;

})();
Javascript 相关文章推荐
JavaScript中令你抓狂的魔术变量
Nov 30 Javascript
jquery 常用操作整理 基础入门篇
Oct 14 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
Oct 11 Javascript
jQuery图片播放8款精美插件分享
Feb 17 Javascript
JavaScript实现从数组中选出和等于固定值的n个数
Sep 03 Javascript
javascript实现字符串反转的方法
Feb 05 Javascript
jQuery搜索子元素的方法
Feb 10 Javascript
jQuery使用fadein方法实现渐出效果实例
Mar 27 Javascript
JS获取html元素的标记名实现方法
Oct 08 Javascript
jQuery动态添加与删除tr行实例代码
Oct 18 Javascript
vue自定义表单生成器form-create使用详解
Jul 19 Javascript
微信小程序之滑动页面隐藏和显示组件功能的实现代码
Jun 19 Javascript
JavaScript中输出信息的方法(信息确认框-提示输入框-文档流输出)
Jun 12 #Javascript
JS中常用的输出方式(五种)
Jun 12 #Javascript
Node.js环境下JavaScript实现单链表与双链表结构
Jun 12 #Javascript
JavaScript实现阿拉伯数字和中文数字互相转换
Jun 12 #Javascript
深入解析JavaScript中的arguments对象
Jun 12 #Javascript
基于css3新属性transform及原生js实现鼠标拖动3d立方体旋转
Jun 12 #Javascript
JS弹出窗口插件zDialog简单用法示例
Jun 12 #Javascript
You might like
浅析php原型模式
2014/11/25 PHP
PHP CURL使用详解
2019/03/21 PHP
一个加密JavaScript的开源工具PACKER2.0.2
2006/11/04 Javascript
Web开发者必备的12款超赞jQuery插件
2010/12/03 Javascript
深入理解JavaScript系列(8) S.O.L.I.D五大原则之里氏替换原则LSP
2012/01/15 Javascript
捕获浏览器关闭、刷新事件不同情况下的处理方法
2013/06/02 Javascript
js判断选择时间不能小于当前时间的示例代码
2013/09/24 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
jQuery获取元素父节点的方法
2016/06/21 Javascript
JavaScript中校验银行卡号的实现代码
2016/12/19 Javascript
vue实现导航栏效果(选中状态刷新不消失)
2017/12/13 Javascript
react+redux的升级版todoList的实现
2017/12/18 Javascript
JS动态显示倒计时效果
2019/12/12 Javascript
[04:54]DOTA2-DPC中国联赛1月31日Recap集锦
2021/03/11 DOTA
在Windows系统上搭建Nginx+Python+MySQL环境的教程
2015/12/25 Python
利用python获取当前日期前后N天或N月日期的方法示例
2017/07/30 Python
python绘制铅球的运行轨迹代码分享
2017/11/14 Python
Python3实现购物车功能
2018/04/18 Python
浅谈pycharm下找不到sqlalchemy的问题
2018/12/03 Python
Python编写带选项的命令行程序方法
2019/08/13 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
详解python定时简单爬取网页新闻存入数据库并发送邮件
2020/11/27 Python
python+selenium+chrome实现淘宝购物车秒杀自动结算
2021/01/07 Python
Python tkinter之ComboBox(下拉框)的使用简介
2021/02/05 Python
python 制作本地应用搜索工具
2021/02/27 Python
使用HTML5原生对话框元素并轻松创建模态框组件
2019/03/06 HTML / CSS
使用C#编写创建一个线程的代码
2013/01/22 面试题
经济信息系毕业生自荐信范文
2014/03/15 职场文书
大班亲子运动会方案
2014/06/10 职场文书
离婚起诉状范本
2015/05/19 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
Windows Server 2008 修改远程登录端口以及配置防火墙
2022/04/28 Servers
在windows server 2012 r2中安装mysql的详细步骤
2022/07/23 Servers