为了账号安全,请及时绑定邮箱和手机立即绑定

它具有多少个级别和子级的递归计算

它具有多少个级别和子级的递归计算

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; }

}

输出:

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

查看完整回答
反对 回复 2022-08-03
  • 1 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号