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 相关文章推荐
JS实现定时页面弹出类似QQ新闻的提示框
Nov 07 Javascript
三种方式获取XMLHttpRequest对象
Apr 21 Javascript
jQuery随机密码生成的方法
Mar 09 Javascript
javascript图片预加载实例分析
Jul 16 Javascript
JavaScript html5 canvas绘制时钟效果
Mar 01 Javascript
angular-ui-sortable实现可拖拽排序列表
Dec 28 Javascript
微信小程序 实现动态显示和隐藏某个控件
Apr 27 Javascript
详解a++和++a的区别
Aug 30 Javascript
JS鼠标3次点击事件实现代码及扩展思路
Sep 12 Javascript
详解Vue-cli代理解决跨域问题
Sep 27 Javascript
详解JavaScript的数据类型以及数据类型的转换
Apr 20 Javascript
基于vue实现探探滑动组件功能
May 29 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 获取文件行数的方法总结
2016/10/11 PHP
Ajax一统天下之Dojo整合篇
2007/03/24 Javascript
分享一个用Mootools写的鼠标滑过进度条改变进度值的实现代码
2011/12/12 Javascript
Extjs中通过Tree加载右侧TabPanel具体实现
2013/05/05 Javascript
判断一个对象是否为jquery对象的方法
2014/03/12 Javascript
jquery显示隐藏input对象
2014/07/21 Javascript
jquery实现鼠标滑过小图时显示大图的方法
2015/01/14 Javascript
js实现点击文本框显示日期选择器特效代码分享
2020/05/21 Javascript
jquery判断输入密码两次是否相等
2020/04/22 Javascript
ajax分页效果(bootstrap模态框)
2017/01/23 Javascript
微信小程序 PHP生成带参数二维码
2017/02/21 Javascript
详解vue2.0组件通信各种情况总结与实例分析
2017/03/22 Javascript
jQuery插件jsonview展示json数据
2018/05/26 jQuery
详解基于vue的服务端渲染框架NUXT
2018/06/20 Javascript
node中实现删除目录的几种方法
2019/06/24 Javascript
Vue路由对象属性 .meta $route.matched详解
2019/11/04 Javascript
vue实践---vue不依赖外部资源实现简单多语操作
2020/09/21 Javascript
Python中每次处理一个字符的5种方法
2015/05/21 Python
windows及linux环境下永久修改pip镜像源的方法
2016/11/28 Python
Python利用turtle库绘制彩虹代码示例
2017/12/20 Python
python3安装pip3(install pip3 for python 3.x)
2018/04/03 Python
基于python 处理中文路径的终极解决方法
2018/04/12 Python
python实现修改固定模式的字符串内容操作示例
2019/12/30 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
python安装后的目录在哪里
2020/06/21 Python
详解python命令提示符窗口下如何运行python脚本
2020/09/11 Python
德国综合购物网站:OTTO
2018/11/13 全球购物
金鑫耀Java笔试题
2014/09/06 面试题
旅游管理毕业生自荐信
2013/11/05 职场文书
优秀本科生求职推荐信
2014/02/24 职场文书
广播节目策划方案
2014/05/23 职场文书
食品安全承诺书范文
2014/08/29 职场文书
开展党的群众路线教育实践活动领导班子对照检查材料
2014/09/25 职场文书
PostgreSQL存储过程实用脚本(二):创建函数入门
2021/04/05 PostgreSQL
Python基础之教你怎么在M1系统上使用pandas
2021/05/08 Python
Python sklearn分类决策树方法详解
2022/09/23 Python