Java 使用什么数据结构来构建公式计算器
我的团队正在构建一个应用程序,它必须解决许多用户定义的公式。这是一个巨大的电子表格,我们的客户使用的替代品。例如,每个公式都使用简单的算术(大部分)和一些数学函数。我们正在使用一个名为Parsii的表达式求值库来进行实际的公式求值。但是在所有的公式中,我们必须按照它们的相依公式的顺序来计算它们。例如Java 使用什么数据结构来构建公式计算器,java,math,data-structures,Java,Math,Data Structures,我的团队正在构建一个应用程序,它必须解决许多用户定义的公式。这是一个巨大的电子表格,我们的客户使用的替代品。例如,每个公式都使用简单的算术(大部分)和一些数学函数。我们正在使用一个名为Parsii的表达式求值库来进行实际的公式求值。但是在所有的公式中,我们必须按照它们的相依公式的顺序来计算它们。例如 F1 = a + b F2 = F1 * 10% F3 = b / 2 F4 = F2 + F3 在上面的示例中,a、b是用户输入的值。系统应首先计算F1和F3,因为它们直接依赖于用户输入。那么应
F1 = a + b
F2 = F1 * 10%
F3 = b / 2
F4 = F2 + F3
在上面的示例中,a、b是用户输入的值。系统应首先计算F1和F3,因为它们直接依赖于用户输入。那么应该计算F3。最后是F4
我的问题是,建议采用什么样的数据结构来建模公式评估的这些依赖关系
我们目前将其建模为一个有向图。在上面的示例中,F1和F3是根节点,F3连接到两者,F4连接到F3,F4是叶节点。我们使用Tinkerpop3图形实现对此进行建模
用于对此建模的任何数据结构都应该具有以下特征。
-易于更改少数顶级根节点的某些输入数据(基于用户输入)
-仅重新计算那些依赖于已更改的根节点的公式(因为我们在特定计算上下文中有100个公式,并且必须在1-2秒内响应GUI层)
-尽量减少代码量,以便通过一些现有库创建数据结构。
-能够查询数据结构,通过各种键(公式对象名称、对象id、年份等)查询/查找根节点,并能够编辑这些键的属性。您当前是否将其存储在平面文件中 如果希望具有更好的可查询性和更容易的修改,那么可以将其作为DAG存储在数据库表中 可能是这样(我希望真正的解决方案有所不同): 有了它,您还可以很容易地知道公式是否依赖于不存在的公式,因为它会违反
depends\u-on\u-ID
外键。数据库还可以检测是否有任何公式形成了一个依赖循环。例如,其中F1依赖于F2依赖于F3依赖于F1
此外,您可以轻松地将任何元数据添加到表中,并对可能查询的任何内容建立索引。您当前是否将其存储在平面文件中 如果希望具有更好的可查询性和更容易的修改,那么可以将其作为DAG存储在数据库表中 可能是这样(我希望真正的解决方案有所不同): 有了它,您还可以很容易地知道公式是否依赖于不存在的公式,因为它会违反
depends\u-on\u-ID
外键。数据库还可以检测是否有任何公式形成了一个依赖循环。例如,其中F1依赖于F2依赖于F3依赖于F1
此外,您还可以轻松地将任何元数据添加到表中,并对您可能查询的任何内容建立索引。使用有向图有什么问题?这就是我要向我推荐的,听起来像:“请推荐一个包含更好数据结构的库”。这使您的请求脱离主题。@mathiastrohkirch。这没什么问题。我只是好奇地想知道其他的替代方案。@GhostCat,我不是特别要求一个库,而是一个可以更优雅地建模问题的数据结构。如果有适合该数据结构的成熟库,那就更好了。我已经阅读了脱离主题的指南,它说我可以询问“一个特定的编程问题”或“一个软件算法”。@nitkart我就是这样做的:然而,我认为有基于反向波兰符号和树的更快的方法……使用有向图有什么错?这就是我要向我推荐的,听起来像:“请推荐一个包含更好数据结构的库”。这使您的请求脱离主题。@mathiastrohkirch。这没什么问题。我只是好奇地想知道其他的替代方案。@GhostCat,我不是特别要求一个库,而是一个可以更优雅地建模问题的数据结构。如果有适合该数据结构的成熟库,那就更好了。我已经阅读了脱离主题的指南,它说我可以询问“一个特定的编程问题”或“一个软件算法”。@nitkart我就是这样做的:不过我认为有一些基于反向波兰符号和树的更快的方法……谢谢你的建议@xtratic。我们确实在数据库中存储公式定义。我们确实有一个公式依赖关系表,正如您所建模的那样,以保持公式的完整性。我的问题是如何在计算公式时在内存中对此进行建模,因为计算速度必须很快。我们最初的方法是在公式表中查询公式依赖项中没有任何条目的公式表(即根节点),从那里开始,后续查询发现第二级公式,对其进行计算,后续查询第三级公式等。由于许多JDBC查找,该方法很快被发现没有性能。因此,我们切换到从两个表中获取所有公式的方法(通过Oracle的CONNECT BY Hierarchy queries),然后在内存中构建一个有向图来运行实际的公式计算。所以我的问题是,是否有比有向图更好的数据结构来建模这个缓存公式定义感谢您的建议@xtratic。我们确实在数据库中存储公式定义。我们确实有一个公式依赖关系表,正如您所建模的那样,以保持公式的完整性。我的问题是如何在计算公式时在内存中对此进行建模,因为计算速度必须很快。我们最初的方法是查询表单
+-----------------------------------------------------------+
| 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 |
+-----------------+--------------------+