【问题标题】:Algorithm for finding circular references in a spreadsheet在电子表格中查找循环引用的算法
【发布时间】:2011-04-20 14:25:06
【问题描述】:

我有一个带有公式的电子表格应用程序。我正在寻找检测公式中循环引用的最佳算法。当使用公式进行长链计算时,我目前的方法很慢并且使用太多内存。它涉及为每个公式保留所有依赖项的集合。因此,如果每个单元格的第一列都有一个公式,其中引用了它之前的单元格,那么第一个单元格的集合将为空。第二个单元格的集合将只包含第一个单元格,第三个单元格的集合将包含单元格 1 和 2,...,第 1000 个单元格的集合将包含它之前的 999 个单元格。引入新公式时,将构建其依赖集,如果该集包含新公式,则存在循环引用。但显然,对于这种情况,所需的时间和内存呈指数级增长。

【问题讨论】:

  • this 回答可能会有所帮助

标签: algorithm excel spreadsheet


【解决方案1】:

无论如何,您都需要对单元格进行拓扑排序,以便能够在发生更改时快速计算单元格的值。拓扑排序过程还将循环检测为副产品。

http://en.wikipedia.org/wiki/Topological_sorting

【讨论】:

  • 谢谢。我已经有了一个快速的算法来对公式进行排序和检测变化,但现在我可以去掉它,用它一石二鸟。
【解决方案2】:

将单元格之间的依赖关系表示为有向图,并使用Tarjan's strongly connected components algorithm(每个大小为 2 或更大的强连通分量都包含循环)。

【讨论】:

    【解决方案3】:

    也许您有自己检查的动机,但 Excel 已经自动检查循环引用。您可以使用 VBA 中的 Worksheets.CircularReference 属性来访问此信息。

    【讨论】:

    • 数据不在 Excel 工作簿中。我只是用 Excel 标记了这个问题,因为它与 Excel 场景密切相关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-27
    • 1970-01-01
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多