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 相关文章推荐
getElementsByTagName vs selectNodes效率 及兼容的selectNodes实现
Feb 26 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
Dec 12 Javascript
下拉列表选择项的选中在不同浏览器中的兼容性问题探讨
Sep 18 Javascript
Javascript简单实现可拖动的div
Oct 22 Javascript
IE8的JavaScript点击事件(onclick)不兼容的解决方法
Nov 22 Javascript
javascript获取URL参数与参数值的示例代码
Dec 20 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
Feb 04 Javascript
初识Node.js
Mar 20 Javascript
js实现点击向下展开的下拉菜单效果代码
Sep 01 Javascript
bootstrap flask登录页面编写实例
Nov 01 Javascript
iview通过Dropdown(下拉菜单)实现的右键菜单
Oct 26 Javascript
使用 JavaScript 创建并下载文件(模拟点击)
Oct 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和ACCESS写聊天室(七)
2006/10/09 PHP
php a simple smtp class
2007/11/26 PHP
php 上传文件类型判断函数(避免上传漏洞 )
2010/06/08 PHP
js代码实现微博导航栏
2015/07/30 PHP
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
2011/05/09 Javascript
js中for in的用法示例解析
2013/12/25 Javascript
使用jQuery获取data-的自定义属性
2015/11/10 Javascript
浅谈JavaScript的内置对象和浏览器对象
2016/06/03 Javascript
简单谈谈Javascript函数中的arguments
2017/02/09 Javascript
jQuery文字轮播特效
2017/02/12 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
鼠标经过出现气泡框的简单实例
2017/03/17 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
js仿微信抢红包功能
2020/09/25 Javascript
详解一个基于套接字实现长连接的express
2019/03/28 Javascript
详解vue 动态加载并注册组件且通过 render动态创建该组件
2019/05/30 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
小程序实现录音上传功能
2019/11/22 Javascript
JavaScript实现电灯开关小案例
2020/03/30 Javascript
[03:55]显微镜下的DOTA2特别篇——430灰烬之灵神级操作
2014/06/24 DOTA
详解python中的线程
2018/02/10 Python
详谈pandas中agg函数和apply函数的区别
2018/04/20 Python
详解Python3中的迭代器和生成器及其区别
2018/10/09 Python
python os.listdir按文件存取时间顺序列出目录的实例
2018/10/21 Python
PyTorch搭建多项式回归模型(三)
2019/05/22 Python
Python多继承以及MRO顺序的使用
2019/11/11 Python
Python算法中的时间复杂度问题
2019/11/19 Python
python中wheel的用法整理
2020/06/15 Python
小学家长会邀请函
2014/01/23 职场文书
德能勤绩廉个人总结
2015/02/14 职场文书
早会开场白台词大全
2015/06/01 职场文书
交通安全温馨提示语
2015/07/14 职场文书
公司趣味运动会开幕词
2016/03/04 职场文书
2019年第四季度财务部门工作计划
2019/11/02 职场文书
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers