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