用于构建公式评估器的数据结构

时间:2019-06-27 18:31:02

标签: java math data-structures

我的团队正在构建一个必须解决许多用户定义公式的应用程序。它替代了我们客户使用的庞大电子表格。例如每个公式(大部分)使用简单的算术运算和一些数学函数。我们正在使用一个称为Parsii的表达式评估库来进行实际的公式评估。但是在所有公式中,我们必须按其依赖公式的顺序对其进行评估。例如。

F1 = a + b
F2 = F1 * 10%
F3 = b / 2
F4 = F2 + F3

在上面的示例中,b是用户输入的值。系统最初应计算F1和F3,因为它们直接取决于用户输入。然后应计算F3。最后是F4。

我的问题是,建议使用哪种数据结构来建模公式评估的这些依赖性?

我们目前将其建模为DIRECTED GRAPH。在上面的示例中,F1和F3是根节点,F3连接到两者,F4连接到F3,F4是叶节点。我们使用了Tinkerpop3图形实现对此进行建模。

用于对此建模的任何数据结构应具有以下特征。 -易于更改几个顶级根节点的一些输入数据(基于用户输入) -仅重新计算那些依赖于已更改的根节点的公式(因为我们在特定的计算上下文中有100多个公式,并且必须在1-2秒内回复到GUI层) -尽量减少通过一些现有库创建数据结构的代码量。 -能够通过各种键(公式对象的名称,对象的ID,年份等)查询数据结构以查询/查找根节点,并且能够编辑这些键的属性。

1 个答案:

答案 0 :(得分:0)

您当前将其存储在平面文件中吗?

如果希望具有更好的查询性和更轻松的修改,则可以将其作为DAG存储在数据库表中。

也许是这样(我希望实际的解决方案有所不同):

+-----------------------------------------------------------+
|                         FORMULA                           |
+------------+--------------+----------------+--------------+
|   ID (PK)  | FORMULA_NAME | FORMULA_STRING | FORMULA_YEAR |
+============+==============+================+==============+
|     1      |      F1      |     a + b      |              |
+------------+--------------+----------------+--------------+
|     2      |      F2      |    F1 * 10%    |              |
+------------+--------------+----------------+--------------+
|     3      |      F3      |     b / 2      |              |
+------------+--------------+----------------+--------------+
|     4      |      F4      |    F2 + F3     |              |
+------------+--------------+----------------+--------------+


+--------------------------------------+
|         FORMULA_DEPENDENCIES         |
+-----------------+--------------------+
| FORMULA_ID (FK) | DEPENDS_ON_ID (FK) |
+=================+====================+
|        2        |         1          |
+-----------------+--------------------+
|        4        |         2          |
+-----------------+--------------------+
|        4        |         3          |
+-----------------+--------------------+

使用此方法,您还可以轻松地知道某个公式是否依赖于不存在的公式,因为它会违反DEPENDS_ON_ID外键。数据库还可以检测是否有任何公式形成了依赖循环。例如F1取决于F2取决于F3取决于F1。

此外,您可以轻松地将所需的任何元数据添加到表中,并在可能要查询的内容上建立索引。