哈希函数

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

孤街浪徒 提交于 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位)

海量数据处理面试题

江枫思渺然 提交于 2019-11-26 07:39:56
何谓海量数据处理? 所谓海量数据处理,无非就是基于海量数据上的存储、处理、操作。何谓海量,就是数据量太大,所以导致要么是无法在较短时间内迅速解决,要么是数据太大,导致无法一次性装入内存。 那解决办法呢?针对时间,我们可以采用巧妙的算法搭配合适的数据结构,如布隆过滤器/Hash/bit-map/堆/数据库或倒排索引/trie树,针对空间,无非就一个办法:大而化小,分而治之(hash映射),你不是说规模太大嘛,那简单啊,就把规模大化为规模小的,各个击破不就完了嘛。 海量数据处理主要方法: 分而治之-hash映射 + hash统计 + 堆排序/外排序 布隆过滤器 布隆过滤器+分层 哈希函数的性质: 典型的哈希函数都有无限的输入值域。 当给哈希函数传入相同的输入值时,返回值一样,即哈希值一样。 当给哈希函数传入不同的值时,返回值可能一样,也可能不一样。 很多不同的输入之所得到的返回值会均匀的分布在S上,S为输出域–范围固定。这条性质是评判一个哈希函数优劣的关键。 堆排序的注意点: 要找出最大的TopK,要建立最小堆,堆顶元素为最小的,先拿K个数建立最小堆,接下来每拿一个数都和堆顶元素比较,如果比堆顶元素大,则代替堆顶元素,然后对该堆进行凋整,使之成为最小堆。重复操作直到遍历所有数据。 要找出最小的TopK,要建立最大堆,每次与最大堆的堆顶元素比较,小于堆顶元素则代替堆顶元素,然后进行调整