20180722_ARTS_W1

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打卡。
工作一年来,对自己的要求还是不高,还是会有那种我努力我也可以做到的幻觉,这让我意识到不去做这些都只是幻觉而已,所以在保证身体健康的情况下,我会拼尽一切去精尽,找对方向,跟对人,从现在开始就是干!!!

你可能感兴趣的:(20180722_ARTS_W1)