首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >递归计算它有多少级和子级的数量

递归计算它有多少级和子级的数量
EN

Stack Overflow用户
提问于 2019-03-11 10:49:38
回答 1查看 60关注 0票数 0

来源是:

代码语言:javascript
复制
id, pid,name
1,  0,  a
2,  1,  b
3,  1,  c

我们预期的结果是:

代码语言:javascript
复制
id,pid,name,upnum,uplevel,downum,downlevel
1,  0,  a,  0,    0,      2,     1  
2,  1,  b,  1,    1,      0,     0
3,  1,  c,  1,    1,      0,     0

在这里,name是人名,id表示每个人,pid表示家长id,例如a是b的上级。upnum表示他总共有多少上级,uplevel表示他有多少上级,downnum和downlevel几乎是这样的。

为了得到这个结果,我想我有两种方法

1.使用数据库,像oralce,我使用connect bynocycle,每个人的所有东西都是ok.But,我必须再次运行"connect by“sql,它似乎很慢。而且我们必须在客户端安装一个oracle,有些客户端不喜欢它。如果我们使用h2或一些嵌入式数据库,我们可以在oracle中使用nocycle的功能吗?但我猜我们应该对id的索引进行too.Or。

2.使用java hashMap来存储id和pid的关系,但是当数据量变大时,可能会出现内存不足的exception.How来编写代码?

最好的方法是什么?或者有没有更好的方法?比如一些图形算法,或者是graph -db(数据库)?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-11 22:50:55

实际上并不需要数据库。一个简单的迭代和一个递归函数就可以完成所需的分析:

代码语言:javascript
复制
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; }
}

输出:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55094622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档