面试必谈的哈希,.Net 程序员温故而知新
引言问题
作为资深老鸟,有事没事,出去面试;找准差距、定位价值。
面试必谈哈希,
Q1:什么是哈希?
Q2:哈希为什么快?
Q3:你是怎么理解哈希算法利用空间换取时间的?
Q4:你是怎么解决哈希冲突的?
Q5:你有实际用写过哈希算法吗?
知识储备
哈希(也叫散列)是一种查找算法(可用于插入),哈希算法希望能做到不经过任何比较(发生冲突,还是需要少许比较),通过一次存取就能得到查找的数据。
因此哈希的关键在key和数据元素的存储位置之间建立一个确定的对应关系,每个key在哈希表中都有唯一的地址相对应(形成有限、连续的地址空间),查找时根据对应关系经过一步计算得到key在散列表的位置。
在数学上, 原Key叫做原像,由映射函数h(key)映射的存储位置叫做像;在IT领域,以上存储位置叫哈希地址(散列地址),这个映射过程叫做哈希/散列。
故我们可以预见:
① 不同的key值,由哈希函数h(x) 作用后可能映射到同一个哈希地址, 这就是哈希冲突,冲突发生的概率取决于 定义的哈希函数
② 由哈希表作用后的哈希地址需要空间存储,这一系列连续相邻的地址空间叫哈希表、 散列表。
处理哈希冲突可分为两大类:
(1)开散列法发生冲突的元素存储于数组空间之外。可以把“开”字理解为需要另外“开辟”空间存储发生冲突的元素, 又称【链地址法】
(2)闭散列法发生冲突的元素存储于数组空间之内。可以把“闭”字理解为所有元素,不管是否有冲突,都“关闭”于数组之中,闭散列法又称【开放定址法】,意指数组空间对所有元素,不管是否冲突都是开放的
2. 看图说话
从图上看实现【哈希】过程分两部分:
① 哈希函数
收敛函数,不可避免会冲突,需要思考设定一个均衡的哈希函数,使哈希地址尽可能均匀地分布在哈希地址空间
② 构造哈希表 + 冲突链表
装填因子loadfactor :所谓装填因子是指哈希表中已存入的记录数n与哈希地址空间大小m的比值,即 α=n / m ,α越小,冲突发生的可能性就越小;α越大(最大可取1),冲突发生的可能性就越大;另一方面,α越小,存储窨的利用率就越低;反之,存储窨的利用率就越高。
为了既兼顾减少冲突的发生,又兼顾提高存储空间的利用率,通常把α控制在0.6~0.9的范围之内
哈希在.Net中的应用
GetHashCode方法
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方法。
面试必谈的哈希,.Net 程序员温故而知新的更多相关文章
- Coding girl一个老程序员谈到的一个女程序员的故事
因为有人说我给一个女程序员的建议不靠谱,我不服,因为我的工作经历中的一些女程序员都很不错,比那些男程序员都强,所以,我在新浪微博和twitter上征集女程序员的故事和想法,这两天来,我收到了好几封邮件 ...
- 浅谈月薪3万 iOS程序员 的职业规划与成长!(进阶篇)
前言: 干了这么多年的iOS,虽然接触了许多七七八八的东西.技术,但是感觉本身iOS却没有什么质的飞越,可能跟自己接触的项目深度有关,于是决定在学习其他技术的同时,加强自己在iOS方面的学习,提高自己 ...
- java 面试,java 后端面试,数据库方面对初级和高级程序员的要求
本内容摘自 java web轻量级开发面试教程 对于合格的程序员,需要有基本的数据库操作技能,具体体现在以下三个方面. l 第一,针对一类数据库(比如MySQL.Oracle.SQL Server等 ...
- 面试了一位33岁Android程序员,只会面向百度编程,居然要25k,脸呢?
最近逛论坛看到这样一个帖子: 面试了一位工作12年的程序员, 这位老哥有3年java开发经验,2年H5,7年Android开发经验,简历上写着精通Java,Android,熟悉H5开发.没有具体的技术 ...
- 大厂面试:一个四年多经验程序员的BAT面经(字节、阿里、腾讯)
前言 上次写了篇欢聚时代的面经,公众号后台有些读者反馈说看的意犹未尽,希望我尽快更新其他大厂的面经,这里先说声抱歉,不是我太懒,而是项目组刚好有个活动要赶在春节前上线,所以这几天经常加班,只能工作之余 ...
- 聊聊阿里社招面试,谈谈“野生”Java程序员学习的道路
引言 很尴尬的是,这个类型的文章其实之前笔者就写过,原文章里,笔者自称LZ(也就是楼主,有人说是老子的简写,笔者只想说,这位同学你站出来,保证不打死你,-_-),原文章名称叫做<回答阿里社招面试 ...
- 程序员面试必备经典CTCI,谷歌面试官经典作品!
1.1 判断一个字符串中的字符是否唯一 1.2 字符串翻转 1.3 去除字符串中重复字符 1.8 利用已知函数判断字符串是否为另一字符串的子串 2.1 从链表中移除重复结点 2.2 实现一个算法从一个 ...
- [置顶] 程序员必知(三):一分钟知道URI编码(encodeURI)
因为浏览器会用一些特殊的字符作为特定的意义,所以在要传输的内容上如果有这些特殊的字符的话,就需要对其进行转义才能正确传输,如以下字符为发送时候的关键字,即特殊字符 ;/?:@&=+$,# 所以 ...
- 程序员求职之道(《程序员面试笔试宝典》)之求职有用网站及QQ群一览表
技术学习网站 www.csdn.com www.iteye.com www.51cto.com http://www.cnblogs.com/ http://oj.leetcode.com/ http ...
随机推荐
- vuex分模块后,如何获取state的值
问题:vuex分模块后,一个模块如何拿到其他模块的state值,调其他模块的方法? 思路:1.通过命名空间取值--this.$store.state.car.list // OK 2.通过定义该属性的 ...
- 妹子问我maven是啥?从相亲说起。。
自从上一篇原创文章: 第一次教妹子安装IDEA 在<java技术之家>公号发表之后,大家的好评如潮,这给了我继续写下去的信心.感谢你们的支持,我会继续努力的. 自从漂亮妹妹加入我们研发团队 ...
- php+mysql新无线级分类
create table cat( id int unsigned not null primary key auto_increment, pid , path ) not null default ...
- Spring Environment抽象
1:概述 Spring中Environment是Spring3.1版本引入的,是Spring核心框架定义的一个接口,用来表示整个应用运行时环境.该环境模型只接受两种应用环境profiles(配置文件) ...
- docker命令总结
用 docker pull 拉取镜像 root@lishichao-virtual-machine:~# docker pull hello-world Using default tag: late ...
- Flutter学习笔记(3)--Dart变量与基本数据类型
一.变量 在Dart里面,变量的声明使用var.Object或Dynamic关键字,如下所示: var name = ‘张三’: 在Dart语言里一切皆为对象,所以如果没有将变量初始化,那么它的默认值 ...
- C语言学习书籍推荐《学习使用C指针(影印版)(英文本)》下载
<学习使用C指针(影印版)(英文本)>作者通过<学习使用C指针(影印版)(英文本)>中的内存模型为你展示了如何在数组.字符串.结构和函数中使用指针.虽然难以掌握,但是指针为C语 ...
- python接口自动化(三十四)-封装与调用--函数和参数化(详解)
简介 前面虽然实现了参数的关联,但是那种只是记流水账的完成功能,不便于维护,也没什么可读性,随着水平和技能的提升,再返回头去看前边写的代码,简直是惨不忍睹那样的代码是初级入门的代码水平都达不到.接下来 ...
- Docker学习第二天
CentOS 系列安装 Docker Docker 支持 CentOS6 及以后的版本. CentOS6 对于 CentOS6,可以使用 EPEL 库安装 Docker,命令如下 [root@MSJT ...
- STM32F4xx系列_独立看门狗配置
看门狗由内部LSI驱动,LSI是一个内部RC时钟,并不是准确的32kHz,然而看门狗对时间的要求不精确,因此可以接收: 关键字寄存器IWDG_KR: 写入0xCCCCH开启独立看门狗,此时计数器开始从 ...