【问题标题】:Finding out folder cyclic references找出文件夹循环引用
【发布时间】:2012-06-06 22:20:20
【问题描述】:

假设我有一个应用程序将放置在主文件夹中的文件传输到其他位置。

例如,用户可以如下配置应用程序:

If placed in C:\X\A Transfer to C:\Z\A
If placed in C:\Y\B Transfer to C:\Z\B
. . .
. . .

到目前为止,一切都很好。但是下面的配置会造成无限的传输循环:

if placed in C:\X\A Transfer to C:\Z\A
if placed in C:\Z\A Transfer to C:\Z\B
if placed in C:\Z\B Transfer to C:\X\A

这样的层次结构会变得相当复杂。首先预测它们并防止此类配置的最佳方法是什么?

【问题讨论】:

  • 简单而明显的解决方案是只遵循每个文件自上而下的规则。

标签: c# .net algorithm logic


【解决方案1】:

假设有这样一个类:

class Rule
{
    public string sourceDir; // dir file placed
    public string targetDir; // dir to move to
}

还有一个字典,其中包含由名为 rulessourceDir 索引的所有规则。

你可以这样写一个函数:

public bool RuleCausesCycle(Rule rule)
{
    return RuleCausesCycle(rule, new HashSet(CaseInsensitiveComparer.Default));
}

private bool RuleCausesCycle(Rule rule, Set visited)
{
     Rule targetRule;

     if (visited.Contains(rule.sourceDir))
     {
         return true;
     }

     if (rules.TryGetValue(rule.targetDir, out targetRule))
     {
         visited.Add(rule.sourceDir);

         return RuleCausesCycle(targetRule, visited);
     }

     return false;
}

【讨论】:

  • 如果假设每个源目录只有一个目标目录(您不会从同一个源目录制作两个副本),那么这是比其他答案更好的解决方案。如果它不成立,你可以添加一个循环(而不是使用字典),但它会很快变得非常耗费资源。
  • 如果您有多个具有相同来源的规则,则需要带有列表的字典。除非您有数百万条规则,否则它不会占用大量资源也不会变慢
【解决方案2】:

您基本上是在有向图中寻找循环。我会使用像 QuickGraph 这样的图形库:http://quickgraph.codeplex.com/wikipage?title=Strongly%20Connected%20Components&referringTitle=Documentation

【讨论】:

猜你喜欢
  • 2022-07-06
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多