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中的Window窗口对象
Jan 16 Javascript
JavaScript 放大镜 放大倍率和视窗尺寸
May 09 Javascript
jQuery实现点击标题输入详细信息
Apr 16 Javascript
如何设置一定时间内只能发送一次请求
Feb 28 Javascript
一个简单的jquery进度条示例
Apr 28 Javascript
IE6-8中Date不支持toISOString的修复方法
May 04 Javascript
js实现表单Radio切换效果的方法
Aug 17 Javascript
ES6生成器用法实例分析
Apr 10 Javascript
浅谈Emergence.js 检测元素可见性的 js 插件
Nov 18 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
Feb 18 jQuery
jQuery操作cookie的示例代码
Jun 05 jQuery
ElementUI Tree 树形控件的使用并给节点添加图标
Feb 27 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中使用Oracle数据库(1)
2006/10/09 PHP
PHP 函数语法介绍一
2009/06/14 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
PHP发明人谈MVC和网站设计架构 貌似他不支持php用mvc
2011/06/04 PHP
PHP fgetcsv 定义和用法(附windows与linux下兼容问题)
2012/05/29 PHP
使用PHP实现阻止用户上传成人照片或者裸照
2014/12/25 PHP
Windows Server 2008 R2和2012中PHP连接MySQL过慢的解决方法
2016/07/02 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
javascript 触发事件列表 比较不错
2009/09/03 Javascript
购物车选中得到价格实现示例
2014/01/26 Javascript
js实现的下拉框二级联动效果
2016/04/30 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
微信小程序HTTP接口请求封装的实现
2019/02/21 Javascript
小程序分页实践之编写可复用分页组件
2019/07/18 Javascript
微信小程序实现页面跳转传递参数(实体,对象)
2019/08/12 Javascript
jquery实现直播视频弹幕效果
2020/02/25 jQuery
微信小程序调用后台service教程详解
2020/11/06 Javascript
Vue路由权限控制解析
2020/11/09 Javascript
微信小程序实现加入购物车滑动轨迹
2020/11/18 Javascript
跟老齐学Python之编写类之四再论继承
2014/10/11 Python
在Python中使用元类的教程
2015/04/28 Python
Eclipse中Python开发环境搭建简单教程
2016/03/23 Python
Python random模块用法解析及简单示例
2017/12/18 Python
Python实现将通信达.day文件读取为DataFrame
2018/12/22 Python
HTML5进阶段内联标签汇总(小篇)
2016/07/13 HTML / CSS
Joseph官网:英国小众奢侈品牌
2019/05/17 全球购物
Java的for语句中break, continue和return的区别
2013/12/19 面试题
优秀教师先进事迹材料
2014/12/15 职场文书
骨干教师考核评语
2014/12/31 职场文书
大学生求职自荐信范文
2015/03/04 职场文书
治庸问责工作总结
2015/08/11 职场文书
小学四年级作文之人物作文
2019/11/06 职场文书
springboot @ConfigurationProperties和@PropertySource的区别
2021/06/11 Java/Android
JavaScript实现队列结构过程
2021/12/06 Javascript
Javascript中Microtask和Macrotask鲜为人知的知识点
2022/04/02 Javascript
以MySQL5.7为例了解一下执行计划
2022/04/13 MySQL