什么计算机科学概念涉及结合多个条件进行有效评估?

时间:2016-07-16 23:02:44

标签: tree conditional-statements computer-science boolean-logic evaluation

我有一个现实世界的问题,我试图解决。

有一个应用程序可以处理来自网络套接字的传入请求。

请求由多个属性值对组成。

我希望管理员能够通过请求中的属性值对来过滤通过处理这些请求而生成的调试日志记录。

管理员将输入多个条件,每个条件映射到不同的输出流,例如:

  • if((& user ==' bar')&&(& host ==' foo')&&(& ip = 192.168。 0.1)) - >将调试写入fd 9
  • if((& host ==' baz')&&(& user ==' bar')) - >将调试写入fd 10

对上述条件的有效评估要求用户只需要评估一次。例如if(& user!=' bar')然后我们可以停止处理。

显然需要某种树形结构......

我还应该提一下,在我描述的场景中,条件评估没有副作用(你不能执行任务)。因此,对大多数逻辑运算符的操作数可以不加问题地重新排序。

处理这个问题的计算机科学概念是什么?它有NP完整的气味。

更新:跟进问题。是否有任何C库或表达语言(如BPF)可以帮助解决现实问题,或提供计算机科学概念的通用实现?

2 个答案:

答案 0 :(得分:3)

我不知道这是否属于"计算机科学概念",但您可以使用数据流规划/综合/调度技术来解决您的问题。当您的操作具有不同的成本关联时,这尤其有用(字符串的模式匹配可能比字节的精确比较更昂贵)。

基本上每个"原子"条件(如user == 'bar')将成为一个节点(我认为)称为序列图。复合条件(&&,可能||!)然后成为此(定向)图中的更多节点,其操作数(节点)的边缘到它们。

节点可以给出"持续时间",例如原子串比较需要20个时间单位,而多个(已经评估)条件的&&只需要1个时间单位。

然后,您可以在此图表上使用不同的调度算法。候选人(我知道)尽快(尽快),ALAP(尽可能晚),"列表安排"和Force Directed Scheduling

这些调度算法基本上将您的图形编译为有序列表,指定理想(或启发式)良好的顺序,您应该在其中评估操作数以获得所有(完整)条件表达式的结果。这不是你需要的东西。

上述调度算法的设计是为了在有一个具有有限(硬件)资源(能够执行由节点表示的操作)的资源时生成计划,但都涉及评估完整表达式。

您需要对此进行扩展,以包含比较可能返回结果的概率,该结果使得进一步计算节点毫无意义。但是,我不知道如何做到这一点你需要弄清楚自己。

为了做到这一点,我写了一个程序 - 给定一些复杂的条件和一些(最好是大的)测试数据 - 找到(随机爬山,模拟退火,遗传算法)一个好的计划,使得平均值预期时间是好的,然后让不同的(从上图设计)调度算法与之竞争。

以上所有内容都是关于静态调度的,还有动态调度算法可以利用原子条件的(逐步已知)结果来制定更好的计划。

答案 1 :(得分:1)

一般来说,这被称为“布尔代数”。布尔代数表达式可以使用诸如Karnaugh maps之类的技术来简化,或者通常使用其他circuit minimization techniques。这个领域可以追溯到基本的数字逻辑(在数字计算机存在之前)并且得到很好的研究。

在特定情况下,例如搜索线性日志文件,您不太可能加快程序速度,因为搜索未编制索引的日志文件的任何程序都可能受IO限制。或者,在过滤日志条目的情况下,与应用程序执行的任何其他操作的成本相比,评估过滤器的成本可能最低。