小编use*_*321的帖子

为缓存原因规范化布尔表达式.有没有比真值表更有效的方法?

我当前的项目是一个带有布尔检索功能的高级标签数据库.正在使用类似的布尔表达式查询记录(例如在音乐数据库中):

funky-music and not (live or cover)
Run Code Online (Sandbox Code Playgroud)

这应该会产生音乐数据库中所有时髦的音乐,但不能播放歌曲的现场或封面版本.

当涉及到缓存时,问题是存在等同但结构不同的查询.例如,应用de Morgan的规则,上面的查询可以这样写:

funky-music and not live and not cover
Run Code Online (Sandbox Code Playgroud)

例如,当通过散列查询字符串实现缓存时,它将产生完全相同的记录,但会产生中断缓存.

因此,我的第一个目的是创建查询的真值表,然后可以将其用作缓存键,因为等效表达式构成相同的真值表.不幸的是,这是不切实际的,因为真值表随着输入(标签)的数量呈指数增长,我不想限制一个查询中使用的标签数量.

另一种方法可以是遍历语法树,应用由布尔代数定义的规则来形成(最小的)规范化表示,这似乎也很棘手.

因此,整体问题是:是否有一种实用的方法来实现等效查询的识别,而无需电路最小化或真值表(编辑:或任何其他NP难的算法)?

ne plus ultra将识别已经缓存的子查询,但这不是主要目标.

algorithm caching boolean-logic traversal normalization

6
推荐指数
1
解决办法
1894
查看次数