Algorithm
题目:56-merge-intervals
import java.util.*;
class Solution {
/**
*我的思路:对于[a1,a2],[b1,b2]什么时候条件下会存在数值区域覆盖,如果有覆盖则合并,无则保持原样
*还有一个问题:因为是一个list什么时候合并结束?
*
*参考别人的思路:找到一种能够较好的一步步减小合并范围的方式,如果集合是乱序的则没法做到
* 所以可以先将集合按照start排序,排序之后从头开始合并,只需要比较前一个的end与后一个的start就知道能不能合并了,
* 能则合并,不能则保留即可
* 算法还是有一定的套路
*/
public List merge(List intervals) {
if(intervals == null || intervals.size() <= 1){
return intervals;
}
List result = new ArrayList<>();
//1. 先按照start从小到大排序
intervals.sort((i1, i2) -> Integer.compare(i1.start, i2.start));
//List sortIntervals = intervals.stream().sorted((in1,in2)-> in1.start > in2.start ? 1:-1).collect(Collectors.toList());
Interval firstIn = intervals.get(0);
int preStart = firstIn.start, preEnd = firstIn.end;
for(int i=1;i= currIn.start){
//可以合并,记录当前的start,end
preEnd = Math.max(preEnd, currIn.end);
} else {
//pre和curr无法合并,保留pre并更新preStart,preEnd
Interval in = new Interval(preStart, preEnd);
preStart = currIn.start;
preEnd = currIn.end;
result.add(in);
}
}
//别漏了最后一个
result.add(new Interval(preStart,preEnd));
return result;
}
}
Review
一致性hash的一篇论文:http://www.tom-e-white.com/2007/11/consistent-hashing.html
根据文章提供的代码自己测试了下:
package com.sf.boot.myspringboot.slack;
import java.util.*;
/**
* Created by xuery on 2018/7/22.
*/
public class ConsistentHash {
private final int numberOfReplicas;
private final SortedMap circle = new TreeMap();
public ConsistentHash(int numberOfReplicas, Collection nodes){
this.numberOfReplicas = numberOfReplicas;
for(T node: nodes){
add(node);
}
}
public void add(T node){
for(int i=0;i tailMap = circle.tailMap(hash); //tailMap获取所有大于等于当前hash值的map集合
//如果tailMap不为空根据一致性hash算法顺时针取第一个即可,没找到的话就只能取circle的第一个了
hash = tailMap.isEmpty() ? circle.firstKey():tailMap.firstKey();
}
return circle.get(hash);
}
public static void main(String[] args) {
SortedMap circle = new TreeMap<>();
Node node1 = new Node(0,"192.168.95.10","10.10.10.10");
Node node2 = new Node(1,"192.168.95.11","11.11.11.11");
Node node3 = new Node(2,"192.168.95.12","12.12.12.12");
List list = new ArrayList<>(Arrays.asList(node1,node2,node3));
ConsistentHash consistentHash = new ConsistentHash<>(3,list);
Node bingoNode1 = consistentHash.get(443960190); //node3
consistentHash.remove(node3);
Node bingoNode2 = consistentHash.get(443960190); //node3被remove,则路由到node1
System.out.println();
}
}
class Node{
int index;
String ip;
String mac;
public Node(int index, String ip, String mac){
this.index = index;
this.ip = ip;
this.mac = mac;
}
}
文章简要的描述了一致性hash算法,主要用于解决:分布式缓存增减机器导致大量缓存失效的问题以及负载均衡的问题。
结合文章给出的代码可以更好的理解这个算法,值得一读。
Tip
重新学习了下java8的lambda表达式,体验到函数式编程带来的方便,在以后的开发中多多用起来
Share
关于技术上的一点小思考:作为一个刚入门的小菜鸟,最初我是通过视频来入门的,所以在之前很长一段时间,每每碰到一些要学习的技术都希望通过别人讲解的视频来学习,结果发现效果并不好,一是因为时间上其实不允许,没有那么多时间让你看视频来学;二是慢慢发现视频只适合入门,要深入就很难。
现在通过接触耗子叔的专栏,我也会去看一些原滋原味的英文技术文章,发现慢慢看也能看懂,而且体会更加深刻;所以学习技术还是要通过啃书和阅读第一手的技术文章来提升自己,没有什么捷径,要说有捷径就是从现在开始静下心来坚持读书坚持ARTS打卡。
工作一年来,对自己的要求还是不高,还是会有那种我努力我也可以做到的幻觉,这让我意识到不去做这些都只是幻觉而已,所以在保证身体健康的情况下,我会拼尽一切去精尽,找对方向,跟对人,从现在开始就是干!!!