算法与数据结构,c和jave先学哪个会比较好?
谢谢邀请,作为具有8年Java一线开发经验的我,来谈谈我个人的看法。
首先c语言是编程入门语言,先学c语言会培养你的编程思维以及动手解决问题能力,可直接在硬件上运行的一种语言,入门相对简单。
Java是面向对象的一种开发语言也是现在应用最广需求量最大的一种开发语言,但是Java体系庞大学习周期长,如果以就业为目的,建议Java作为主导方向。
算法对数学功底以及逻辑思维能力要求较高,这个需要看自身素质来决定。学成之后工资也高,毕竟不是每个人都能成为好的算法工程师的
数据结构是各个开发语言的基础,要想有扎实的基本功,在有了一定开发经验后,要在数据结构上多下功夫,这样才能有更好的提高。
推荐学习路线 第一种 先学c语言 其次Java 数据结构
第二种 c语言 算法 数据结构
两种路线的选择主要看你今后的发展方向和兴趣。
最后希望我的回答能帮助到你
想通过面试成为JAVA程序员,要掌握哪些常用的算法和数据结构?
作为优秀的程序员,基础算法,如算法导论里面常见的算法要知其原理,学习算法思维思想。
在业务层面,也有一些和你工资内容相关的应用级算法,也需要了解学习。
最根本的是,学习算法思想,怎么去追求极致的算法性能和方法
JAVA面试又被问一致性hash算法,到底啥是一致性hash?
我来给大家讲讲一致性hash算法,如果有理解错误的地方,也请大家留言指正。
单台服务器
就拿Redis来举例吧,我们经常会用Redis做缓存,把一些数据放在上面,以减少数据的压力。
当数据量少,访问压力不大的时候,通常一台Redis就能搞定,为了高可用,弄个主从也就足够了;
多台服务器数据分布的问题
当数据量变大,并发量也增加的时候,把全部的缓存数据放在一台机器上就有些吃力了,毕竟一台机器的资源是有限的,通常我们会搭建集群环境,让数据尽量平均的放到每一台Redis中,比如我们的集群中有三台Redis。
那么如何把数据尽量平均地放到这三台Redis中呢?最简单的就是求余算法:hash(key)%N,在这里N=3。
看起来非常地美好,因为依靠这样的方法,我们可以让数据平均存储到三台Redis中,当有新的请求过来的时候,我们也可以定位数据会在哪台Redis中,这样可以精确地查询到缓存数据。
但是注意了,如果要增加一台Redis,或者三台中的一台Redis发生了故障变成了两台,那么这个求余算法就会变成:hash(key)%4或者hash(key)%2;那么可以想象一下,当前大部分缓存的位置都会是错误的,极端情况下,所有的缓存的位置都要发生改变,这样会造成【缓存雪崩】。
一致性hash算法
一致性hash算法可以很好地解决这个问题,它的大概过程是:
把0作为起点,2^32-1作为终点,画一条直线,再把起点和终点重合,直线变成一个圆,方向是顺时针从小到大。0的右侧第一个点是1,然后是2,以此类推。
对三台服务器的IP或其他关键字进行hash后对2^32取模,这样势必能落在这个圈上的某个位置,记为Node1、Node2、Node3(图1)。
然后对数据key进行相同的操作,势必也会落在圈上的某个位置;然后顺时针行走,可以找到某一个Node,这就是这个key要储存的服务器(图2)。
如果增加一台服务器或者删除一台服务器,只会影响部分小部分数据(图3)。
如果节点太少或分布不均匀的时候,容易造成数据倾斜,也就是被数据会集中在某一台服务器上(图4)。
为了解决数据倾斜问题,一致性Hash算法提出了【虚拟节点】,会对每一个服务节点计算多个哈希,然后放到圈上的不同位置(图5)。
原谅我的小学生字体,下一次我一定好好地画一画图,电脑上画的那种。
我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
其实不光光是Java面试,其它编程语言的面试过程中往往也会问及一致性Hash算法问题,不少开发者可能听说过“一致性Hash”这个术语,但却不了解什么是一致性Hash,一致性Hash是用来解决什么问题的。
“Hash算法”与“一致性Hash算法”是不同的概念
不少人容易把“Hash算法”与“一致性Hash算法”混淆,甚至认为两者是同个意思。其实,“Hash算法”与“一致性Hash算法”是不同的概念,“一致性Hash算法”是一种特殊的“Hash算法”!
1、Hash算法
Hash算法有很多种说法,如:散列函数、哈希算法等,它是一种函数,用来把任意长度的内容通过Hash算法转换为固定长度的输出。
常见的Hash算法有:MD5、SHA1等。MD5都用过,任何长度的字符串经过MD5处理后会得到固长的Hash值。
2、一致性Hash算法
一致性Hash算法是在Hash算法基础上建立和改进的,它是一种分布式算法,能确保数据的分布平衡性,常用于负载均衡类的应用。
一致性Hash算法与普通取模Hash算法的区别
1、普通取模Hash
普通取模(余数)Hash算法很简单,就是:Hash值 % 节点数 。这种方式,一旦节点数变化了,原先的Hash结果与节点的映射全部失效!
2、一致性Hash算法
一致性Hash算法与普通取模Hash算法不同,它是对 2^32 取模。比如:hash(服务器IP地址) % 2^32 。
一致性Hash算法对于节点的增减只需要重新定位环空间的小部分数据,因此具有很好的容错性和可扩展性。
通俗的说就是,一致性Hash算法可以确保:在增加服务器节点或移除节点时,对原有服务器和用户之间的映射关系影响最小!
一致性Hash算法的应用场景
现在的互联网系统业务绝大多数都是分布式的,所以扩容缩容操作较为常见。
一致性Hash算法的常用场景有:
Redis集群的应用
分库分表
以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!

