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 相关文章推荐
Aptana调试javascript图解教程
Nov 30 Javascript
zeroclipboard复制到剪切板的flash
Aug 04 Javascript
jquery.combobox中文api和例子,修复了上面的小bug
Mar 28 Javascript
Js数组的操作push,pop,shift,unshift等方法详细介绍
Dec 28 Javascript
点击按钮自动加关注的代码(sina微博/QQ空间/人人网/腾讯微博)
Jan 02 Javascript
js取整数、取余数的方法
May 11 Javascript
详解jQuery移动页面开发中的ui-grid网格布局使用
Dec 03 Javascript
JS实现的在线调色板实例(附demo源码下载)
Mar 01 Javascript
jQuery简单自定义图片轮播插件及用法示例
Nov 21 Javascript
Canvas实现放射线动画效果
Feb 15 Javascript
JavaScript 监听组合按键思路及代码实现
Jul 28 Javascript
一篇文章带你搞懂Vue虚拟Dom与diff算法
Aug 25 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/03/13 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
thinkPHP多语言切换设置方法详解
2016/11/11 PHP
基于jQuery的固定表格头部的代码(IE6,7,8测试通过)
2010/05/18 Javascript
Jquery 过滤器(first,last,not,even,odd)的使用
2014/01/22 Javascript
JS动态增加删除UL节点LI及相关内容示例
2014/05/21 Javascript
了不起的node.js读书笔记之node.js中的特性
2014/12/22 Javascript
jQuery插件zepto.js简单实现tab切换
2015/06/16 Javascript
javascript瀑布流布局实现方法详解
2016/02/17 Javascript
JS获取屏幕高度的简单实现代码
2016/05/24 Javascript
javascript浏览器用户代理检测脚本实现方法
2017/10/27 Javascript
Spring boot 和Vue开发中CORS跨域问题解决
2018/09/05 Javascript
在vue项目中引入vue-beauty操作方法
2019/02/11 Javascript
从Node.js事件触发器到Vue自定义事件的深入讲解
2020/06/26 Javascript
python刷投票的脚本实现代码
2014/11/08 Python
详解Python中的join()函数的用法
2015/04/07 Python
python简单判断序列是否为空的方法
2015/06/30 Python
简介Python的collections模块中defaultdict类型的用法
2016/07/07 Python
实现python版本的按任意键继续/退出
2016/09/26 Python
将Pytorch模型从CPU转换成GPU的实现方法
2019/08/19 Python
django 简单实现登录验证给你
2019/11/06 Python
python安装dlib库报错问题及解决方法
2020/03/16 Python
Python开发企业微信机器人每天定时发消息实例
2020/03/17 Python
微信小程序之html5 canvas绘图并保存到系统相册
2019/06/20 HTML / CSS
通信工程专业毕业生推荐信
2013/12/25 职场文书
打造完美自荐信
2014/01/24 职场文书
清明节扫墓活动方案
2014/03/02 职场文书
培训班开班仪式主持词
2014/03/28 职场文书
建筑安全标语
2014/06/07 职场文书
授权委托书范文
2014/07/31 职场文书
中学生爱国演讲稿
2014/09/05 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
督导岗位职责范本
2015/04/10 职场文书
2015年母亲节活动策划方案
2015/05/04 职场文书
《祁黄羊》教学反思
2016/02/20 职场文书
2019年特色火锅店的创业计划书模板
2019/08/28 职场文书