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实现关键字搜索时的相关下拉字段效果
Aug 05 Javascript
JavaScript获取页面上被选中文字的方法技巧
Mar 13 Javascript
JS组件Bootstrap实现下拉菜单效果代码
Apr 26 Javascript
Vue.js组件tabs实现选项卡切换效果
Dec 01 Javascript
JS限定手机版中图片大小随分辨率自动调整的方法
Dec 05 Javascript
Vue数据驱动模拟实现5
Jan 13 Javascript
gulp安装以及打包合并的方法教程
Nov 19 Javascript
Vue 组件(component)教程之实现精美的日历方法示例
Jan 08 Javascript
小程序自定义日历效果
Dec 29 Javascript
jQuery实现获取多选框的值示例
Feb 07 jQuery
Element Carousel 走马灯的具体实现
Jul 26 Javascript
Ajax实现页面无刷新留言效果
Mar 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
Javascript实例教程(19) 使用HoTMetal(5)
2006/12/23 Javascript
javascript JSON操作入门实例
2010/04/16 Javascript
JQuery中html()方法使用不当带来的陷阱
2011/04/07 Javascript
JS验证控制输入中英文字节长度(input、textarea等)具体实例
2013/06/21 Javascript
jQuery中triggerHandler()方法用法实例
2015/01/19 Javascript
详谈javascript中DOM的基本属性
2015/02/26 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
jquery+ajax实现省市区三级联动效果简单示例
2017/01/04 Javascript
Bootstrap table表格简单操作
2017/02/07 Javascript
for循环 + setTimeout 结合一些示例(前端面试题)
2017/08/30 Javascript
JS实现的计数排序与基数排序算法示例
2017/12/04 Javascript
详解webpack4升级指南以及从webpack3.x迁移
2018/06/12 Javascript
JavaScript实现的前端AES加密解密功能【基于CryptoJS】
2018/08/28 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
Vue单页面应用中实现Markdown渲染
2021/02/14 Vue.js
python 回调函数和回调方法的实现分析
2016/03/23 Python
python版本坑:md5例子(python2与python3中md5区别)
2017/06/20 Python
利用django如何解析用户上传的excel文件
2017/07/24 Python
基于Django contrib Comments 评论模块(详解)
2017/12/08 Python
Python如何实现线程间通信
2020/07/30 Python
Python+OpenCV图像处理——图像二值化的实现
2020/10/24 Python
Python爬虫实例之2021猫眼票房字体加密反爬策略(粗略版)
2021/02/22 Python
一波HTML5 Canvas基础绘图实例代码集合
2016/02/28 HTML / CSS
MAC Cosmetics巴西官方网站:M·A·C彩妆
2019/04/18 全球购物
聚网科技C++面试笔试题
2015/09/01 面试题
中国梦的演讲稿
2014/01/08 职场文书
宿舍使用违章电器检讨书
2014/01/12 职场文书
工程专业应届生求职信
2014/02/19 职场文书
妇女干部培训方案
2014/05/12 职场文书
单位作风建设自查报告
2014/10/23 职场文书
如何使用vue3打造一个物料库
2021/05/08 Vue.js
告别网页搜索!教你用python实现一款属于自己的翻译词典软件
2021/06/03 Python
mysql函数全面总结
2021/11/11 MySQL
UNION CREATIVE《Re:从零开始的异世界生活》雷姆手办
2022/03/20 日漫
索尼ICF-36收音机评测
2022/04/30 无线电
SQL Server中T-SQL标识符介绍与无排序生成序号的方法
2022/05/25 SQL Server