有没有一种方法,可以高效地统计多条路径中,顶点对出现的频率如:顶点1到顶点2的路径为:1->3->5->2,顶点对有<1,3><1,5><1,2><3,5><3,2><5,2>
顶点4到顶点6的路径为:4->5->2->6,顶点对有<4,5><4,2><4,6><5,2><5,6><2,6>多条路径分析后,<5,2>共出现2次,优先级高因为数据集比较大,希望大神们能够提出一个高效的方法,最好用Java,谢谢

解决方案 »

  1.   


    public static void main(String[] args) {
            Integer []arrs1 = new Integer[]{2,1,3,4,7,5,6};
            Integer []arrs2 = new Integer[]{3,5,2,8,19,10};
            Integer []arrs3 = new Integer[]{3,8,11,13};
            List<Node> allNodes = new ArrayList<>();
            allNodes.addAll(packageNode(arrs1));
            allNodes.addAll(packageNode(arrs2));
            allNodes.addAll(packageNode(arrs3));
            System.out.println(allNodes);
            Map<Node,Integer> result = new HashMap<>(allNodes.size());
            for(Node node: allNodes){
                if(result.get(node)!=null){
                    Integer count = result.get(node);
                    result.put(node,count+1);
                }else{
                    result.put(node,1);
                }
            }        List<Map.Entry<Node,Integer>> entryArrayList = new ArrayList<>(result.entrySet());
            Collections.sort(entryArrayList, (o1,o2)->{
                Integer ov1 = o1.getValue();
                Integer ov2 = o2.getValue();
                return ov2.compareTo(ov1);
            });
            System.out.println(entryArrayList);
        }    public static List<Node> packageNode(Integer[] arrs){
            List<Node> nodes = new ArrayList<>();
            for(int i=0;i<arrs.length-1;i++){
                Integer first = arrs[i];
                for(int j=i;j<arrs.length;j++){
                    if(j+1<arrs.length){
                        Integer last = arrs[j+1];
                        nodes.add(new Node(first,last));
                    }
                }
            }
            return nodes;
        }
      

  2.   


    class Node{    private Integer first;    private Integer last;    public Node(Integer first, Integer last) {
            this.first = first;
            this.last = last;
        }    public Integer getFirst() {
            return first;
        }    public void setFirst(Integer first) {
            this.first = first;
        }    public Integer getLast() {
            return last;
        }    public void setLast(Integer last) {
            this.last = last;
        }    @Override
        public boolean equals(Object o) {
            if (this == o) {
                return true;
            }        if (!(o instanceof Node)) {
                return false;
            }
            Node node = (Node) o;
            return Objects.equals(first, node.first) &&
                    Objects.equals(last, node.last);
        }    @Override
        public int hashCode() {
            return Objects.hash(first, last);
        }
    }