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 表单规则集合对象
Jul 21 Javascript
jquery中获得元素尺寸和坐标的方法整理
May 18 Javascript
JavaScript中的方法调用详细介绍
Dec 30 Javascript
jQuery插件实现控制网页元素动态居中显示
Mar 24 Javascript
JS获取文件大小方法小结
Dec 08 Javascript
仅9张思维导图帮你轻松学习Javascript 就这么简单
Jun 01 Javascript
超级简易的JS计算器实例讲解(实现加减乘除)
Aug 08 Javascript
浅谈Vue下使用百度地图的简易方法
Mar 23 Javascript
JavaScript EventEmitter 背后的秘密 完整版
Mar 29 Javascript
vue动态路由配置及路由传参的方式
May 23 Javascript
vue中的自定义分页插件组件的示例
Aug 18 Javascript
layui table单元格事件修改值的方法
Sep 24 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 magic_quotes_gpc的使用方法详解
2013/06/24 PHP
php实现的mysqldb读写分离操作类示例
2017/02/07 PHP
PHP PDOStatement::bindParam讲解
2019/01/30 PHP
ajax无刷新动态调用股票信息(改良版)
2008/11/01 Javascript
JQuery 网站换肤功能实现代码
2009/11/02 Javascript
HTML5附件拖拽上传drop &amp; google.gears实现代码
2011/04/28 Javascript
LABjs、RequireJS、SeaJS的区别
2014/03/04 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
JS实现简单的键盘打字的效果
2015/04/24 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
js生成随机数(指定范围)的实例代码
2016/07/10 Javascript
基于javascript实现数字英文验证码
2017/01/25 Javascript
基于vue实现多引擎搜索及关键字提示
2017/03/16 Javascript
node.js 发布订阅模式的实例
2017/09/10 Javascript
angular指令笔记ng-options的使用方法
2017/09/18 Javascript
swiper动态改变滑动内容的实现方法
2018/01/17 Javascript
vue2.0 资源文件assets和static的区别详解
2018/04/08 Javascript
Vue.js实现表格渲染的方法
2018/09/07 Javascript
微信小程序保存多张图片的实现方法
2019/03/05 Javascript
layui固定下拉框的显示条数(有滚动条)的方法
2019/09/10 Javascript
Pandas之drop_duplicates:去除重复项方法
2018/04/18 Python
使用python实现mqtt的发布和订阅
2019/05/05 Python
Python统计时间内的并发数代码实例
2019/12/28 Python
python 装饰器的基本使用
2021/01/13 Python
整理HTML5的一些新特性与Canvas的常用属性
2016/01/29 HTML / CSS
HTML文本属性&amp;颜色控制属性的实现
2019/12/17 HTML / CSS
中国京东和泰国中央集团合资的网站:JD CENTRAL
2020/08/22 全球购物
继承公证书样本
2014/04/04 职场文书
党员对照检查材料思想汇报(党的群众路线)
2014/09/24 职场文书
单位接收函范文
2015/01/30 职场文书
2015年社区计生工作总结
2015/04/21 职场文书
2015年公务员转正工作总结
2015/04/24 职场文书
介绍信应该怎么开?
2019/04/03 职场文书
MySQL索引是啥?不懂就问
2021/07/21 MySQL
《进击的巨人》新联动CM 兵长强势出击兽巨人
2022/04/05 日漫
postgresql之greenplum字符串去重拼接方式
2023/05/08 PostgreSQL