2011-04-20 24 views
5

Tengo una aplicación de hoja de cálculo con fórmulas. Estoy buscando el mejor algoritmo para detectar referencias circulares entre las fórmulas. El enfoque actual que tengo es lento y usa demasiada memoria cuando hay largas cadenas de cálculos con las fórmulas. Implica mantener conjuntos de todos los dependientes para cada fórmula. Entonces, si la primera columna de celdas tuviera una fórmula con una referencia a la celda anterior, el primer conjunto de celdas estaría vacío. El conjunto de la 2da celda solo contendría la primera celda, el conjunto de la 3ra celda contendría las celdas 1 y 2, ..., el conjunto de la 1000.a celda contendría las 999 celdas anteriores. Cuando se introdujo una nueva fórmula, se creó su conjunto de dependientes y si el conjunto contiene la nueva fórmula, hay una referencia circular. Pero, obviamente, para este escenario, el tiempo y la memoria requeridos crecen exponencialmente.Algoritmo para encontrar referencias circulares en una hoja de cálculo

+0

[este] (http://stackoverflow.com/questions/546655/finding-all-cycles-n-graph) la respuesta podría ser de ayuda – abeln

Respuesta

5

Debe hacer una clasificación topológica de las celdas de todos modos para poder calcular rápidamente los valores de las celdas cuando algo se cambia. El procedimiento de clasificación topológica también detecta ciclos como un subproducto.

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

+0

Gracias. Ya tenía un algoritmo rápido para clasificar las fórmulas y detectar cambios, pero ahora puedo eliminarlo y matar dos pájaros de un tiro con esto. –

1

Represente las dependencias entre celdas como un gráfico dirigido, y use Tarjan's strongly connected components algorithm (cada componente fuertemente conectado de tamaño 2 o mayor contiene ciclos).

+0

+1, pero ¿cómo se encuentran exactamente todos los ciclos? – abeln

0

Tal vez usted tiene motivos para comprobar por su cuenta, pero Excel ya se verifica para las referencias circulares de forma automática. Puede usar la propiedad Worksheets.CircularReference en VBA para acceder a esta información.

+0

Los datos no están en un libro de Excel. Acabo de etiquetar esta pregunta con Excel porque está muy relacionada con un escenario de Excel. –

Cuestiones relacionadas