哈希表

leetcode 146:LRU缓存机制(python)

放肆的年华 提交于 2019-11-26 19:29:12
题目 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制。它应该支持以下操作: 获取数据 get 和 写入数据 put 。 获取数据 get(key) - 如果密钥 (key) 存在于缓存中,则获取密钥的值(总是正数),否则返回 -1。 写入数据 put(key, value) - 如果密钥不存在,则写入其数据值。当缓存容量达到上限时,它应该在写入新数据之前删除最近最少使用的数据值,从而为新的数据值留出空间。 进阶: 你是否可以在 O(1) 时间复杂度内完成这两种操作? 示例: LRUCache cache = new LRUCache( 2 /* 缓存容量 */ ); cache.put(1, 1); cache.put(2, 2); cache.get(1); // 返回 1 cache.put(3, 3); // 该操作会使得密钥 2 作废 cache.get(2); // 返回 -1 (未找到) cache.put(4, 4); // 该操作会使得密钥 1 作废 cache.get(1); // 返回 -1 (未找到) cache.get(3); // 返回 3 cache.get(4); // 返回 4 来源:力扣(LeetCode) 链接: LeetCode146. LRU缓存机制 著作权归领扣网络所有。商业转载请联系官方授权

布隆过滤器

百般思念 提交于 2019-11-26 19:12:23
布隆过滤器 前言 布隆过滤器原理 布隆过滤器优缺点 优点 缺点 使用场景 前言   Hash(散列)函数在计算机领域,尤其是数据快速查找领域,加密领域用的极广。其作用是将一个大的数据集映射到一个小的数据集上面(这些小的数据集叫做哈希值,或者散列值)。   一个应用是Hash Table(散列表,也叫哈希表),是根据哈希值 (Key value) 而直接进行访问的数据结构。也就是说,它通过把哈希值映射到表中一个位置来访问记录,以加快查找的速度。 哈希函数有以下两个特点: 如果两个散列值是不相同的(根据同一函数),那么这两个散列值的原始输入也是不相同的。 散列函数的输入和输出不是唯一对应关系的,如果两个散列值相同,两个输入值很可能是相同的。 但也可能不同,这种情况称为 “散列碰撞”(或者 “散列冲突”)。 缺点:引用吴军博士的《数学之美》中所言,哈希表的空间效率还是不够高。如果用哈希表存储一亿个垃圾邮件地址,每个email 地址 对应 8 bytes, 而哈希表的存储效率一般只有50%,因此一个email地址需要占用 16 bytes. 因此一亿个 email 地址占用1.6GB,如果存储几十亿个 email address 则需要上百GB的内存。除非是超级计算机,一般的服务器是无法存储的。 所以要引入布隆过滤器。 布隆过滤器原理 如果想判断一个元素是不是在一个集合里

Redis相关面试题

你。 提交于 2019-11-26 18:17:05
1 、 Redis 和 memched 有什么区别?为什么单线程的 Redis 比多线程的 Memched 效率要高? 区别: 数据支持类型: Redis: String(字符串):key-value 类型 Hash(哈希):字典(hashmap) Redis的哈希结构可以使你像在数据库中更新一个属性一样只修改某一项属性值 List(列表):实现消息队列 Set(集合):利用唯一性 Sorted Set(有序集合):可以进行排序 可以实现数据持久化 Bitmaps(位图) HyperLogLog、Geo(地理信息定位) Memched:简单的key/value数据类型 数据持久性: Redis:Redis通过RDB(Redis DataBase)与AOF(Append Only File)持久化,可以将内存中的数据保存到硬盘中,然后重启之后在读取数据。 这里说明一下RDB和AOF的原理: RDB:是在达到指定的时间或者操作次数后,自动将在内存中的数据写入磁盘(数据恢复时一致性和完整性较差,因为也许最后一次备份前就宕机了,适合数据量较大的数据恢复时候使用) AOF:是日志形式,当数据写入内存中的时候,在日志文件下记录下所有写操作。(数据量较大时,数据的恢复缓慢) 注意:如果不需要持久化的功能,可以关闭。如果想要达到持久化的效果,建议两者都使用(RDB,AOF) Memched

好程序员Java学习路线之集合

╄→гoц情女王★ 提交于 2019-11-26 17:00:02
好程序员 Java 学习路线之集合,最近收到一些朋友的信息,问一下管关于集合的问题,今天就简单的聊一下。 1.1什么是Iterator? 概念: Iterator是一个接口,它是集合的迭代器,集合可以通过Iterator去遍历集合中的元素,常用API接口:   例子: 注意: ( 1)Iterator只能单向移动。 ( 2)Iterator.remove()是唯一安全的方式来在迭代过程中修改集合;如果在迭代过程中以任何其它的方式修改了基本集合将会产生未知的行为。而且每调用一次next()方 法,remove()方法只能被调用一次,如果违反这个规则将抛出一个异常。 1.2什么是ListIterator 概念: ListIterator的功能更加强大, 它继承于Iterator接口,只能用于各种List类型的访问。可以通过调用listIterator()方法产生一个指向List开始处的ListIterator, 还可以调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator,汉化API如下:    由此我们可以推断出 ListIterator可以:   (1)双向移动(向前/向后遍历).   (2)产生相对于迭代器在列表中指向的当前位置的前一个和后一个元素的索引.   (3)可以使用set()方法替换它访问过的最后一个元素.   (4

平方探测法hash

寵の児 提交于 2019-11-26 16:31:03
数据结构实验之查找五:平方之哈希表 Time Limit: 400MS Memory Limit: 65536KB Problem Description 给定的一组无重复数据的正整数,根据给定的哈希函数建立其对应hash表,哈希函数是H(Key)=Key%P,P是哈希表表长,P是素数,处理冲突的方法采用平方探测方法,增量di=±i^2,i=1,2,3,...,m-1 Input 输入包含多组测试数据,到 EOF 结束。 每组数据的第1行给出两个正整数N(N <= 500)和P(P >= 2N的最小素数),N是要插入到哈希表的元素个数,P是哈希表表长;第2行给出N个无重复元素的正整数,数据之间用空格间隔。 Output 按输入数据的顺序输出各数在哈希表中的存储位置 (hash表下标从0开始),数据之间以空格间隔,以平方探测方法处理冲突。 Example Input 4 11 10 6 4 15 9 11 47 7 29 11 9 84 54 20 30 Example Output 10 6 4 5 3 7 8 0 9 6 10 2 1 Hint Author xam 代码: /**平方探测法的哈希处理**/ #include<iostream> #include<cstdio> #include<cstring> using namespace std; int main(){

PAT 1078 Hashing(25 分)(哈希+平方探测法)

社会主义新天地 提交于 2019-11-26 16:26:22
The task of this problem is simple: insert a sequence of distinct positive integers into a hash table, and output the positions of the input numbers. The hash function is defined to be H(key)=key%TSize where TSize is the maximum size of the hash table. Quadratic probing (with positive increments only) is used to solve the collisions. Note that the table size is better to be prime. If the maximum size given by the user is not prime, you must re-define the table size to be the smallest prime number which is larger than the size given by the user. Input Specification: Each input file contains one

互联网公司面试经——你不得不知道的哈希表

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

数据结构与算法之美学习笔记:Word文档中的单词拼写检查功能是如何实现的?(第18讲)

我怕爱的太早我们不能终老 提交于 2019-11-26 14:16:21
通过上一节的学习,我们知道,散列表的查询效率并不能笼统地说成是O(1)。它跟散列函数、装载因子、散列冲突等都有关系。如果散列函数设计得不好, 或者装载因子过大,都可能导致散列冲突发生的概率升高,查询效率下降。 在极端情况下,有些恶意的攻击者,还有可能通过精⼼构造的数据,使得所有的数据经过散列函数之后,都散列到同一个槽里。如果我们使用的是基于链表的冲突解决冲法, 那这个时候,散列表就会退化为链表,查询的时间复杂度就从O(1)急剧退化为O(n)。 如果散列表中有10万个数据,退化后的散列表查询的效率就下降了10万倍。更直接点说,如果之前运⾏100次查询只需要0.1秒,那现在就需要1万秒。 这样就有可能因为查询操作消耗耗量CPU或者线程资源,导致系统无法响应其他请求,从而达到拒绝服务攻击(DoS)的⽬的。这也就是散列表碰撞攻击的基本原理 今天,我们就来学习⼀下, 如何设计一个可以应对各种异常情况的⼯业级散列表,来避免在散列冲突的情况下,散列表性能的急剧下降,并且能抵抗散列碰撞攻击? 一、散列思想 散列表用的是数组支持按照下标随机访问数据的特性,所以三列表其实就是数组的一种扩展,由于数组演化而来,可以说、如果没有数组、就没有散列表 按照编号查找选手信息,效率是不是很高 时间复杂度就是 O(1) 参赛编号(6位数) 年级(前2位)+班级(中间2位)+编号(最后2位)

java面经整理(1)

纵然是瞬间 提交于 2019-11-26 12:59:19
一.链表相加 考点:leetcode原题: You are given two linked lists representing two non-negative numbers. The digits are stored in reverse order and each of their nodes contain a single digit. Add the two numbers and return it as a linked list. Input: (2 -> 4 -> 3) + (5 -> 6 -> 4) Output: 7 -> 0 -> 8 注意点:1.只能是个位,注意代码对取个位和进位的处理 2.单链表结点概念掌握.next指向下一个结点数 /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */ public class Solution { public ListNode addTwoNumbers(ListNode l1, ListNode l2) { if (l1== null ) return l2;

学习笔记 哈希表

守給你的承諾、 提交于 2019-11-26 12:58:31
最近开始把之前欠的NOIP基础知识点刷一下 2333其实我的作业还没有写完 做到哈希表的时候,我有点懵, 显然前几次讲课的时候我没有听 于是Lbmttw_lx就开始在网上学习了 (啊啊啊 沙雕橘猫真心可爱,爱了爱了) 发现其实Hash表是个比较有趣的东西 (一种典型的 空间换时间 的数据结构,也叫散列表) 时间复杂度O(1)查询 哈希表之所以能过做到O(1)查询,是因为它的查询是直接按照关键字 Key Value 来的 也就是说,它将关键字通过某种规则映射到数组中的某个位置,以加快查找的速度。 哈希表中的每一个元素,都应该有且只有一个地址。 如果两个元素都拥有一个地址,就产生了哈希冲突,发生冲突的不同关键字被称之为 同义词。 处理哈希冲突有很多方法,但是都是 基于处理关键字 而来的,尽可能让关键字都不相同。 那么,关键字是如何来的呢?其实就是 哈希函数 处理得到的。 首先是哈希函数H,H就是赋予特定元素特定的地址的函数, 哈希表则是基于哈希函数而建立起来的查找表 那么问题来了,既然哈希函数这么好,我们如何构造它呢?? 有好几种构造哈希函数的方法,分别是 1.直接定址法 2.数学分析法 3.平方取中法 4.折叠法 5.除留余数法 由于第一种 和第五种方法可能用到的比较广泛,主要说一下这两种吧 我是不会告诉你们剩下几种我也不会的! 1.直接定址法