哈希表

Java集合

北城余情 提交于 2020-02-25 21:05:48
概述: List , Set, Map都是接口,前两个继承至 Collection 接口, Map 为独立接口 List下有 ArrayList , LinkedList ,Vector Set下有 HashSet , TreeSet ,LinkedHashSet Map下有 Hashtable ,LinkedHashMap, HashMap , TreeMap     常用集合类: ArrayList , LinkedList, HashSet, HashMap Connection接口: —---- List 有序,可重复 ArrayList 优点: 底层数据结构是数组, 查询快,增删慢。 缺点: 线程不安全,效率高 LinkedList 优点: 底层数据结构是链表, 查询慢,增删快。 缺点: 线程不安全,效率高 Vector(已放弃) 优点: 底层数据结构是数组,查询快,增删慢。 缺点: 线程安全,效率低 (数据量较大,同时数据查询到条件多的时候选择使用ArrayList       ,增删条件多的时候选择使用LinkehLish   一般情况直接使用ArrayList。) —----Set 无序,唯一 HashSet 底层数据结构是哈希表。 (无序,唯一) 如何来保证元素唯一性? 1.依赖两个方法:hashCode()和equals() LinkedHashSet

神奇的散列表

拟墨画扇 提交于 2020-02-25 15:47:08
散列表也叫哈希表,这种数据结构提供了键(Key)和值(值)的映射关系。只要给出一个Key,就可以高效查找到它所匹配的值Value,时间复杂度接近于O(1)。了解散列表的原理之前我们了解一下哈希函数。散列表在本质上也是一个数组。可是数组只能根据下标,像a[0]、a[1]、a[3] 这样来访问,而散列表的key则是以字符串类型为主的。例如以学生的学号作为key,输入00213,查询到李四;或者以单词key,输入by,查询到数字520…,所以我们需要一个中转站,通过某种方式,把key和数组下标进行转换,这个中转站就叫做哈希函数。在不同的语言中,哈希函数的实现方式是不一样的。这里以java的常用集合HashMap为例,来看一看哈希函数在java中的实现。在java及大多数面向对象的语言中,每一个对象都有属于自己hashcode,这个hashcode是区分不同对象的重要标识,无论对象自身的类型是什么,它们的hashcode都是一个整型变量。既然都是整型变量,想要转换成数组的下标也就不难实现了,JDK中的哈希函数采用位运算的方式来优化性能。 散列表的读写操作。写操作就是在散列表中插入新的键值对(在JDK中叫Entry),第一步,通过哈希函数把key转换成数组下标,第二步如果数组下标对应的位置没有元素,就把这个Entry填充到数组下标对应的位置,但是由于数组的长度是有限的

并发系列(2)之 ThreadLocal 详解

*爱你&永不变心* 提交于 2020-02-25 08:14:15
本文将主要结合源码讲述 ThreadLocal 的使用场景和内部结构,以及 ThreadLocalMap 的内部结构;另外在阅读文本之前只好先了解一下引用和 HashMap 的相关知识,可以参考 Reference 框架概览 、 Reference 完全解读 、 HashMap 相关 ; 一、使用场景 通常情况下避免多线程问题有三种方法: 不使用共享状态变量; 状态变量为不可变的; 访问共享变量时使用同步; 而 ThreadLocal 则是通过每个线程独享状态变量的方式,即不使用共享状态变量,来消除多线程问题的,例如: @Slf4j public class TestThreadlocal { private static ThreadLocal<String> local = ThreadLocal.withInitial(() -> "init"); public static void main(String[] args) throws InterruptedException { Runnable r = new TT(); new Thread(r, "thread1").start(); Thread.sleep(2000); new Thread(r, "thread2").start(); log.info("exit"); } private static

Redis详解

牧云@^-^@ 提交于 2020-02-25 01:57:19
1. Redis 概述 Redis远程字典服务器; Redis 是一个高性能(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库; Redis 三个特点: Redis 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候,可以再次加载进行使用; Redis 不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储; Redis 支持数据的备份,即master-slave模式的数据备份; 2. Redis 数据类型 String(字符串) Hash(哈希) List(列表) Set(集合) Zset(sorted set: 有序集合) 2.2 Redis 键(key) set 键名 键值: 向数据库中存储键值对;例: 127.0.0.1:6379> set name king OK 127.0.0.1:6379> get name "king"type key: 查看key的类型;例: 127.0.0.1:6379> type name stringexists 键名: 判断某个key是否存在,存在,返回"1";不存在,返回"0";例: 127.0.0.1:6379> exists name (integer) 1 127.0.0.1:6379> exists user (integer) 0

力扣3-最长无重复字符的字串longest Substring without repeating characters

白昼怎懂夜的黑 提交于 2020-02-25 01:08:19
题目 Given a string, find the length of the longest substring without repeating characters. 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 举例 abc 3 bbb 1 pwwkew 3 解题思路 1利用hashmap来降低时间复杂度,建立字符与位置之间的关系 2用滑动窗口维护一个不重复字符串 3通过滑动窗口得到最长子串的长度 代码 class Solution { public: int lengthOfLongestSubstring(string s) { //维护一个滑动窗口,里面字符无重复 int res=0, left = -1, n = s.size(); //本题中字符与其位置非常重要,所以预先一个hashmap unordered_map <int,int> m;//定义 for (int i = 0; i<n; ++i) { if(m.count(s[i]) && m[s[i]]>left) //第一个条件成立,就说明当前字符在之前就一定存在过了 //第二个条件说明之前出现过的字符在窗口内 { left = m[s[i]];//移除前一个 } m[s[i]] = i;//就是构建哈希的步骤 res = max(res,i-left); } return

Bloom Filter 原理及实现

≯℡__Kan透↙ 提交于 2020-02-24 13:05:39
题外话: 很久没写博客了,因为前一段时间过年在家放假,又因为自己保研了,所以一直比较闲。整个假期,基本都在准备毕业设计的相关内容。我毕业设计的方向是关于搜索引擎的,因此,期间阅读了大量相关论文。阅读了很多论文和技术书籍之后,我有几点感触。首先,发现国内很多论文或是书籍只是大量引述其他人的研究结果,自己的独特的见解非常少,一篇文章,70%的内容都是在以介绍为主,感觉发这样的论文是没有什么意义的。相反,国外尤其是像MIT,斯坦福,google之类的领域专家发表很多极其优秀的论文,阅读后给人一种震撼。我之前在网上搜索技术文章或是论文的时候经常绕过英文的,现在发现国外的确有非常多优秀的外文文章,所以无障碍英文阅读能力是提升自己专业水平的重要因素。 我现在已经逐渐习惯阅读外文文章和书籍。 期间,我还翻译了一篇关于网络信息采集和索引的外文文章,收获很大。不是因为,我从中获得了多少知识,而是在翻译的过程中,我了解了作者精心的设计思路以及严谨的语言表达,也锻炼了我翻译的能力以及组织语言的能力。 废话不多说了,开始正题,写个在爬虫系统中常用的URL去重经典算法Bloom Filter. 正题: Bloom Filter概念和原理 引用一篇讲述非常好的文章。 http://blog.csdn.net/jiaomeng/article/details/1495500 ,其博客里还有很多关于Bloom

哈希表

ⅰ亾dé卋堺 提交于 2020-02-24 12:09:55
前言 # 哈希表,又名散列表。是非常常用的一种数据结构,C#的Hashtable、字典,Java的HashMap,Redis的Hash,其底层实现都是散列表。而在一些互联网公司的面试中,更是技术面试官们必问的一道题目。本文将简单了解哈希表(散列表)这种数据结构。 一、散列表 # 1.1 散列表 # 散列表(哈希表),其思想主要是基于数组支持按照下标随机访问数据时间复杂度为O(1)的特性。可是说是数组的一种扩展。假设,我们为了方便记录某高校数学专业的所有学生的信息。要求可以按照学号(学号格式为:入学时间+年级+专业+专业内自增序号,如2011 1101 0001)能够快速找到某个学生的信息。这个时候我们可以取学号的自增序号部分,即后四位作为数组的索引下标,把学生相应的信息存储到对应的空间内即可。 如上图所示,我们把学号作为key,通过截取学号后四位的函数后计算后得到索引下标,将数据存储到数组中。当我们按照键值(学号)查找时,只需要再次计算出索引下标,然后取出相应数据即可。以上便是散列思想。 1.2 散列函数 # 上面的例子中,截取学号后四位的函数即是一个简单的散列函数。 Copy //散列函数 伪代码 int Hash(string key) { // 获取后四位字符 string hashValue =int.parse(key.Substring(key.Length-4, 4)

Java LinkedHashSet集合概述和特点

好久不见. 提交于 2020-02-24 07:16:07
LinkedHashSet集合概述和特点 LinkedHashSet集合特点 哈希表和链表实现的Set接口, 具有可预测的迭代次序; 由链表保证元素有序,也就是说元素的存储和取出顺序是一致的; 由哈希表保证元素唯一, 也就是说没有重复的元素; 存储字符串并遍历: public class LinkedHashSetTest { public static void main ( String [ ] args ) { LinkedHashSet < String > linkedhs = new LinkedHashSet < > ( ) ; linkedhs . add ( "hello" ) ; linkedhs . add ( "world" ) ; linkedhs . add ( "java" ) ; linkedhs . add ( "world" ) ; for ( String s : linkedhs ) { System . out . println ( s ) ; } } } 来源: CSDN 作者: August98_LYH 链接: https://blog.csdn.net/qq_43472877/article/details/104457401

C数据结构与算法-基础整理-查找-02:哈希表的理解

大兔子大兔子 提交于 2020-02-24 01:04:52
0x01.什么是哈希表 散列表 (Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的 数据结构 。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做 散列函数 ,存放记录的 数组 叫做 散列表 。 给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。 存储位置=F(关键字) F称为散列函数或哈希函数。 采用散列技术奖记录存储在一块连续的存储空间中,这块连续的存储空间称为哈希表(或散列表)。 散列技术是一种存储方法,也是一种查找方法。 0x02.如何构造哈希函数 遵循的原则: 计算简单 散列地址分布均匀 常用方法: 随机数法:选择一个随机函数,取关键字的随机函数值为它的哈希地址。即H(key)=random(key),其中random为随机函数。适用于关键字长度不等时。 除留余数法:取关键字被某个不大于哈希表表长m的数p除后所得余数为哈希地址(p为素数) 折叠法:将关键字分割成位数相同的几部分(最后一部分的位数可不同),然后取这几部分的叠加和(舍去进位)作为哈希地址。适用于关键字位数比较多,且关键字中每一位上数字分布大致均匀时。 平方取中法:取关键字平方后的中间几位为哈希地址。

哈希表

孤街醉人 提交于 2020-02-23 10:50:38
1.什么是哈希表? 哈希表:根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映射到一个有限的连续的地址集(区间)上,并以关键字在地址集中的“像”作为记录在表中的存储位置,这种表便称为哈希表,这一映像过程称为哈希造表或散列,所得的存储位置称哈希地址或散列地址。 2.哈希表的特点: (1)哈希函数是一个映射,因此哈希函数的设定很灵活,只要使得任何关键字由此所得的哈希函数值都落在表允许的长度范围内即可; (2)对不同的关键字可能得到同一哈希地址,即key1≠key2,而f(key1)=f(key2),这种现象叫“冲突”。“冲突”只能减少不能避免,因为关键字数量巨大,而地址值只能为哈希表中的值,数量较小。 3.常用的构造哈希函数 1.直接定址法 取关键字的某个线性函数值为哈希地址。即:H(key)=key或H(key)=a*key+b,实际中很少用。 2.数字分析法 对关键字进行分析,尽量找随机性大的数字。 3.平方取中法 取关键字平方后的中间几位为哈希地址,这是一种较常用的构造哈希函数的方法。取的位数由表长决定。 4.折叠法 将关键字分割成位数相同的几部分(最后一部分的位数可以不同),然后取这几部分的折叠和(舍去进位)作为哈希地址,这方法称为折叠法。关键字位数很多,而且关键字中每一位上数字分布大致相同时,可以采用折叠法得到哈希地址。 5.除留余数法