一致性hash算法

来源:互联网 发布:怎样建立淘宝网店 编辑:程序博客网 时间:2024/04/27 22:22

## July博客16章开始


# 第一题:全排列,输入一个字符串,打印出该字符串中字符的所有排列

1. 个人思路:

    - 回溯法建立的排序树

2. July博客:

    - 递归实现,依次固定第一个字母,后面的交换,和上面描述的使用回溯法相似

    - c++ STL 算法 next_permutation的思想,关于next_permutation函数的解释,链接里的实例和July的解释一起看会更好。

3. 拓展

    - 求组合而不是求排列,个人思路:一个一个删除


# 第二题:一个台阶有N级,一次可以跳一级,也可以跳二级,有多少种跳法,给出复杂度

1. 个人思路:

    - 无

2. July思路:

    - 递归,写出递推公式,转化为Fibonacci数列问题

         - 此问题的两个拓展问题:1. 递归方法计算复杂度过大,尝试用递推方法解决,参见递归与递推的区别

         - 上面的递推可以在 O(n)时间复杂度内解决Fibonacci数列,事实上从个人角度,递推是最适合解法。

         - 2. 在 O(logn)时间复杂度内解决Fibonacci数列问题


# 第三题:奇偶排序,调整数组顺序使得奇数在偶数前面,要求时间复杂度O(N)

1. 个人思路:

    - 无

2. July思路:

    - 要求时间复杂度是O(N),考虑一下快排,可以set两个指针,想快排一样将找到奇数和偶数对调。时间复杂度符合

3. 拓展问题:一个未排序数组,有正负数,重新排序使得负数在正数前面,并且要求不改变原来的正负数之间相对顺序

    要求时间复杂度O(n),空间复杂度O(1),未有满意答案

    - 个人思路:像完美洗牌那样?


# 第四题:在一个字符串中找到第一个只出现一次的字符,abaccdeff,输出b

1. 个人思路:

    - 先找到只出现一次,然后找出第一个,建立伴随数组,每个字符一个伴随数组,记录出现次数,出现次数为1,而且第一个    出现,毕。

2. July博客:

    - 思路和个人思路相同。


# 第五题:一致性hash算法,手机朋友网有n个服务器,为了方便用户会缓存数据,具体描述剑二十章。

1. 个人思路:

    - 无

2. July博客:

    - 模余方法:实在看出稳定性在哪里。。。

    - 一致性hash算法,重头戏来了:

        - 服务器负载均衡算法:

            - 轮循算法(Round Robin

            - 哈希算法(Hash)(最常用)

            - 最少连接算法(Least Connection)

            - 响应速度算法(Response Time)

            - 加权法(Weighted)

        - hash算法使用场景

            - N台服务器提供缓存服务,需要对服务器进行负载均衡,将请求平均发到每台服务器上,每台服务器负责1/N

            - 对hash结果取余数:hash() mod N

            - 致命问题:一台机器宕机, 会有 (N-1)/N 的服务器缓存数据需要重新计算,新增一台机器会有N/(N+1)的服务器的缓               存数据需要进行重新计算。

        - 在Memcached , key-value store, bittorrent DHT, LVS中都采用了Consistent Hashing 算法,

            - 这是分布式系统负载均衡的首选算法。

            - 描述:

                  1. consistent Hashing 

                  2. 基本场景:和上面的宕机问题基本一致

                  3. hash算法,单调性以及平衡性

                  4. consistent hashing 算法的原理

                       - 环形hash空间:

                       - 将对象映射到hash空间

                       - 把cache映射到hash空间

                       - 把对象映射到cache

                       - 考察cache的变动

                            1. 移除cache

                            2. 添加cache

                  5. 虚拟节点

                       - 平衡性:平衡性是指尽量是所有结果平均分布到所有的cache中,使所有的缓冲空间得到利用

                       - 添加虚拟节点:virtual node,是实际节点在hash空间的复制品(replica)

                       - 对象映射到虚拟节点 {对象--> 虚拟节点}

                       - 虚拟节点映射到节点 {虚拟节点 --> 节点}

                       - 节点的hash计算:IP地址,虚拟节点的hash计算:IP地址加数字后缀


## 后记

# 以上全部学习自July博客程序员编程艺术,16到20章,是本人的学习笔记,想了解详细信息请移步July博客:http://blog.csdn.net/v_JULY_v


0 0
原创粉丝点击