Algorithm 是否有一种有效的算法来检测复杂数据结构中的依赖循环?

Algorithm 是否有一种有效的算法来检测复杂数据结构中的依赖循环?,algorithm,language-agnostic,dependencies,cycle,Algorithm,Language Agnostic,Dependencies,Cycle,我有一个小而复杂的数据库(数百万条记录被分割在非常低的数千个表上)。这些记录可以看作是业务规则。用户可以根据现有规则(包括其他用户定义的规则)定义自己的规则。这些规则依赖于其他规则,有时通过复杂的路径。依赖关系形成一个扩展网络,而不是层次结构 我正在寻找一种算法来确定,在新定义的规则(或一组规则)中,新规则本身是循环的,还是与现有规则一起创建循环 我需要一种在以下情况下有效的算法: 如果有一个循环,算法的结果只需要是布尔-真,否则为假 可以假定现有数据库是无周期的 一旦找到循环,处理就可以停止。

我有一个小而复杂的数据库(数百万条记录被分割在非常低的数千个表上)。这些记录可以看作是业务规则。用户可以根据现有规则(包括其他用户定义的规则)定义自己的规则。这些规则依赖于其他规则,有时通过复杂的路径。依赖关系形成一个扩展网络,而不是层次结构

我正在寻找一种算法来确定,在新定义的规则(或一组规则)中,新规则本身是循环的,还是与现有规则一起创建循环

我需要一种在以下情况下有效的算法:

  • 如果有一个循环,算法的结果只需要是布尔-真,否则为假
  • 可以假定现有数据库是无周期的
  • 一旦找到循环,处理就可以停止。通常情况(95%)是没有循环。不幸的是,在这种情况下(我认为)处理必须完成提议的新规则的所有可能路径,以确定没有循环
  • 当新的用户定义规则输入数据库时,该算法用于验证这些规则。通常情况下,验证需要尽可能快-我不希望此验证成为创建过程中的瓶颈
  • 获取数据的成本相对较高-通常涉及一个或多个查询,其中一些查询相当复杂。可以约束新定义的规则集,使其在内存中完全可用。如果对新规则的输入施加任何其他约束,这将有助于检查的效率,我不知道它们可能是什么
  • 编辑

    我接受尼克的回答,只是做了一点修改。存储依赖项是对数据库的一个非常简单的修改。我只存储直接依赖项,而不是所有直接或间接依赖项。我可以将两组依赖关系C、D、F、G和X、Y、Z(在Nick的回答中)视为树结构,并使用各种技术中的一种从单级依赖关系表导出层次结构。我认为在这种情况下,这样做的成本是可以接受的


    编辑

    我希望我正确理解了您的问题:

    假设您向数据库中添加了规则A,然后还添加了依赖项信息,如
    A依赖于C、D、F、G
    X、Y、Z依赖于A

    我假设在插入时,如果不真正查看整个结构,就无法检测循环,您说这是不允许的

    因此,我的想法是将所有内容预先计算并存储,即对于每个规则,R存储它所依赖的所有其他规则(不仅直接,而且间接)。现在,当您插入规则A时,只需从
    C、D、F、G
    中获取所有依赖项,并查看它们是否包括
    X、Y、Z或A
    中的任何一个,如果它们不存在,则没有循环,您可以安全地将A添加到规则集中,并将
    C、D、F、G
    中的所有依赖项加上
    C、D、F、G
    本身存储为A的依赖项


    这当然需要对数据库进行一些重组(和重建)。

    我希望我正确理解了您的问题:

    假设您向数据库中添加了规则A,然后还添加了依赖项信息,如
    A依赖于C、D、F、G
    X、Y、Z依赖于A

    我假设在插入时,如果不真正查看整个结构,就无法检测循环,您说这是不允许的

    因此,我的想法是将所有内容预先计算并存储,即对于每个规则,R存储它所依赖的所有其他规则(不仅直接,而且间接)。现在,当您插入规则A时,只需从
    C、D、F、G
    中获取所有依赖项,并查看它们是否包括
    X、Y、Z或A
    中的任何一个,如果它们不存在,则没有循环,您可以安全地将A添加到规则集中,并将
    C、D、F、G
    中的所有依赖项加上
    C、D、F、G
    本身存储为A的依赖项


    当然,这需要对数据库进行一些重组(和重建)。

    您关于依赖关系信息的假设是正确的。纵观整个结构是允许的——问题的关键是,这一过程在资源方面非常昂贵,因此我关注的是尽可能高效地完成这一过程。我将考虑存储所有依赖项。我的第一反应是,这可能不会涵盖所有案例,但我需要考虑一下。我相信它确实涵盖了所有案例。将规则集视为一个无循环图。添加新规则a时,将向图形中添加一个新节点,其中包含传入(X取决于a)和传出(a取决于X)弧。为每个规则存储的依赖项集等于每个节点的可访问节点集。只有当A的前置节点位于A的任何后续节点的可访问节点集中时,循环才能存在。您关于依赖关系信息的假设是正确的。纵观整个结构是允许的——问题的关键是,这一过程在资源方面非常昂贵,因此我关注的是尽可能高效地完成这一过程。我将考虑存储所有依赖项。我的第一反应是,这可能不会涵盖所有案例,但我需要考虑一下。我相信它确实涵盖了所有案例。将规则集视为一个无循环图。添加新规则a时,将向图形中添加一个新节点,其中包含传入(X取决于a)和传出(a取决于X)弧。为每个规则存储的依赖项集等于每个节点的可访问节点集。只有当A的前置节点位于A的任何后续节点的可到达节点集中时,循环才能存在。