由于缓存原因,将布尔表达式标准化有没有比真值表更有效的方法?

如何解决由于缓存原因,将布尔表达式标准化有没有比真值表更有效的方法?

| 我当前的项目是具有布尔检索功能的高级标记数据库。正在使用类似这样的布尔表达式来查询记录(例如在音乐数据库中):
funky-music and not (live or cover)
它将产生音乐数据库中所有时髦的音乐,但不包含歌曲的现场或翻唱版本。 当涉及到缓存时,问题在于存在相同但结构不同的查询。例如,应用de Morgan \规则,上面的查询可以这样写:
funky-music and not live and not cover
例如,如果通过对查询字符串进行哈希处理来实现缓存,则这将产生完全相同的记录,但会导致中断缓存。 因此,我的首要目的是创建查询的真值表,然后将其用作缓存键,因为等效表达式形成了相同的真值表。不幸的是,这是不切实际的,因为真值表随输入(标签)的数量呈指数增长,我不想限制一个查询中使用的标签的数量。 另一种方法可能是遍历语法树,应用由布尔代数定义的规则以形成(最小)规范化表示,这似乎也很棘手。 因此,总的问题是:是否存在一种可行的方法来实现等效查询的识别,而无需电路最小化或真值表(编辑:或任何其他具有NP难点的算法)? ne plus ultra将识别已经缓存的子查询,但这不是主要目标。     

解决方法

一种确定查询是否等同于“ False”的通用高效算法可用于有效解决NP完全问题,因此您不太可能找到一个。 您可以尝试将查询转换为规范形式。由于上述原因,总会有很多查询要转换成任何给定的形式都非常昂贵,但是您可能会发现,实际上,某些形式在大多数情况下都可以很好地工作-并且您始终可以在查询中途放弃转型是否变得太难了。 您可以查看http://en.wikipedia.org/wiki/Conjunctive_normal_form、http://en.wikipedia.org/wiki/Disjunctive_normal_form、http://en.wikipedia.org/wiki/Binary_decision_diagram。     ,您可以将查询转换为合取范式(CNF)。它是布尔公式的规范,简单表示形式,通常是SAT求解器的基础。 最有可能的“大”查询将具有许多连词(而不是许多析取物),因此CNF应该可以很好地工作。     ,Quine-McCluskey算法应该可以满足您的需求。它类似于卡诺地图,但更易于在软件中实现。     

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?