初步学习HashTable(哈希表或者散列链表)
初次接触哈希表,我谈谈自己对哈希表的一些理解,可能有误,还望指正。
对于哈希表,存放的数据是键值对<key,value>。是按照键值来索引的,键key可以是字符串、单个字符、整形数等,值value就是存放结点数据。
通俗的说,对于哈希表,使用数组来存放基本的结点,每个结点在挂上一串链表构成的结构,如下图所示:
数组存放的可以是不存储任何数据的头结点,我们的数据是存放在以为头结点开始的链表上的。图中的结点的中存放着键值对和指向下一个结点的指针。
索引原理:Java中是根据键进行二次哈希得到哈希值,再由哈希值&(array.length-1)映射到数组下标,或者用哈希值%array.length映射。不同的键可以映射到同一个数组下标,采用链表来解决哈希冲突。基本的原理也就是有key通过hash函数(hash变换)得到hash量,再由hash量通过变换映射到数组下标上,通常为取余操作%和与操作&。
总之,就是通过算法将key映射到数组下标上。
个人理解:数组下标的索引为常数复杂度,hash表就是利用这一点来提高搜索效率的,定位到key对应的数组位置只需要O(1)的复杂度,然后再对链表进行遍历即可。
如果同样的数据用数组进行存储的话,数组长度为length,那么改用hash表来存储,查找的效率可以提高length倍。
但是得注意:hash相同,但是key不一定相同。 key相同,则hash一定相同。
正因为如此,所以才会出现哈希冲突,有三种解决方法,下面的参考中有。这里哈希表采用外加链表法。
参考:
[1] http://m.blog.csdn.net/stayneckwind2/article/details/53574685
[2] http://m.blog.csdn.net/u014539992/article/details/52874819
[3] http://m.blog.csdn.net/u014613043/article/details/50726630
[4] http://m.blog.csdn.net/xiaotan2011929/article/details/61647556
参考视频:
https://pan.baidu.com/s/1eSm3zma
初步学习HashTable(哈希表或者散列链表)的更多相关文章
- 哈希表(散列)HashTable实现
近期刷Leetcode发现凡是找字符串中反复字符或者数组中找反复数据的时候就不知道从何下手了. 所以决定学习一下哈希表解题.哈希表的原理主要是解决分类问题,hash表是介于链表和二叉树之间的一种中间结 ...
- hashTable(哈希表)的基本用法
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.C ...
- Stack集合 Queue队列集合 Hashtable哈希表
Stack集合 干草堆集合 栈集合 栈;stack,先进后出,一个一个赋值,一个一个取值,安装顺序来. 属性和方法 实例化 初始化 Stack st = new Stack(); 添加元素 个数 Co ...
- 【数据结构】之散列链表(Java语言描述)
散列链表,在JDK中的API实现是 HashMap 类. 为什么HashMap被称为“散列链表”?这与HashMap的内部存储结构有关.下面将根据源码进行分析. 首先要说的是,HashMap中维护着的 ...
- 哈希表(散列表),Hash表漫谈
1.序 该篇分别讲了散列表的引出.散列函数的设计.处理冲突的方法.并给出一段简单的示例代码. 2.散列表的引出 给定一个关键字集合U={0,1......m-1},总共有不大于m个元素.如果m不是很大 ...
- 哈希表(散列表)—Hash表解决地址冲突 C语言实现
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度.具体的介绍网上有很详 ...
- javascript 实现HashTable(哈希表)
一.javascript哈希表简介 javascript里面是没有哈希表的,一直在java,C#中有时候用到了这一种数据结构,javascript里面若没有,感觉非常不顺手.细细看来,其实javasc ...
- java资料——哈希表(散列表)(转)
哈希表 散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度. ...
- 【Python算法】哈希存储、哈希表、散列表原理
哈希表的定义: 哈希存储的基本思想是以关键字Key为自变量,通过一定的函数关系(散列函数或哈希函数),计算出对应的函数值(哈希地址),以这个值作为数据元素的地址,并将数据元素存入到相应地址的存储单元中 ...
随机推荐
- 【leetcode】74. 搜索二维矩阵
题目链接:传送门 题目描述 编写一个高效的算法来判断 m x n 矩阵中,是否存在一个目标值.该矩阵具有如下特性: 每行中的整数从左到右按升序排列. 每行的第一个整数大于前一行的最后一个整数. 示例 ...
- Earth Wind and Fire CodeForces - 1148E (构造)
大意: $n$个石子, 第$i$个石子初始位置$s_i$, 每次操作选两个石子$i,j$, 要求$s_i<s_j$, 任取$d$, 满足$0\le 2d\le s_j-s_i$, 将$s_i,s ...
- WebApi 空项目生成帮助文档
1.创建一个WebApi的空项目 2.写一些接口,在接口文档中忽略某个方法可以使用 [ApiExplorerSettings(IgnoreApi = true)] 特性 3.在Nuget中添加 Mi ...
- C#学习资料
http://www.runoob.com/csharp/csharp-delegate.html
- Git忽略已追踪文件或文件夹
今天拉取代码,用vs生成后发现obj文件夹下自动生成的文件被同事提交了,这个本应该加入到ignore的 我就需要把这个文件夹加入到gitignore, 不过已经追踪的文件和文件夹,直接添加到gitig ...
- vue-cli3 本地数据模拟后台接口
vue-cli3 本地数据模拟后台接口 原理: 将本地的json数据在前端模拟为后台接口,然后调用接口,完成前端操作.在后台接通后可以直接在api配置文件中修改路径,完成前后台对接. 配置: 1.文件 ...
- struts-2.5.14.1中jar包引入
- android项目笔记整理(2)
31.利用SharedPreferences存储时间 读取时间: SharedPreferences sp=this.getSharedPreferences("actm&q ...
- rabbimq 生产消费者
composer.json { "require": { "php-amqplib/php-amqplib": "^2.9" } } com ...
- 智能指针原理及实现(1)shared_ptr
0.异常安全 C++没有内存回收机制,每次程序员new出来的对象需要手动delete,流程复杂时可能会漏掉delete,导致内存泄漏.于是C++引入智能指针,可用于动态资源管理,资源即对象的管理策略. ...