1. function Dictionary() {
  2. var items={};
  3. this.set=function (key,value) {
  4. items[key]=value;
  5. };
  6. this.remove=function (key) {
  7. if(this.has(key)){
  8. delete items[key];
  9. return true;
  10. }
  11. return false;
  12. };
  13. this.has=function (key) {
  14. return key in items;
  15. };
  16. this.get=function(key){
  17. return this.has(key)?items[key]:undefined;
  18. };
  19. this.clear=function(){
  20.  
  21. };
  22. this.size=function(){
  23.  
  24. };
  25. this.keys=function () {
  26.  
  27. };
  28. this.values=function () {
  29. var values=[];
  30. for (var k in items) {
  31. if (this.has(k)) {
  32. values.push(items[k]);
  33. }
  34. }
  35. return values;
  36. };
  37. this.getItems=function(){
  38. return items;
  39. };
  40.  
  41. }
  42. // 解决散列值重复的三种方法:分离链接、线性探查、双散列法。
  43. // 1、分离链接法为散列表的每一个位置创建一个链表并将元素存储在里面
  44. //分离链接的哈希表
  45. //被注释的为普通的哈希表
  46. function HashTable() {
  47. var table=[];
  48. var loseHashCode=function(key){
  49. var hash=0;
  50. for(var i=0;i<key.length;i++){
  51. hash+=key.charCodeAt(i);
  52. }
  53. return hash%37;
  54. };
  55. var ValuePair=function (key,value) {
  56. this.key=key;
  57. this.value=value;
  58. this.toString=function () {
  59. return "["+this.key+"-"+this.value+"]";
  60. }
  61. }
  62. this.put=function(key,value){
  63. var position=loseHashCode(key);
  64. // console.log(position,"-",key);
  65. // table[position]=value;
  66. if(table[position]==undefined){
  67. //每一个位置都是一个链表
  68. table[position]=new LinkedList();
  69. }
  70. table[position].append(new ValuePair(key,value));
  71. };
  72. this.remove=function(key){
  73. //table[loseHashCode(key)]=undefined;
  74. var position=loseHashCode(key);
  75. if(table[position]!==undefined){
  76. var current=table[position].getHead();
  77. while(current.next){
  78. if(current.element.key===key){
  79. table[position].remove(current.element);
  80. if(table[position].isEmpty()){
  81. table[position]=undefined;
  82. }
  83. return true;
  84. }
  85. current=current.next;
  86. }
  87. if(current.element.key===key){
  88. table[position].remove(element);
  89. if(table[position].isEmpty()){
  90. table[position]=undefined;
  91. }
  92. return true;
  93. }
  94. }
  95. return false;
  96. };
  97. this.get=function(key){
  98. //return table[loseHashCode(key)];
  99. var position=loseHashCode(key);
  100. if (table[position]!==undefined) {
  101. var current=table[position].getHead();
  102. while (current.next) {
  103. if (current.element.key===key) {
  104. return current.element.value;
  105. }
  106. current=current.next;
  107. }
  108. if (current.element.key===key) {
  109. return current.element.value;
  110. }
  111. }
  112. return undefined;
  113. };
  114. this.print=function(){
  115. for (var i = 0; i < table.length; i++) {
  116. if(table[i]!=undefined){
  117. console.log(i,":",table[i]);
  118. }
  119. }
  120. };
  121. }
  122. //2、线性探查
  123. // 当想向表中某个位置加入一个新的元素时,如果索引为index的位置已经被占据了,
  124. // 就尝试index+1的位置。如果index+1的位置也被占据了,就尝试index+2的位置
  125. // 以此类推
  126. function LDHashTable() {
  127. // ... 省略重复的代码
  128. this.put=function (key,value) {
  129. if(table[position]==undefined){
  130. table[position]=new KeyValuePair(key,value);
  131. }else{
  132. var index=++position;
  133. while (table[index]!=undefined) {
  134. index++
  135. }
  136. table[position]=new KeyValuePair(key,value);
  137. }
  138. }
  139. this.get=function (key) {
  140. var position=loseHashCode(key);
  141. if(table[position]!==undefined){
  142. if(table[position].key===key){
  143. return table[position].value;
  144. }else{
  145. var index=++index;
  146. // 原书中是 table[index]===undefined || table[index].key!==key
  147. while (table[index]!==undefined && table[index].key!==key) {
  148. index++;
  149. }
  150. if(table[index] && table[index].key===key){
  151. return table[index].value;
  152. }
  153. }
  154. }
  155. }
  156. }
  157.  
  158. // 更好的散列函数
  159. var djb2HashCode=function (key) {
  160. var hash=5381;//一个质数,大多数情况下为5381
  161. for (var i = 0; i < key.length; i++) {
  162. hash=hash*33+key.charCodeAt(i);
  163. }
  164. return hash%1013;//1013为比散列表大小要大的一个质数
  165. }

  

Javascript中的字典和散列的更多相关文章

  1. JavaScript中创建字典对象(dictionary)实例

    这篇文章主要介绍了JavaScript中创建字典对象(dictionary)实例,本文直接给出了实现的源码,并给出了使用示例,需要的朋友可以参考下 对于JavaScript来说,其自身的Array对象 ...

  2. Python中的hashable(散列)

    Python文档中的解释: 一个对象是可散列的,那么在它的生命周期中它的hash 值是不变的. 可散列的对象需要2个方法:__hash__()方法和__eq__()方法.两个可散列的对象相等,那么它们 ...

  3. javascript中的字典

    1.概念 字典是一种以键值对的形式存储的数据结构,就系那个电话本中的名字和电话号码一样.要找到一个电话首先要找到名字,再根据名字找到电话号码.这里的键就是指用来查找的东西,值就是查找得到的结果. Ja ...

  4. JavaScript中常见数据结构

    数据结构 栈:一种遵从先进后出 (LIFO) 原则的有序集合:新添加的或待删除的元素都保存在栈的末尾,称作栈顶,另一端为栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底. 队列:与上相反,一种遵循先进 ...

  5. JavaScript数据结构——集合、字典和散列表

    集合.字典和散列表都可以存储不重复的值. 在集合中,我们感兴趣的是每个值本身,并把它当作主要元素.在字典和散列表中,我们用 [键,值] 的形式来存储数据. 集合(Set 类):[值,值]对,是一组由无 ...

  6. JavaScript数据结构——字典和散列表的实现

    在前一篇文章中,我们介绍了如何在JavaScript中实现集合.字典和集合的主要区别就在于,集合中数据是以[值,值]的形式保存的,我们只关心值本身:而在字典和散列表中数据是以[键,值]的形式保存的,键 ...

  7. DotNet加密方式解析--散列加密

    没时间扯淡类,赶紧上车吧. 在现代社会中,信息安全对于每一个人都是至关重要的,例如我们的银行账户安全.支付宝和微信账户安全.以及邮箱等等,说到信息安全,那就必须得提到加密技术,至于加密的一些相关概念, ...

  8. 【Java集合学习】HashMap源码之“拉链法”散列冲突的解决

    1.HashMap的概念 HashMap 是一个散列表,它存储的内容是键值对(key-value)映射. HashMap 继承于AbstractMap,实现了Map.Cloneable.java.io ...

  9. java 散列

    原文:https://www.cnblogs.com/younghao/p/8333795.html 为什么要设计散列这种数据结构呢?在现实世界中,实体之间可能存在着映射关系(key-value),比 ...

随机推荐

  1. @overrive报错解决方案

    有时将项目移到另一个环境里出现@overrive报错的情况,可以看看eclipse工具的编译设置,将编译版本设置高点.

  2. MWeb 1.3.7 发布!增加发布到 Wordpress 等支持 MetaWeblog API 的服务,如:Wordpress 博客、新浪博客、cnblogs、oschina。

    MWeb 1.3.7 版的新功能 增加发布到 Wordpress 等支持 Metaweblog API 的服务,目前经测试过的有: Wordpress 博客.新浪博客.cnblogs.oschina. ...

  3. 点餐系统sprint3总结

    转眼间,sprint3也结束了.意味着软件工程的课程结束了,我们的项目也完成了.在队友们的认真学习,专注打码,辛苦赶工后,我们的项目完成了.显然是仓促中完成的,没有完美的界面.没有无bug的项目,但是 ...

  4. java代码打包成jar以及转换为exe

    教你如何把java代码打包成jar文件以及转换为exe可执行文件 1.背景: 学习java时,教材中关于如题问题,只有一小节说明,而且要自己写麻烦的配置文件,最终结果却只能转换为jar文件.实在是心有 ...

  5. javascript原型对象

    先来做个复习,ES5中有有几种数据类型呢? 5种基本数据类型 Undefined Null Boolean Number String 1种复杂数据类型 Object 除了基本数据类型,万物皆对象,记 ...

  6. [转]在Ubuntu 14.04安装和使用Docker

    在Ubuntu 14.04安装和使用Docker 作者:chszs,版权所有,未经同意,不得转载.博主主页:http://blog.csdn.net/chszs Docker是一个开源软件,它可以把一 ...

  7. $.Callbacks()

    <script> var cb = $.Callbacks(); //Callbacks(option) 有4个参数,可以多个参数写一起,空格分隔开 //once 多个fire() 只触发 ...

  8. LeetCode:Two Sum II

    public class Solution { public int[] twoSum(int[] numbers, int target) { int left = 0; int right = n ...

  9. 20.谈谈对mvc的认识。

    MVC是 模型(Model) .视图(View).控制器(Control) 的英文首字母的缩写,核心思想是:视图和用户交互 通过事件导致控制器改变 控制器改变导致模型改变 或者控制器同时改变两者 模型 ...

  10. 利用lambda和Collection.forEach

    2.外部VS内部迭代 以前Java集合是不能够表达内部迭代的,而只提供了一种外部迭代的方式,也就是for或者while循环. 1 2 3 4 List persons = asList(new Per ...