一种快速的复杂逻辑表达式求取方法

简介: 背景最简单的逻辑表达式求取方法是求取所有每个子表达式的值,然后再带入复杂逻辑表达式依次计算得到最终结果,时间复杂度较高。简单的“或运算”和“与运算”,以短路方式实现,不需要计算所有的子表达式的值,计算效率较高。但是,以“或运算”、“与运算”、“否运算”和“嵌套运算”等子表达式组成的复杂逻辑表达式,不能简单的套用短路运算。本专利,通过“构建逻辑表达式树”及“逐级向上触发树节点”的方式,实现了一种快速

背景

最简单的逻辑表达式求取方法是求取所有每个子表达式的值,然后再带入复杂逻辑表达式依次计算得到最终结果,时间复杂度较高。简单的“或运算”和“与运算”,以短路方式实现,不需要计算所有的子表达式的值,计算效率较高。但是,以“或运算”、“与运算”、“否运算”和“嵌套运算”等子表达式组成的复杂逻辑表达式,不能简单的套用短路运算。

本专利,通过“构建逻辑表达式树”及“逐级向上触发树节点”的方式,实现了一种快速的复杂逻辑表达式求取方法。

怎么实现的?

本文提出一种快速的复杂逻辑表达式求取方法,采用“构建逻辑表达式树”及“逐级向上触发树节点”的方式,在保证计算结果正确性的前提下,避免了不必要的子表达式计算,执行时间较短,求值性能较高。系统模块设计分为三部分:解析复杂逻辑表达式、构建逻辑表达式树、逐级向上触发树节点。

   A)解析复杂逻辑表达式,用于解析“复杂逻辑表达式字符串”为“抽象语法树”。

编写词法语法解析工具Antlr4配套的语法文件,此语法文件支持“或运算”、“与运算”、“否运算”和“嵌套运算”四种基本逻辑运算单元。其中,“或运算”表示为“||”或“or”,“与运算”表示为“&&”或“and”,“否运算”表示为“!”或“not”。通过Antlr4处理复杂逻辑字符串可以解析得到相应的抽象语法树。例如:复杂逻辑表达式字符串“a && b and c or d or !e”会被解析为((a) && (b) and (c)) or (d) or (!(e))。

   B)构建逻辑表达式树,利用已解析得到的“抽象语法树”构建逻辑表达式树。

根据抽象语法树的层级嵌套关系构造“逻辑表达式树”。“基础运算单元”转换为PatternElement,“或运算”转换为LogicOrExpression,“与运算”转换为LogicOrExpression,“否运算”转换为LogicOrExpression,“嵌套运算”采用“逻辑表达式树LogicExpresssionTree”的层级关系表示。

 

   C)逐级向上触发树节点。计算“基础运算单元”,并逐级向上触发父节点,直到确定“逻辑表达式树”根节点结果。

将“基础运算单元”的结果带入“逻辑表达树”,并根据触发条件确定是否需要继续触发父节点,执行过程中尽可能的实现逻辑短路,最后求取的确定根节点值,即为“复杂逻辑表达式”的值。

(1)如果得到某个“基础运算单元”的计算结果,则判断此基础运算单元的“计算版本computeVersion”是否最新。

如果不是最新,则更新“计算版本computeVersion”,设置“计算结果hitResult”,如果“父节点parentComputableUnit”存在,则向上触发父节点。

如果最新,则直接返回,无需重复触发。

(2)如果“或运算”被触发,则判断此或运算的“计算版本computeVersion”是否最新。

如果不是最新,则更新“计算版本computeVersion”,设置“是否已触发triggered”为false,重置“已触发的孩子计算单元数量triggeredChildComputalbeUnitCount”为0,重置 “孩子计算单元是否已触发数组childComputalbeUnitTriggeredArray”的元素全部为false。

如果“是否已触发triggered”为true,则直接返回,无需重复触发。

如果“此次触发的子表达式的计算结果hitResult”为true,则设置此或运算的“计算结果hitResult”为true,设置“是否已触发triggered”为true,如果“父节点parentComputableUnit”存在,则向上触发父节点。

如果“此次触发的子表达式的计算结果hitResult”为false,且“此次触发的子表达式”在或运算中的索引位置没有触发,则“已触发的孩子计算单元数量triggeredChildComputalbeUnitCount”加1。

此时,如果或运算的所有子表达式均已全部触发,则设置此或运算的“计算结果hitResult”为false,设置“是否已触发triggered”为true,如果“父节点parentComputableUnit”存在,则向上触发父节点。此时,如果或运算的所有子表达式均没有全部触发,则设置此次触发的子表达式对应的“孩子计算单元是否已触发数组childComputalbeUnitTriggeredArray”的元素为true。

(3)如果“与运算”被触发,则判断此与运算的“计算版本computeVersion”是否最新。

如果不是最新,则更新“计算版本computeVersion”,设置“是否已触发triggered”为false,重置“已触发的孩子计算单元数量triggeredChildComputalbeUnitCount”为0,重置 “孩子计算单元是否已触发数组childComputalbeUnitTriggeredArray”的元素全部为false。

如果“是否已触发triggered”为true,则直接返回,无需重复触发。

如果“此次触发的子表达式的计算结果hitResult”为false,则设置此与运算的“计算结果hitResult”为false,设置“是否已触发triggered”为true,如果“父节点parentComputableUnit”存在,则向上触发父节点。

如果“此次触发的子表达式的计算结果hitResult”为true,且“此次触发的子表达式”在与运算中的索引位置没有触发,则“已触发的孩子计算单元数量triggeredChildComputalbeUnitCount”加1。

此时,如果与运算的所有子表达式均已全部触发,则设置此或运算的“计算结果hitResult”为true,设置“是否已触发triggered”为true,如果“父节点parentComputableUnit”存在,则向上触发父节点。此时,如果与运算的所有子表达式均没有全部触发,则设置此次触发的子表达式对应的“孩子计算单元是否已触发数组childComputalbeUnitTriggeredArray”的元素为true。

(4)如果“否运算”被触发,则判断此否运算的“计算版本computeVersion”是否最新。

如果不是最新,则更新“计算版本computeVersion”,设置“计算结果hitResult”为“此次触发的子表达式的计算结果hitResult”的非值,如果“父节点parentComputableUnit”存在,则向上触发父节点。

如果最新,则直接返回,无需重复触发。

(5)循环执行上述步骤,如果执行完毕时,逻辑表达式树的根节点的“是否已触发triggered”为true,则直接返回“计算结果hitResult”。

为了快速求取所有基础运算单元都没有匹配的情况,需计算复杂逻辑表达的默认值。如果没有匹配成功任何“基础运算单元”,则直接返回此默认值。

有哪些实际价值?

1)逻辑表达式复杂:树形层次结构可以表示与复杂逻辑表达式相同的语义。

2)执行时间快:采用“逐级向上触发树节点”的方式求取根节点的值,避免了不必要的子表达式计算,具有较好的执行性能。

相关文章
|
18天前
|
测试技术
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
【动态规划】【字符串】【表达式】2019. 解出数学表达式的学生分数
|
18天前
|
存储 Serverless C语言
『C/C++』Eg3:多项式求值
『C/C++』Eg3:多项式求值
|
18天前
|
机器学习/深度学习 人工智能 C++
C++系列-第3章循环结构-28-累加和常数e
C++系列-第3章循环结构-28-累加和常数e
|
8月前
卡诺图化简法的介绍
卡诺图化简法:从真值表到逻辑电路设计 一、引言(100字) 卡诺图化简法是一种常用的布尔代数化简方法,可以将复杂的逻辑电路简化为更简单的形式。本文将介绍卡诺图化简法的基本原理、应用技巧和实际案例,以帮助读者更好地理解和应用该方法。 二、卡诺图化简法的基本原理(200字) 卡诺图是一种二维表格,用于表示布尔代数中的逻辑函数。卡诺图的每个格子代表一个输入变量的取值组合,而格子内的数值则表示该输入变量组合下逻辑函数的输出值。通过卡诺图的排列和组合,可以找到逻辑函数的最简形式,并设计对应的逻辑电路。 卡诺图化简法的基本原理是利用逻辑函数的真值表,将相邻的1合并成更大的1组,从而找到最简的逻辑表达
148 0
|
C++
C++ 超大整数相加、相乘的精确求解,以及10000的阶乘
C++ 超大整数相加、相乘的精确求解,以及10000的阶乘
83 0
|
存储 算法 测试技术
基于python实现通过真值表判断一个逻辑表达式
基于python实现通过真值表判断一个逻辑表达式
395 0
基于python实现通过真值表判断一个逻辑表达式
|
存储 人工智能 Serverless
6-2 多项式求值 (15 分)
6-2 多项式求值 (15 分)
112 0
|
知识图谱
【组合数学】生成函数 ( 使用生成函数求解不定方程解个数 )
【组合数学】生成函数 ( 使用生成函数求解不定方程解个数 )
254 0

热门文章

最新文章