求职宝典

面试技巧j***a面试算法,面试技巧j***a面试算法题

大家好,今天小编关注到一个比较有意思的话题,就是关于面试技巧java面试算法问题,于是小编就整理了3个相关介绍面试技巧Java面试算法的解答,让我们一起看看吧。

  1. 想通过面试成为JAVA程序员,要掌握哪些常用的算法和数据结构?
  2. JAVA面试又被问一致性hash算法,到底啥是一致性hash?
  3. 面对一工科男来应聘算法工程师,却不知道int是几个字节,一个字节有几位,这是一种怎样的体验?

通过面试成为J***A程序员,要掌握哪些常用的算法和数据结构?

作为优秀程序员,基础算法,如算法导论里面常见的算法要知其原理,学习算法思维思想。

业务层面,也有一些和你工资内容相关的应用级算法,也需要了解学习。

面试技巧java面试算法,面试技巧java面试算法题
图片来源网络,侵删)

最根本的是,学习算法思想,怎么去追求极致的算法性能和方法

J***A面试又被问一致性hash算法,到底啥是一致性hash?

环割法(一致性 hash)

环割法的原理如下:

面试技巧java面试算法,面试技巧java面试算法题
(图片来源网络,侵删)

1. 初始化的时候生成分片数量 X × 环割数量 N 的固定方式编号的字符串,例如 SHARD-1-NODE-1,并计算所有 X×N 个字符串的所有 hash 值。

2. 将所有计算出来的 hash 值放到一个排序的 Map 中,并将其中的所有元素进行排序。

3. 输入字符串的时候计算输入字符串的 hash 值,查看 hash 值介于哪两个元素之间,取小于 hash 值的那个元素对应的分片为数据的分片。

面试技巧java面试算法,面试技巧java面试算法题
(图片来源网络,侵删)

跳跃法(jumpstringhash)

跳跃法的原理如下:

1. 根据公式:

将数据落在每一个节点的概率进行平均分配。

2. 对于输入的字符串进行计算 hash 值,通过判断每次产生的伪随机值是否小于当前判定的节点 1/x,最终取捕获节点编号最大的作为数据的落点。

举个应用场景:分布式存储

现在互联网面对的都是海量的数据和海量的用户,我们为了提高数据的读取,写入能力一般都***用分布式的方式来存储数据,比如分布式缓存。我们有海量的数据需要缓存,所以一台机器是肯定不够的,于是我们需要将数据分布在多台机器上。

如何决定哪些数据放在那台机器上,可以借助数据分片的思想,***用hash算法对数据取hash值,然后对机器取模,这个最终值就是存储缓存的机器编号。

但是如果数据增多,原来的10台机器不够,需要扩容到13台机器,那么原来数据是通过与10来取模的,比如15这个数据,与10取模就是5,现在与13取模就是2。机器的编号完全变了,扩容并不是简单的增加机器,而是需要重新计算机器上的缓存存储位置。这无疑是一件很头疼的问题。

所以,我们需要一种方法,是的新加入机器后,并不需要做大量的数据搬迁,这时候就需要用到一致性hash算法了。

***设我们有k个机器,数据的hash范围是[0-Max],现在我们将范围划分为m个小区间(m要远大于k),每个机器负责m/k个区间,当有新机器加入时,我们只需要将某几个小区间的数据搬运到新的机器上即可,这样既不用全部搬移数据,也保持了各个机器的数据均衡。

一致性hash算法,常被应用到分布式集群缓存中。

其原理主要是把节点(做缓存的物理主机,如IP)和数据(要缓存的具体数据)都做一次哈希运算,然后把数据缓存到哈希运算后离得最近的节点上去。

此处借个图

其中,右边的深蓝色的表示节点,橘色的表示数据,然后按顺时针方向去寻找最近的节点就可以了……

需要注意的地方有

第一,节点和数据在哈希运算(取模)过程中用到的除数是一致的。如节点的哈希运算为hash(服务器的IP地址)% 2^32,数据的哈希运算为hash (数据名称)% 2^32等。

第二,哈希运算后,所有的结果都分布在一个哈希环上。

第三,节点的分布可能并不是均衡的,所以会加入左边浅蓝色的虚拟节点。

优点

万一有节点挂掉或者新加节点,不会影响其它的节点和缓存数据,原因很简单,就在那个取模的除数上。

其实不光光是J***a面试,其它编程语言的面试过程中往往也会问及一致性Hash算法问题,不少开发者可能听说过“一致性Hash”这个术语,但却不了解什么是一致性Hash,一致性Hash是用来解决什么问题的。

不少人容易把“Hash算法”与“一致性Hash算法”混淆,甚至认为两者是同个意思。其实,“Hash算法”与“一致性Hash算法”是不同的概念,“一致性Hash算法”是一种特殊的“Hash算法”!

1、Hash算法

Hash算法有很多种说法,如:散列函数、哈希算法等,它是一种函数,用来把任意长度的内容通过Hash算法转换为固定长度的输出。

常见的Hash算法有:MD5、SHA1等。MD5都用过,任何长度的字符串经过MD5处理后会得到固长的Hash值。

2、一致性Hash算法

一致性Hash算法是在Hash算法基础上建立和改进的,它是一种分布式算法,能确保数据的分布平衡性,常用于负载均衡类的应用。

1、普通取模Hash

普通取模(余数)Hash算法很简单,就是:Hash值 % 节点数 。这种方式,一旦节点数变化了,原先的Hash结果与节点的映射全部失效!

我来给大家讲讲一致性hash算法,如果有理解错误的地方,也请大家留言指正。

就拿Redis来举例吧,我们经常会用Redis做缓存,把一些数据放在上面,以减少数据的压力

当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了;

当数据量变大,并发量也增加的时候,把全部的缓存数据放在一台机器上就有些吃力了,毕竟一台机器的***是有限的,通常我们会搭建集群环境,让数据尽量平均的放到每一台Redis中,比如我们的集群中有三台Redis。

那么如何把数据尽量平均地放到这三台Redis中呢?最简单的就是求余算法:hash(key)%N,在这里N=3。

看起来非常地美好,因为依靠这样的方法,我们可以让数据平均存储到三台Redis中,当有新的请求过来的时候,我们也可以定位数据会在哪台Redis中,这样可以精确地查询到缓存数据。

面对一工科男来应聘算法工程师,却不知道int是几个字节,一个字节有几位,这是一种怎样的体验?

算法工程师目前的分工比较细,有不少算法工程师并不做算法实现,所以在编程语言的使用方面也可能存在不熟悉的情况。但是现在不少程序员对基础知识的掌握也没有以前那么扎实,这是一个比较明显的现象。

我经常作为面试官参加一些企业的程序员面试工作,在面试的过程中我一般会问一些比较基础的问题,以便于了解程序员的基础知识结构。像int是几个字节的问题我也问过,大部分程序员是能够回答上来的。类似的问题还有计算机端口号的范围、网络寻址方式、TCP协议与UDP协议的区别、接口的作用、XOR运算的规则等等问题,一般这些问题都是问初级程序员比较多,对于中高级程序员则一般问一些具体的解决方案。

对于一些简单的基础问题的回答能反映出程序员的基础知识结构,按照历史经验来看,对于一些非计算机专业的程序员来说可能在回答这些问题的时候会显得吃力,因为目前的很多程序设计语言都比较简单,在很多实验中也练习不到这些基础知识,但是这些基础知识对程序员来说还是比较重要的。

很多情况下,即使没有回答上来一些基础性的问题也不要气馁,毕竟现在的开发环境与早些年有很大的不同,程序设计更多的关注于模块化、扩展性等问题。但是基础知识的掌握对于程序员来说还有很有必要的,尤其是一些常识性问题。

我使用J***a、C和Python的时间比较长,也在头条上陆续写了一些关于程序设计、大数据方面的文章,对这些内容感兴趣的[_a***_]可以关注我,相信一定会有所收获。

谢谢!

面试要找对方优点,而不是缺点。寸有所长,尺有所短。没有人是完美的,也不是什么都懂。招人不是要找一个什么都懂的完美人,而是要找一个为我所用的可以对组织发挥价值的人。要看看他自认为最擅长的领域,到底如何。

比如这个来应聘算法的,那么就考他的算法。请他讲一个他认为最有意思的算法,他最熟悉的算法,他遇到过的最难的算法,然后看看他对算法理解深度和广度,算法的时间和空间复杂度,如何优化,以及他阅读过哪些文章或者有趣的相关话题,看他的思维模式、解决问题的技巧、表达沟通能力。

他说J***a厉害,那就考J***a,就不要问C++的问题。他说Python强,就让他用Python写两个程序,就不要问bit的问题。他说不会,你就不用问,他说精通,你就试探他的深度。他说忘记怎么写代码了,你就让他来画图描述算法。

一些初级面试官,就喜欢问面试官自己熟悉而别人不懂的题目,虽然显示面试官技术很厉害的样子,对公司来说价值不大。其实,反过来让应聘者问几个面试官问题,面试官表现也许也差不多。

一些短视的面试官喜欢考“经验”,就是问“这个你懂不懂”。如果找来都是面试官已经懂的人过来,那么找这样的人过来只是干活儿,这个团队地知识领域和视野还是那么一亩三分地而已。如果招来现在团队里还没有人了解和精通的领域的候选人,那才是部门的开疆辟土之士。对于准备建立一个有效团队的领导者来说,更注重“人品”和“潜力”。你对某个方面技术很深,那么我要来推测在新的领域,是否也可以快速成长成为新的专家。我见过不少聪明的有潜力的人,一两年后发展比原来有经验的人强,而且可扩展性更强。

到此,以上就是小编对于面试技巧j***a面试算法的问题就介绍到这了,希望介绍关于面试技巧j***a面试算法的3点解答对大家有用。

[免责声明]本文来源于网络,不代表本站立场,如转载内容涉及版权等问题,请联系邮箱:83115484@qq.com,我们会予以删除相关文章,保证您的权利。 转载请注明出处:http://www.dkcfns.com/post/83386.html

分享:
扫描分享到社交APP