## 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 算法,
- 这是分布式系统负载均衡的首选算法。
- 描述:
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