任务DAG遍历,拓扑排序

0、定义

DAG:有向无环图

根据定义,可以得到以下两个结论:

  1. 如果图G中存在环(即G不是有向无环图),那么G不存在拓扑排序,反之如果G存在拓扑排序,则G中没有环
  2. 如果G是有向无环图,那么他的拓扑排序可能不止一种
  3. 拓扑排序的图,一定是有向无环图
  4. 有向无环图,一定能拓扑排序

1、分页遍历所有任务,同时根据任务的依赖关系,生成dag图

@Data
public class TaskDagGraphBO {
    private Set<Long> nodes = new HashSet<>();
    private List<TaskDagEdge> edges = new ArrayList<>();

    public TaskDagGraphBO() {
    }

    public TaskDagGraphBO(Long nodesSize) {
        this.nodes = new HashSet<>(Integer.parseInt(nodesSize+""));
    }

    public void addNode(Long node) {
        if(!this.nodes.contains(node)){
            this.nodes.add(node);
        }
    }

    public void addNodes(List<Long> nodes) {
        this.nodes.addAll(nodes);
    }

    public void addEdge(Long from, Long to) {
        Optional<TaskDagEdge> any = this.edges.stream().filter(e -> e.getFrom().equals(from) && e.getTo().equals(to)).findAny();
        if(!any.isPresent()){
            TaskDagEdge taskDagEdge = new TaskDagEdge(from, to);
            this.edges.add(taskDagEdge);
        }
    }

    public void remove(Long node) {
        this.nodes.remove(node);
        edges.removeIf(taskDagEdge -> taskDagEdge.getFrom().equals(node) || taskDagEdge.getTo().equals(node));
    }
}
public class TaskDagEdge{
    Long from;
    Long to;

    public TaskDagEdge(java.lang.Long start, java.lang.Long end) {
        this.from = start;
        this.to = end;
    }

    public Long getFrom() {
        return (Long) from;
    }

    public void setFrom(Long from) {
        this.from = from;
    }

  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值