亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

它具有多少個級別和子級的遞歸計算

它具有多少個級別和子級的遞歸計算

ITMISS 2022-08-03 15:44:46
來源是:id, pid,name1,  0,  a2,  1,  b3,  1,  c我們預期的結果是:id,pid,name,upnum,uplevel,downum,downlevel1,  0,  a,  0,    0,      2,     1  2,  1,  b,  1,    1,      0,     03,  1,  c,  1,    1,      0,     0在這里,名字是人的名字,id標識每個人,pid表示父母id,例如,人a是人b的上級。upnum表示他總共有多少上級,上層表示他有多少級上級,下級和下級幾乎像這樣為了得到這個結果,我想我有兩種方式1.使用數據庫,像口服,我使用和,一切都很好。但是對于每個人來說,我必須再次運行“連接”sql,這似乎很慢。而且我們必須在客戶端安裝預言機,有些客戶端不喜歡它。如果我們使用h2或一些嵌入式數據庫,我們可以使用oracle中的功能嗎?但我想它也很慢。或者我們應該做id的索引?connect bynocyclenocycle2.使用java hashMap來存儲id和pid的關系,但是當數據變大時,可能會出現內存不足異常。如何編寫代碼?最好的方法是什么?還是有更好的方法?比如一些圖形算法,或者graph-db(數據庫)?
查看完整描述

1 回答

?
12345678_0001

TA貢獻1802條經驗 獲得超5個贊

沒有真正需要數據庫。一個簡單的迭代和一個遞歸函數可以做所需的分析:


import java.util.ArrayList;

import java.util.List;


public class Graph {


    private final List<Node> nodes;

    private final Node root;


    //Graph assumes unique id > 0, and only root with pid = 0

    Graph(Node root){

        this.root = root;

        nodes = new ArrayList<>();

        nodes.add(root);

    };


    void add(Node node){

        nodes.add(node);

    }


    void analyze(){

        //sort by pid so iteration goes from top level down

        nodes.sort( (n1,n2) -> Integer.compare(n1.getPid(), n2.getPid()) );

        for(Node node : nodes){

            Node parent = getNode(node.getPid());

            if (parent == null ) {

                continue;  //skip root

            }

            node.setUpLevel(parent.getUpLevel()+1);  //add 1 to parent value

            node.setUpNum(node.getUpNum() +1);       //increment by 1

            parent.setDowNum(parent.getDowNum() +1); //increment by 1

            updateHigherLevels(node);

        }

    }


    //recursively update higher levels

    private void updateHigherLevels(Node node) {

        Node parent = getNode(node.getPid());

        if(parent == null) return;

        parent.setDownLevel(node.getDownLevel() + 1);

        updateHigherLevels(parent);

    }


    void print(){

        //sort by id for nice printing

        nodes.sort( (n1,n2) -> Integer.compare(n1.getId(), n2.getId()) );

        String format = "\n%2s %3s %4s %5s %7s %7s  %8s";

        System.out.printf(format,"id","pid","name","upnum","uplevel", "downnum" , "downlevel");

        for(Node node : nodes){

            System.out.printf(format, node.getId(), node.getPid(), node.getName(), node.getUpNum(), node.getUpLevel()

                    , node.getDowNum(), node.getDownLevel());

        }

    }


    Node getNode(int id){


        for(Node node : nodes){

            if(node.getId() == id) return node;

        }


        return null;

    }


    public static void main(String[] args) {

        //make graph

        Graph graph = new Graph(new Node(1, 0, "a"));

        graph.add(new Node(2, 1, "b"));

        graph.add(new Node(3, 1, "c"));

        graph.add(new Node(4, 2, "d"));

        graph.add(new Node(5, 2, "e"));


        graph.analyze();

        graph.print();

    }

}


class Node {


    private final int id,pid;

    private int upnum = 0, uplevel = 0, downum = 0,  downlevel = 0;

    private final String name;


    Node(int id, int pid, String name) {

        super();

        this.id = id;

        this.pid = pid;

        this.name = name;

    }


    int getId() { return id; }


    int getPid() { return pid;  }


    String getName() { return name; }


    int getUpNum() { return upnum;  }


    void setUpNum(int upnum) { this.upnum = upnum; }


    int getUpLevel() { return uplevel; }


    void setUpLevel(int uplevel) { this.uplevel = uplevel; }


    int getDowNum() { return downum; }


    void setDowNum(int downum) { this.downum = downum; }


    int getDownLevel() { return downlevel; }


    void setDownLevel(int downlevel) { this.downlevel = downlevel; }

}

輸出:

http://img1.sycdn.imooc.com//62ea278c0001787f04910155.jpg

查看完整回答
反對 回復 2022-08-03
  • 1 回答
  • 0 關注
  • 85 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號