面试必谈的哈希,.Net 程序员温故而知新


引言:

作为资深老鸟,有事没事,出去面试;找准差距、定位价值。

面试必谈哈希,

Q1:什么是哈希?

Q2:哈希为什么快?

Q3:你是怎么理解哈希算法利用空间换取时间的?

Q4:你是怎么解决哈希冲突的?

Q5:你有实际用写过哈希算法吗?

1. 知识储备

  哈希(也叫散列)是一种查找算法(可用于插入),哈希算法希望能做到不经过任何比较(发生冲突,还是需要少许比较),通过一次存取就能得到查找的数据。

因此哈希的关键在key和数据元素的存储位置之间建立一个确定的对应关系,每个key在哈希表中都有唯一的地址相对应(形成有限、连续的地址空间),查找时根据对应关系经过一步计算得到key在散列表的位置。

在数学上, 原Key叫做原像,由映射函数h(key)映射的存储位置叫做像;在IT领域,以上存储位置叫哈希地址(散列地址),这个映射过程叫做哈希/散列。

故我们可以预见:

  ① 不同的key值,由哈希函数h(x) 作用后可能映射到同一个哈希地址, 这就是哈希冲突,冲突发生的概率取决于 定义的哈希函数

  ② 由哈希表作用后的哈希地址需要空间存储,这一系列连续相邻的地址空间叫哈希表、 散列表。 

  处理哈希冲突可分为两大类:

  (1)开散列法发生冲突的元素存储于数组空间之外。可以把“开”字理解为需要另外“开辟”空间存储发生冲突的元素, 又称【链地址法】

  (2)闭散列法发生冲突的元素存储于数组空间之内。可以把“闭”字理解为所有元素,不管是否有冲突,都“关闭”于数组之中,闭散列法又称【开放定址法】,意指数组空间对所有元素,不管是否冲突都是开放的

   哈希表是用数组实现的一片连续的地址空间,两种冲突解决方案的区别在于发生冲突的元素是存储在这片数组的空间之外还是空间之内

2. 看图说话

640?wx_fmt=png

---以下是开散列法(链地址法)解决冲突的示意图------

  从图上看实现【哈希】过程分两部分:

① 哈希函数

  收敛函数,不可避免会冲突,需要思考设定一个均衡的哈希函数,使哈希地址尽可能均匀地分布在哈希地址空间

②  构造哈希表 + 冲突链表

  装填因子loadfactor :所谓装填因子是指哈希表中已存入的记录数n与哈希地址空间大小m的比值,即 α=n / m ,α越小,冲突发生的可能性就越小;α越大(最大可取1),冲突发生的可能性就越大。

  另一方面,α越小,存储窨的利用率就越低;反之,存储窨的利用率就越高。为了既兼顾减少冲突的发生,又兼顾提高存储空间的利用率,通常把α控制在0.6~0.9的范围之内

哈希在.Net中的应用

  Object基类中有GetHashCode方法,HashCode是一个数字值,用于在【基于哈希特性的集合】中插入和查找某对象;GetHashCode方法为需要快速检查对象相等性的算法提供此哈希代码;

  Do not test for equality of hash codes to determine whether two objects are equal. (Unequal objects can have identical hash codes.) To test for equality, call the ReferenceEquals or Equals method.  (重要的话要读3遍)

单纯判断【逻辑相等】时,本无所谓重写 GetHashCode方法;但若在基于hash的集合中快速查找/插入某元素,则一定要重写GetHashCode方法。

? 我们看一个实锤:

  统计参加Footabll,Basketball 两个球队的所有成员,自然会想到对 footabllTeam, basketballTeam 成员使用Union方法求并集 (A∪B)

  观察Union源码计算A,B并集的实现,内部会构造哈希表Set<TElement> 快速查找和插入并集元素,故我们需要给元素编写合适的哈希函数。

public static IEnumerable<TSource> Union<TSource>(this IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)

{

    if (first == null) throw Error.ArgumentNull("first");

    if (second == null) throw Error.ArgumentNull("second");

        return UnionIterator<TSource>(first, second, comparer);

}


static IEnumerable<TSource> UnionIterator<TSource>(IEnumerable<TSource> first, IEnumerable<TSource> second, IEqualityComparer<TSource> comparer)

{

      Set<TSource> set = new Set<TSource>(comparer);

      foreach (TSource element in first)

          if (set.Add(element)) yield return element;      //  Set 便是Union方法内部构造的哈希表

      foreach (TSource element in second)

           if (set.Add(element)) yield return element;

}


Union方法入口

640?wx_fmt=gif 

高潮来了,不是总说没处理过哈希冲突吗?结

【知识储备】

围观链地址法处理哈希冲突

因此有最佳实践: 当两对象重写Equal方法返回true时, 请务必重写GetHashCode方法为对象返回相同的hashcode。

话虽如此,写一个合适、均衡的哈希函数还是比较考验算法的。

在一般场景中,经验会帮助你编写哈希函数, 比如以上Person类中,字符串类型Name的HashCode总是相等的。

That‘all   看完了通篇文章的同栈猿,应该就可以回答文章引言 5大提问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/314502.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

P3804 【模板】后缀自动机 (SAM)

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个字符串sss&#xff0c;让你求sss中出现次数不为111的子串出现次数乘上该字串长度最大值。 ∣s∣≤1e6|s|\le 1e6∣s∣≤1e6 思路&#xff1a; 没学明白&#xff0c;不多bbbbbb&#xff0c;把树建出…

Grpc Proto To Nuget Package 插件使用说明

Grpc Proto To Nuget Package 是一个 VS 插件&#xff08;支持 VS2019&#xff09;&#xff0c;目的是将基于 gRPC 的接口定义 .proto 文件一键转成 Nuget Package&#xff0c;然后发布到私有仓库上。下载最新 GrpcProtoToNugetPackageTemplate.zip ASP.NET 的项目模板&#xf…

HDU 6071 Lazy Running(同余最短路的应用)

Lazy Running 思路 还是利用同余的思想&#xff0c;假设存在一条长度为kkk的路&#xff0c;那么也一定存在一条kbasek basekbase的路base2∗min(d1,d2)base 2 * min(d1, d2)base2∗min(d1,d2)。 dis[i][j]xdis[i][j] xdis[i][j]x表示的是&#xff0c;从2−>i2 -> i2…

P2408 不同子串个数 SAM

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 求sss中本质不同的字串个数。 1≤∣s∣≤1e51\le |s|\le 1e51≤∣s∣≤1e5 思路&#xff1a; 显然&#xff0c; 个数就是∑(len[i]−len[fa[i]])\sum (len[i]-len[fa[i]])∑(len[i]−len[fa[i]])。 //#pr…

.NET Core 3.0预览版7中的ASP.NET Core和Blazor更新

.NET Core 3.0 Preview 7现已推出&#xff0c;它包含一系列ASP.NET Core和Blazor的新更新。以下是此预览中的新功能列表&#xff1a;最新的Visual Studio预览包括.NET Core 3.0作为默认运行时Visual Studio中的顶级ASP.NET核心模板简化的网页模板组件的属性splattingTypeConver…

数列分块入门 (1 ~ 7)

分块 6277. 数列分块入门 1 分块思想 我们把每m个元素分成一块&#xff0c;所以我们总共的块数就是n/mn / mn/m块&#xff0c;一般情况下我们取mnm \sqrt{n}mn​.对于区间加操作&#xff0c;我们可以先暴力左右两边&#xff0c;然后对于中间的整块的部分的加减&#xff0c;…

UVA719 Glass Beads 最小表示 / 后缀自动机

传送门 题意&#xff1a; 求sss的最小表示。 ∣s∣≤1e4|s|\le 1e4∣s∣≤1e4 思路&#xff1a; 可以选择直接套最小表示法的板子&#xff0c;但也可以将sss复制&#xff0c;即ssssssssssss&#xff0c;对ssssss建samsamsam&#xff0c;让后贪心的找一个长度为nnn的字典序最…

你必须知道的Docker数据卷

本篇已加入《.NET Core on K8S学习实践系列文章索引》&#xff08;微信上暂无法访问&#xff0c;可以通过cnblogs博客园访问&#xff09;&#xff0c;可以点击查看更多容器化技术相关系列文章。本篇预计阅读时间为5分钟。01—Docker数据挂载到容器在Docker中&#xff0c;要想实…

牛客小白月赛11:Rinne Loves Data Structure

Rinne Loves Data Structure 思路 我们插入的位置大概分了四种&#xff1a; 第一种 显然我们找到比当前插入的值的pre&#xff0c;也就是比当前节点大的最小值。 第二种 我们只要找到当前节点的suc&#xff0c;也就是比当前节点小的&#xff0c;最大值。 第三种 我们只…

Harbour.Space Scholarship Contest 2021-2022 E. Permutation Shift 思维 + 剪枝

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个初始排列[1,2,3,...,n][1,2,3,...,n][1,2,3,...,n]&#xff0c;你可以选择一个kkk&#xff0c;将这个排列循环右移kkk次&#xff0c;让后最多交换mmm次任意的两个位置之间的数&#xff0c;将其变成给…

VS Code 1.37 发布!多达数十个图标迎来全新设计

今天&#xff08;北京时间 2019 年 8 月 9 日&#xff09;&#xff0c;微软发布了 Visual Studio Code 1.37 版本。此版本主要更新的内容包括&#xff1a;Full product icon refresh - 多达数十个图标迎来全新的现代化设计Edit string arrays in the Settings UI - 在配置编辑器…

欧拉筛模板

欧拉筛模板 const int N 1e5 10;vector<int> prime; bool st[N];void init() {st[0] st[1] 1;for(int i 2; i < N; i) {for(int j 0; j < prime.size() && i * prime[j] < N; j) {st[i * prime[j]] 1;if(i % prime[j] 0) break;}} }

Serilog 自定义 Enricher 来增加记录的信息

Serilog 自定义 Enricher 来增加记录的信息IntroSerilog 是 .net 里面非常不错的记录日志的库&#xff0c;结构化日志记录&#xff0c;而且配置起来很方便&#xff0c;自定义扩展也很方便Serilog is a diagnostic logging library for .NET applications. It is easy to set up…

Harbour.Space Scholarship Contest 2021-2022 F. Pairwise Modulo 逆向思维 + 树状数组

传送门 文章目录题意思路&#xff1a;题意 给定一个不同数组成的序列aaa&#xff0c;定义pkp_kpk​为pk∑i1k∑j1kaimodajp_k\sum_{i1}^k\sum_{j1}^ka_i\bmod a_jpk​∑i1k​∑j1k​ai​modaj​&#xff0c;让你对于每个i∈[1,n]i\in [1,n]i∈[1,n]求出pip_ipi​。 2≤n≤2e5,…

miller_rabin 证明与实现

143. 质数判定__模板题链接 前置知识 费马小定理&#xff1a;ppp是质数&#xff0c;则对于任意的aaa&#xff0c;aaa与ppp互质&#xff0c;则有ap−1≡1(modp)a ^ {p - 1} \equiv 1 \pmod {p}ap−1≡1(modp)。 二次探测定理&#xff1a;如果ppp是一个质数&#xff0c;x2≡1(…

基于@media (prefers-color-scheme: [dark|light])的暗黑与亮色主题切换

今天有人反馈使用pdf.js的时候&#xff0c;发现pdf.js阅读器在自己的Mac Book电脑上显示的背景是暗黑色&#xff0c;而别人的电脑上却是白色&#xff1a; 根据这个问题&#xff0c;找到了pdf.js使用的view.css有段代码&#xff0c;类似这样&#xff1a; media (prefers-color-…

做「容量预估」可没有true和false

这里是Z哥的个人公众号每周五11&#xff1a;45 按时送达当然了&#xff0c;也会时不时加个餐&#xff5e;我的第「85」篇原创敬上随着20年来互联网的蓬勃发展&#xff0c;一个软件系统所要面对的访问压力上限被逐渐提高。虽然如此&#xff0c;但是那些体量达到亿级或者是千万级…

P3396 哈希冲突 根号分治

传送门 文章目录题意&#xff1a;思路&#xff1a;题意&#xff1a; 给你一个长度为nnn的数组aaa&#xff0c;每次操作有两种&#xff1a; (1)(1)(1) 给出x,yx,yx,y&#xff0c;问aaa中下表在模xxx的时候&#xff0c;模数等于yyy的位置aia_iai​之和。 (2)(2)(2) 给出x,yx,yx,…

miller_rabin 模板

miller_rabin 模板 ll quick_mult(ll a, ll b, ll mod) {ll ans 0;while(b) {if(b & 1) ans (ans a) % mod;a (a a) % mod;b >> 1;}return ans; }ll quick_pow(ll a, ll n, ll mod) {ll ans 1;while(n) {if(n & 1) ans quick_mult(ans, a, mod);a quick…

你不得不了解的10款服务器监控工具

监控Web服务器或Web主机的运行状况和正常运行非常重要。如果希望确保您的网站可用性在您的控制之中&#xff0c;那你就需要收集服务器各种性能数据以供分析和调整。以下是收集的常用大多数服务器监控组件解决方案。01Performance Co-PilotPerformance Co-Pilot&#xff0c;简称…