哈希表

【数据结构】Hash表

寵の児 提交于 2019-11-30 06:18:15
【数据结构】Hash表 Hash表也叫散列表,是一种线性数据结构。在一般情况下,可以用o(1)的时间复杂度进行数据的增删改查。在Java开发语言中,HashMap的底层就是一个散列表。 1. 什么是Hash表 Hash表是一种线性数据结构,这种数据结构的底层一般是通过数组来实现的。在进行数据增删改查的时候,Hash表首先通过Hash函数对某个键值进行Hash操作,这个Hash操作会将这个键映射到数组的某个下标,获得下标以后就可以直接对数组中的数据进行操作了。理论上讲,Hash表数据操作的时间复杂度都是O(1)。 Hash表的底层是通过数组实现的。数据有个特点就是:必须在初始化的时候指定其长度。所以当Hash表中的数据填满之后想继续向里面放数据的话就必须再创建一个容量更大的数组,然后将之前数组中的数组copy到这个新数组中。这个过程是一个耗费性能的操作,因此我们在使用Hash表之前最好估算下数据的容量,尽量避免扩容操作。 2. Hash函数 哈希函数又称为散列函数,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,而不可能从散列值来唯一的确定输入值。假设输出值域为S,哈希函数的性质如下: 典型的哈希函数都有无限的输入值域;

LeetCode 841:钥匙和房间 Keys and Rooms

别等时光非礼了梦想. 提交于 2019-11-30 05:51:13
题目: ​ 有 N 个房间,开始时你位于 0 号房间。每个房间有不同的号码: 0,1,2,...,N-1 ,并且房间里可能有一些钥匙能使你进入下一个房间。 ​ 在形式上,对于每个房间 i 都有一个钥匙列表 rooms[i] ,每个钥匙 rooms[i][j] 由 [0,1,...,N-1] 中的一个整数表示,其中 N = rooms.length 。 钥匙 rooms[i][j] = v 可以打开编号为 v 的房间。 最初,除 0 号房间外的其余所有房间都被锁住。 你可以自由地在房间之间来回走动。 如果能进入每个房间返回 true ,否则返回 false 。 ​ There are N rooms and you start in room 0 . Each room has a distinct number in 0, 1, 2, ..., N-1 , and each room may have some keys to access the next room. ​ Formally, each room i has a list of keys rooms[i] , and each key rooms[i][j] is an integer in [0, 1, ..., N-1] where N = rooms.length . A key rooms[i][j] =

LeetCode Top 100 Liked Questions 128. Longest Consecutive Sequence (Java版; Hard)

独自空忆成欢 提交于 2019-11-30 05:46:05
welcome to my blog LeetCode Top 100 Liked Questions 128. Longest Consecutive Sequence (Java版; Hard) 题目描述 Given an unsorted array of integers, find the length of the longest consecutive elements sequence. Your algorithm should run in O(n) complexity. Example: Input: [100, 4, 200, 1, 3, 2] Output: 4 Explanation: The longest consecutive elements sequence is [1, 2, 3, 4]. Therefore its length is 4. 第一次做; 使用哈希表, 将暴力解法变成了时间复杂度为O(n)的最优解;使用哈希表并没有增加复杂度, 因为使用哈希表进行增删改查, 可以认为时间复杂度是O(1); 使用有序表(红黑树,AVL树,SB树,跳表)的大部分操作()都是O(logn)的, 少数是O(1)的; 理解如何去找子序列的下界; 理解为什么每个元素最多被访问两次 /* 暴力法之所以费时间是因为每个元素都可能被访问多次,

C#集合

爱⌒轻易说出口 提交于 2019-11-30 03:01:43
集合是专门用于数据存储和检索的类。这些类提供了堆栈,队列,列表,接口和哈希表的支持。大多数集合类实现了相同的接口。 各种集合类和他们的用法 动态数组   它代表了可被单独索引的对象的有序集合   他基本上可以替代一个数组。但是与数组不同的是,可以用索引在指定的位置添加和移除项目,动态数组会自动重新调整他的大小,它也允许在列表中进行动态内存分配,增加,搜索,排序各项 哈希表   它使用键来访问集合中的元素   当你使用键来访问元素时,则使用哈希表,而且可以识别到一个有用的键值。哈希表的每一项都是一个键值对,键用于访问集合中的项目 排序列表   它可以使用键和索引来访问列表中的项   排序列表是数组和哈希表的组合。它包含了它包含一个可使用键或索引访问各项的列表。如果您使用索引访问各项,则它是一个动态数组(ArrayList),如果您使用键访问各项,则它是一个哈希表(Hashtable)。集合中的各项总是按键值排序。 堆栈   它代表了一个后进先出的对象集合。   当您需要对各项进行后进先出的访问时,则使用堆栈。当您在列表中添加一项,称为推入元素,当您从列表中移除一项时,称为弹出元素 队列   它代表了一个先进先出的对象集合。   当您需要对各项进行先进先出的访问时,则使用队列。当您在列表中添加一项,称为入队,当您从列表中移除一项时,称为出队。 点阵列   它代表了一个使用值 1 和 0

Java Set集合的详解

拜拜、爱过 提交于 2019-11-30 02:56:55
一,Set Set:注重独一无二的性质,该体系集合可以知道某物是否已近存在于集合中,不会存储重复的元素 用于存储无序(存入和取出的顺序不一定相同)元素,值不能重复。 对象的相等性 引用到堆上同一个对象的两个引用是相等的。如果对两个引用调用hashCode方法,会得到相同的结果,如果对象所属的类没有覆盖Object的hashCode方法的话,hashCode会返回每个对象特有的序号(java是依据对象的内存地址计算出的此序号),所以两个不同的对象的hashCode值是不可能相等的。 如果想要让两个不同的Person对象视为相等的,就必须覆盖Object继下来的hashCode方法和equals方法,因为Object hashCode方法返回的是该对象的内存地址,所以必须重写hashCode方法,才能保证两个不同的对象具有相同的hashCode,同时也需要两个不同对象比较equals方法会返回true 该集合中没有特有的方法,直接继承自Collection。 ---| Itreable 接口 实现该接口可以使用增强for循环 ---| Collection 描述所有集合共性的接口 ---| List接口 可以有重复元素的集合 ---| ArrayList ---| LinkedList ---| Set接口 不可以有重复元素的集合 案例:set集合添加元素并使用迭代器迭代元素。

Java集合必会14问(精选面试题整理)

一世执手 提交于 2019-11-30 01:07:29
前言.... 前言:把这段时间复习的关于集合类的东西整理出来,特别是HashMap相关的一些东西,之前都没有很注意1.7 ->> 1.8的变化问题,但后来发现这其实变化挺大的,而且很多整理的面试资料都没有更新(包括我之前整理的...) 1)说说常见的集合有哪些吧? 答:Map接口和Collection接口是所有集合框架的父接口: Collection接口的子接口包括:Set接口和List接口 Map接口的实现类主要有:HashMap、TreeMap、Hashtable、ConcurrentHashMap以及Properties等 Set接口的实现类主要有:HashSet、TreeSet、LinkedHashSet等 List接口的实现类主要有:ArrayList、LinkedList、Stack以及Vector等 2)HashMap与HashTable的区别? 答: HashMap没有考虑同步,是线程不安全的;Hashtable使用了synchronized关键字,是线程安全的; HashMap允许K/V都为null;后者K/V都不允许为null; HashMap继承自AbstractMap类;而Hashtable继承自Dictionary类; 3)HashMap的put方法的具体流程? 图引用自:https://blog.csdn.net/u011240877/article

聊聊并发(四)深入分析ConcurrentHashMap

你说的曾经没有我的故事 提交于 2019-11-30 00:46:16
##术语定义## 哈希算法 :是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值。 哈希表 :根据设定的哈希函数H(key)和处理冲突方法将一组关键字映象到一个有限的地址区间上,并以关键字在地址区间中的象作为记录在表中的存储位置,这种表称为哈希表或散列,所得存储位置称为哈希地址或散列地址。 ##线程不安全的HashMap## 因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。如下代码: final HashMap<String, String> map = new HashMap<String, String>(2); Thread t = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10000; i++) { new Thread(new Runnable() { @Override public void run() { map.put(UUID.randomUUID().toString(), ""); } }, "ftf" + i).start(); } } }, "ftf"); t.start(); t.join(); ##效率低下的HashTable容器##

如何实现LRU算法

拈花ヽ惹草 提交于 2019-11-29 23:52:26
1.什么是LRU算法? LRU是一种缓存淘汰机制策略。 计算机的缓存容量有限,如果缓存满了就要删除一些内容,给新的内容腾位置。但是要删除哪些内容呢?我们肯定希望删掉那些没有用的缓存,而把有用的数据继续留在缓存中,方便之后继续使用。那么,什么样的数据我们可以判定为有用的数据呢? LRU缓存淘汰算法就是一种常用策略。LRU的全称是Least Recently Used,也就是说我们认为最近使用过的数据应该是有用的,很久都没用过的数据应该是无用的,缓存满了就优先删除那些很久没有用过的数据。 举个简单的例子,安卓手机都可以吧软件放在后台运行,比如我先后打开了“设置”、“手机管家”、“日历”,那么现在他们在后台排列的顺序是这样的: 但是这时候如果我访问了一下“设置”界面,那么“设置”就会被提前到第一个,变成这样: 假设我的手机只允许我同时打开3个应用程序,现在已经满了。那么如果我新开了一个应用“时钟”,就必须关闭一个应用为“时钟”腾出一个位置,那么关闭哪个呢? 按照LRU的策略,就关最底下的“手机管家”,因为那是最久未使用的,然后把新开的应用放到最上面: 现在你应该理解LRU策略了,当然还有其他缓存策略,比如不要按访问的时序来淘汰,而是按访问频率(LFU策略)来淘汰等等,各有应用场景。本文讲解LRU算法策略。 2、LRU算法描述 LeetCode上有一道LRU算法设计的题目

[转载]数据结构

走远了吗. 提交于 2019-11-29 22:33:54
目录 一、什么是数据结构? 二、数据结构的分类 三、线性结构 (1)栈 (2)队列 (3)单链表 (4)双链表 (5)哈希表 一、什么是数据结构? 数据结构是指相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字典等都是一种数据结构。 “程序=数据结构+算法” 二、数据结构的分类 数据结构按照其逻辑结构可分为线性结构、树结构、图结构 线性结构:数据结构中的元素存在一对一的相互关系 树结构 :数据结构中的元素存在一对多的相互关系 图结构:数据结构中的元素存在多对多的相互关系 下面就来说说线性结构,树结构见链接,图结构待续。。 三、线性结构 (1)栈 1、定义:栈是一个数据集合,可以理解为只能在一端进行插入或者删除操作的列表。 2、栈的特点:后进先出(last-in,first-out),简称LIFO表 3、栈的概念: 栈顶:允许插入和删除的这一端称之为栈顶 栈底:另一固定的一端称为栈底 空栈:不含任何元素的栈称为空栈 4、栈的基本操作: 进栈(压栈):push 出栈:pop 取栈顶:gettop 如图: 5、栈的Python实现 不需要自己定义,使用列表结构即可。 进栈函数:append 出栈函数:pop 查看栈顶元素:li[-1] li = [] li.append(1)

day07 总结

妖精的绣舞 提交于 2019-11-29 19:38:04
目录 元组内置方法 字典内置方法 散列表/哈希表存储数据 集合内置方法 数据类型总结 存值个数 有序or无序 可变or不可变 深浅拷贝(只针对可变数据类型) 深浅拷贝 拷贝 浅拷贝 深拷贝 元组内置方法 什么是元组(tuple):只可取不可更改的列表,元组一创建就被写死了 作用:元组一创建就被写死了 定义方式:()内用逗号隔开多个元素(可以为任意数据类型) 如果元组只有一个元素,必须得加逗号 使用方法 索引取值 索引切片 for循环 成员运算 len长度 index获取元素索引 count计数 有序or无序 有序 可变or不可变 压根没有这一说 定义元祖--》占用内存小--》写死了 字典内置方法 作用 储存多个数据,对每个数据具有描述 定义方式 {}内用逗号隔开多个键key(具有描述意义,不能为可变数据类型):值value(任意数据类型)对 使用方式 按key取值/按key修改值 添加值,没有就添加,有就修改 for循环 成员运算 len长度 keys/values/items get 获取(没有就返回None,可以给定一个默认值 update 更新(等同于list里的extend) fromkeys setdefault(只添加不修改) 有序or无序 无序 可变or不可变 可变 散列表/哈希表存储数据 相比较列表,哈希表插入/删除数据更快 首先对key做了哈希处理