字符串匹配是计算机的基本任务之一,举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。
这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。
字符串匹配是计算机的基本任务之一,举例来说,有一个字符串”BBC ABCDAB ABCDABCDABDE”,我想知道,里面是否包含另一个字符串”ABCDABD”?许多算法可以完成这个任务,Knuth-Morris-Pratt算法(简称KMP)是最常用的之一。
这种算法不太容易理解,网上有很多解释,但读起来都很费劲。直到读到Jake Boxer的文章,我才真正理解这种算法。下面,我用自己的语言,试图写一篇比较好懂的KMP算法解释。
OpenStack Swift 开源项目提供了弹性可伸缩、高可用的分布式对象存储服务,适合存储大规模非结构化数据。Swift利用一致性Hash算法构建了一个冗余扩展的分布式对象存储集群,Swift 采用一致性哈希的主要目的是在改变集群的 device 数量时,能够尽可能少地改变已存在 Key 和 device 的映射关系。本文就介绍 Swift 的一致性哈希算法。
一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。
一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:
平衡性(Balance):平衡性是指哈希的结果能够尽可能分布到所有的缓冲中去,这样可以使得所有的缓冲空间都得到利用。很多哈希算法都能够满足这一条件。
单调性(Monotonicity):单调性是指如果已经有一些内容通过哈希分派到了相应的缓冲中,又有新的缓冲加入到系统中。哈希的结果应能够保证原有已分配的内容可以被映射到原有的或者新的缓冲中去,而不会被映射到旧的缓冲集合中的其他缓冲区。
分散性(Spread):在分布式环境中,终端有可能看不到所有的缓冲,而是只能看到其中的一部分。当终端希望通过哈希过程将内容映射到缓冲上时,由于不同终端所见的缓冲范围有可能不同,从而导致哈希的结果不一致,最终的结果是相同的内容被不同的终端映射到不同的缓冲区中。这种情况显然是应该避免的,因为它导致相同内容被存储到不同缓冲中去,降低了系统存储的效率。分散性的定义就是上述情况发生的严重程度。好的哈希算法应能够尽量避免不一致的情况发生,也就是尽量降低分散性。
负载(Load):负载问题实际上是从另一个角度看待分散性问题。既然不同的终端可能将相同的内容映射到不同的缓冲区中,那么对于一个特定的缓冲区而言,也可能被不同的用户映射为不同 的内容。与分散性一样,这种情况也是应当避免的,因此好的哈希算法应能够尽量降低缓冲的负荷。
在分布式集群中,对机器的添加删除,或者机器故障后自动脱离集群这些操作是分布式集群管理最基本的功能。如果采用常用的hash(object)%N算法,那么在有机器添加或者删除后,很多原有的数据就无法找到了,这样严重的违反了单调性原则。接下来主要讲解一下一致性哈希算法是如何设计的。
买了一年的红杏会员,还有两三个月才到期就不能用了,被请去喝茶了?也是醉。话说用惯了红杏,现在翻不了墙也是不行,平日里好歹也要google查查资料的,遂花了五十块买了个Shadowsocks,配置挺麻烦的,设置的代理规则也不灵活。总之不太好用 :(

喜高怒重,过目辄忘,近“粗”。 –《冰鉴》
译:喜怒情感表现得很强烈,但又转瞬即逝的人,其气质近乎粗鲁。
遇到外界刺激,难免情绪波动,这是人的本能反应,但切不可放纵,要学会克制,学会忍耐。有时情绪带给人的负面影响是致命的,一个人若不能很好的控制自己的情绪,势必成不了大事。
周末去便利店的时候,顺手买了本《萌芽》,高中时的精神食粮,已经多年没有再看过了,现在读来也找不到当初的悸动,可能是过了年纪了。
遥想大学刚毕业那会儿,大家紧凑着住一间大屋子里,一起上班学习,现在也都陆陆续续散了。工作了这些年,早已没有了读书时的那份心境。也开始害怕寂寞,但也更厌倦了喧嚣。期间拒绝了同事合租的建议,我想着一个人安安静静的也还好,独处时倒可以多些思考与自省,虽有些寂寞,寂寞中却又有一种充实。大把的好时光可以用来读书、看球、玩游戏,有时也会登录ubuntu上面,撸撸代码。
我想,寂寞是难免的,能抵挡寂寞的,也唯有笔尖、键盘。
