根据依赖关系排序

就为了尽快实现功能,性能可能不是很好

输入:

[[1, 2], [1, 3], [2, 3], [3, None], [3, 4], [4, 5]]
[[1, 2], [1, 3], [2, 3], [3, None], [3, 4], [4, 2]]

输出:

[5, 4, 3, 2, 1]
Exception: 存在循环依赖: [[1, 2], [1, 3], [2, 3], [3, None], [3, 4], [4, 2]]

代码如下

def depend_services_order(depend_list, already_list=None):
    """按照depend_services为service排序

    时间有限,不整啥拓扑排序有向图了,太磨叽
    1. 不依赖其他项的优先排序
    2. 从待排序节点中删除这些节点
        1. 如果不在已排序队列,并加入已排序队列,将所有值为None
        2. 在已排序队列,忽略
    3. 判断
        1. 已排序队列长度等于总待排序队列,递归结束
        2. 递归调用1
        3. 本轮没有筛出来节点,但待排序队列依然有值,则存在循环依赖,抛出异常
    Parameters
    ----------
    depend_list:list(list)
        依赖队列:[[A, B], [A, C], [B, C], [C, None]]
        A依赖BC,B依赖C,C不依赖任何项
    already_list:int
        已排序好的队列

    Returns
    -------

    """
    if already_list is None:
        already_list = []
    # 当前队列中所有的节点集合
    all_set = set(j for i in depend_list for j in i if j is not None)
    # 获取所有依赖了其他节点的节点
    depend_set = {i[0] for i in depend_list if i[1] is not None}
    # 本轮被筛出来的没有依赖其他节点的节点
    not_depend_set = all_set - depend_set
    # 将节点加入已排序队列
    for i in not_depend_set:
        if i not in already_list:
            already_list.append(i)
    # 本轮筛选完毕,依然剩下的所有节点,并将被晒出来的节点置为None
    depend_list = [i if i[1] not in not_depend_set else [i[0], None] for i in depend_list if i[0] in depend_set]
    # 如果本轮没有筛出来节点,但待排序队列依然有值,则存在循环依赖,抛出异常
    if len(not_depend_set) == 0 and len(depend_list) > 0:
        raise Exception("存在循环依赖: {}".format(depend_list))
    elif len(depend_list) == 0:
        return already_list
    else:
        return depend_services_order(depend_list, already_list)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值