JavaScript数据结构——实现简单的散列表

  散列算法的作用是尽可能快地在数据结构中找到一个值。如果数据很大,但是有需要遍历整个数据结构来查找到该值,花费的时间就太多了。所以散列表在查找方面中比较优势:使用散列函数,就知道具体位置,能够快速检索。散列函数的作用:给定一个key值,返回key值在表中的地址。

 

 1 function HashTable(){
 2     //初始化散列表
 3     var table=[];
 4     //散列函数(私有方法)
 5     var loseloseHashCode = function(key){
 6         var hash=0;
 7         for(var i=0;i<key.length;i++){
 8             hash += key.charCodeAt(i);
 9         }
10         //因为相加的hash值很大,为了得到较小的数值,hash值与任意一个数取余
11         return hash%37;
12     };
13
14     //最被社区推荐的散列函数
15     var djb2HashCode = function(key){
16         //初始化hash变量,并且赋值为一个质数,大多数使用5381
17         //将hash与33(魔力数)相乘
18         var hash=5381;
19         for(var i=0;i<key.length;i++){
20             hash=hash*33+key.charCodeAt(i);
21         }
22         //相加后的hash值最后一个质数相除取余,这个质数要逼散列表的大小要大一点。
23         return hash%1013;
24     };
25     //把值放入哈希表中
26     this.put = function(key,value){
27         var position=loseloseHashCode(key);
28         //console.log可有可无
29         console.log(position+"-"+key);
30         table[position]=value;
31     };
32     //获取
33     this.get = function(key){
34         return table[loseloseHashCode(key)];
35     };
36     //移除
37     this.remove=function(key){
38         table[loseloseHashCode(key)]=undefined;
39     }
40 }

  上述HashTable函数中,有一个很明显的缺点就是如果插入的不同key但是ASCII值相同情况下,会发生覆盖。后面存入的值会覆盖前面存入的值。为了解决冲突,可以使用分离链接,线性探查和双散列法。

  分离链接法,在散列表的每个位置创建一个链表并将元素存储在里面。简单一点来说就是在,每个位置上,再建立一个链表,一次存放不同的key值。这种方法因为有链表,所以会增加额外的存储空间。

  线性探查法。假设想在[320]位置上放入一个新的元素。如果[320]位置上为空,没有元素存储,则直接放入;如果有元素占据了该位置,则尝试[320+1]位置,即是下一个位置,如果[320+1]的位置被占据了,则尝试[320+1+1]的位置,即是尝试下下个位置,以此类推,直到找到空位。

  

时间: 2024-08-04 01:54:44

JavaScript数据结构——实现简单的散列表的相关文章

《数据结构》C++代码 散列表

       散列表,又名哈希表.Hash表.这是一个神奇的数据结构,它的复杂度是常数级别,由于我非常喜欢这个数据结构,在此简单介绍一下.        (没有学过Hash表的同学,我推荐一个教程:http://www.cnblogs.com/jiewei915/archive/2010/08/09/1796042.html)        让我们回忆一下之前学过的数据结构,列个表,与Hash表做个比较(表中c表示常数): 插入时间 删除时间 查找时间 编程复杂度 信息剖析度 无序数组 1 N

数据结构和算法篇——散列表

之前讲过博主在某网买了一个数据结构与算法的课程.本篇散列表是其中的三节.散列表应该是 Java 程序员常用并且最先碰到的一个数据结构了吧?Java 的 HashMap 就是对散列表的实现.可以说散列表算是一个比较基础.比较好理解(抛开需要缜密设计的哈希函数不说).比较好用(查询时间复杂度O(1))的一种数据结构.本篇在此分享这三节的总结笔记. 1)散列表开篇介绍:https://www.cnblogs.com/christmad/p/11519055.html 2)如何打造一个工业级的散列表:h

散列表的C语言实现-分离链接法

一:散列表的定义: 散列表的实现常常叫做散列,散列是一种用于以常数平均时间执行插入,查找,删除的技术,但是,那些需要元素间任何排序信息的操作将不会得到支持,如findmin,findmax等等.散列表的优点很明显,它的查询时间为常数,速度非常快,缺点就是元素间没有排序,对于一些需要排序的场合不适用.理想的散列表数据结构就是一个包含有关键字的具有固定大小的数组,用一个散列函数来跟据关键字的值来将关键字插入到表中.这是散列的基本想法,剩下的问题是要选择一个好的散列函数,当俩个关键字散列到同一个值得时

Python数据结构——散列表

散列表的实现常常叫做散列(hashing).散列仅支持INSERT,SEARCH和DELETE操作,都是在常数平均时间执行的.需要元素间任何排序信息的操作将不会得到有效的支持. 散列表是普通数组概念的推广.如果空间允许,可以提供一个数组,为每个可能的关键字保留一个位置,就可以运用直接寻址技术. 当实际存储的关键字比可能的关键字总数较小时,采用散列表就比较直接寻址更为有效.在散列表中,不是直接把关键字用作数组下标,而是根据关键字计算出下标,这种 关键字与下标之间的映射就叫做散列函数. 1.散列函数

数据结构复习之散列表查找(哈希表)

一.散列表相关概念 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).公式如下: 存储位置 = f(关键字) 这里把这种对应关系f称为散列函数,又称为哈希(Hash)函数.按这个思想,采用散列技术将记录存在在一块连续的存储空间中,这块连续存储空间称为散列表或哈希表.那么,关键字对应的记录存储位置称为散列地址. 散列技术既是一种存储方法也是一种查找方法.散列技术的记录之间不存在什么逻辑关系,它只与关键字有关,因此,散列主要是面向查

JavaScript 散列表(HashTable)

TypeScript方式实现源码 // 特性: // 散列算法的作用是尽可能快地在数据结构中找到一个值. 在之前的章节中, 你已经知道如果 // 要在数据结构中获得一个值(使用get方法) ,需要遍历整个数据结构来找到它.如果使用散列 // 函数,就知道值的具体位置,因此能够快速检索到该值.散列函数的作用是给定一个键值,然后 // 返回值在表中的地址 // ? put(key,value):向散列表增加一个新的项(也能更新散列表) // ? remove(key):根据键值从散列表中移除值 //

深入浅出数据结构C语言版(14)——散列表

我们知道,由于二叉树的特性(完美情况下每次比较可以排除一半数据),对其进行查找算是比较快的了,时间复杂度为O(logN).但是,是否存在支持时间复杂度为常数级别的查找的数据结构呢?答案是存在,那就是散列表(hash table,又叫哈希表).散列表可以支持O(1)的插入,理想情况下可以支持O(1)的查找与删除. 散列表的基本思想很简单: 1.设计一个散列函数,其输入为数据的关键字,输出为散列值n(正整数),不同数据关键字必得出不同散列值n(即要求散列函数符合单射条件) 2.创建一个数组HashT

数据结构与算法——散列表类的C++实现(分离链接散列表)

散列表简介: 散列表的实现常被称为散列.散列是一种用于以常数平均时间执行插入.删除和查找的技术. 散列的基本思想: 理想的散列表数据结构只不过是一个包含一些项的具有固定大小的数组.(表的大小一般为素数) 设该数组的大小为TbaleSize,我们向该散列表中插入数据,首先我们将该数据用一个函数(散列函数)映射一个数值x(位于0到TbaleSize1-1之间):然后将该数据插入到散列表的第x的单元.(如果有多个数据映射到同一个数值,这个时候就会发生冲突) 散列函数介绍: 为了避免散列函数生成的值不是

数据结构---哈希表(散列表)

我们在Java容器中谈到:有哈希表(也称为散列表)支持的HashMap.LinkedHashSet等都具有非常高的查询效率.这其中就是Hash起的作用.顺序查找的时间复杂度为O(N) ,二分查找和查找树的时间复杂度为O(logN),而 哈希表的时间复杂度为O(1) .不过这只是理想状态,实际并不那么完美. 1.哈希表的概念和思想 哈希表是唯一的专用于集合的数据结构.可以以常量的平均时间实现插入.删除和查找. 哈希表的思想是:用一个与集合规模差不多大的数组来存储这个集合,将数据元素的关键字映射到数