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 相关文章推荐
html a标签-超链接中confirm方法使用介绍
Jan 04 Javascript
js检查页面上有无重复id的实现代码
Jul 17 Javascript
jquery.mousewheel实现整屏翻屏效果
Aug 30 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
angularjs实现首页轮播图效果
Apr 14 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
深入理解 webpack 文件打包机制(小结)
Jan 08 Javascript
vue对storejs获取的数据进行处理时遇到的几种问题小结
Mar 20 Javascript
使用vue打包时vendor文件过大或者是app.js文件很大的问题
Jun 29 Javascript
Vue核心概念Getter的使用方法
Jan 18 Javascript
微信小程序封装的HTTP请求示例【附升级版】
May 11 Javascript
夯基础之手撕javascript继承详解
Nov 09 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中debug_backtrace、debug_print_backtrace和匿名函数用法实例
2014/12/01 PHP
php实现获取文件mime类型的方法
2015/02/11 PHP
PHP中你应该知道的require()文件包含的正确用法
2015/06/12 PHP
Laravel中9个不经常用的小技巧汇总
2019/04/16 PHP
php设计模式之职责链模式定义与用法经典示例
2019/09/19 PHP
jquery.alert 弹出式复选框实现代码
2009/06/15 Javascript
js如何设置在iframe框架中指定div不显示
2013/12/04 Javascript
Bootstrap3制作图片轮播效果
2016/05/12 Javascript
js判断主流浏览器类型和版本号的简单实现代码
2016/05/26 Javascript
js调用父框架函数与弹窗调用父页面函数的简单方法
2016/11/01 Javascript
thinkphp标签实现bootsrtap轮播carousel实例代码
2017/02/19 Javascript
js实现放大镜特效
2017/05/18 Javascript
Vue单文件组件的如何使用方式介绍
2017/07/28 Javascript
js与jQuery实现获取table中的数据并拼成json字符串操作示例
2018/07/12 jQuery
jquery3和layui冲突导致使用layui.layer.full弹出全屏iframe窗口时高度152px问题
2019/05/12 jQuery
koa2 用户注册、登录校验与加盐加密的实现方法
2019/07/22 Javascript
微信小程序实现多选框功能的实例代码
2020/06/24 Javascript
vue:el-input输入时限制输入的类型操作
2020/08/05 Javascript
Vue检测屏幕变化来改变不同的charts样式实例
2020/10/26 Javascript
vue + el-form 实现的多层循环表单验证
2020/11/25 Vue.js
[00:32]2018DOTA2亚洲邀请赛Mineski出场
2018/04/04 DOTA
python元组操作实例解析
2014/09/23 Python
举例讲解Linux系统下Python调用系统Shell的方法
2015/11/07 Python
一步步解析Python斗牛游戏的概率
2016/02/12 Python
python xml.etree.ElementTree遍历xml所有节点实例详解
2016/12/04 Python
Python实现PS滤镜功能之波浪特效示例
2018/01/26 Python
python实现自动化上线脚本的示例
2019/07/01 Python
python 发送get请求接口详解
2020/11/17 Python
安装不同版本的tensorflow与models方法实现
2021/02/20 Python
英国网络托管和域名领导者:Web Hosting UK
2017/10/15 全球购物
暑假家长评语大全
2014/04/17 职场文书
就职演讲稿范文
2014/05/19 职场文书
2015年试用期工作总结范文
2015/05/28 职场文书
Nginx反向代理及负载均衡如何实现(基于linux)
2021/03/31 Servers
星际争霸:毕姥爷vs解冻03
2022/04/01 星际争霸
MySQL数据库 任意ip连接方法
2022/05/20 MySQL