最简单的方法是构建BDT(二进制决策树),然后根据两个规则减少它:
- 合并任何同构子图.
- 消除两个孩子同构的任何节点.
但是与BDD相比,BDT存在一个主要问题.有没有办法在不首先构建BDT的情况下构建BDD?
algorithm implementation boolean-logic data-structures binary-decision-diagram
我有很多真/假结果保存为long[]
数组中的位.我确实拥有大量的这些(数百万和数百万的长).
例如,假设我只有五个结果,我会:
+----- condition 5 is true
|
|+---- condition 4 is false
||
||+--- condition 3 is true
|||
|||+-- condition 2 is true
||||
||||+- condition 1 is false
10110
Run Code Online (Sandbox Code Playgroud)
我也有一些树代表如下的语句:
condition1 AND (condition2 OR (condition3 AND condition 4))
Run Code Online (Sandbox Code Playgroud)
树很简单但很长.他们基本上看起来像这样(下面是过于简单化,只是为了表明我得到了什么):
class Node {
int operator();
List<Node> nodes;
int conditionNumber();
}
Run Code Online (Sandbox Code Playgroud)
基本上,Node是一个叶子,然后有一个条件号(匹配long []数组中的一个位)或者Node不是叶子,因此引用了几个子节点.
它们很简单,但它们允许表达复杂的布尔表达式.它很棒.
到目前为止一切都很好,一切都很好.但是我确实有一个问题:我需要评估很多表达式,确定它们是真还是假.基本上我需要对一个问题进行一些暴力计算,而这个问题除了暴力破解之外还没有比这更好的解决方案.
所以我需要走树然后回答,true
或者false
取决于树的内容和内容long[]
.
我需要优化的方法如下所示:
boolean solve( Node node, long[] trueorfalse ) {
...
}
Run Code Online (Sandbox Code Playgroud)
在第一次调用时,它node …
一个程序,每行打印一个输入的单词.
int main() {
int c;
while ((c=getchar()) != EOF) {
if (c== ' ' || c== '\n' ||c == '\t')
putchar('\n');
else {
putchar(c);
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
上面的程序正确打印结果,每行一个字.在相应地改变条件之后,我期望下面的程序也每行打印一个单词.但是我没有得到正确的结果.我犯了一些愚蠢的错误还是错了?
int main() {
int c;
while ((c=getchar()) != EOF) {
if (c != ' ' || c != '\n' || c != '\t')
putchar(c);
else {
putchar('\n');
}
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我有一些功能
(A and ( B or c)) or (D and E and (F or H or R or P )))
Run Code Online (Sandbox Code Playgroud)
并且我想将该函数转换为仅与函数一起运行(当然,如果可能的话)我发现使用DeMorgan的定律可以进行某种转换,但我没有设法将这个函数转换为任何想法?
我知道那个功能
!(A or B) is equal to function !A and !B
Run Code Online (Sandbox Code Playgroud)
但是我找不到与上面相同的功能
logic boolean-logic boolean boolean-expression boolean-operations
在我运行我输入的脚本之前
# export CPIC_MAX_CONV=500
Run Code Online (Sandbox Code Playgroud)
以下是test1.script文件
#!/bin/bash
function cpic () {
var="`export | grep -i "CPIC_MAX_CONV" | awk '/CPIC_MAX_CONV/ { print $NF } '`"
[[ $var=="" ]] && (echo "Empty String <<")
[[ $var!="" ]] && (echo "$CPIC_MAX_CONV")
echo "$var" ;
}
cpic
Run Code Online (Sandbox Code Playgroud)
输出是:
# test1.script ---- Me running the file
Empty String <<
500
CPIC_MAX_CONV="500"
Run Code Online (Sandbox Code Playgroud)
无论我使用什么""或""或[或[结果是相同的.该CPIC_MAX_CONV
变量由上述脚本找到.
我在Linux/CentOS 6.3上运行它.
这个想法很简单:找到是否CPIC_MAX_CONV
在环境中定义并返回它的值.如果有空的空间,那么当然系统中不存在变量.
a + b = c
c - a = b
Run Code Online (Sandbox Code Playgroud)
现在可以
a & b = c
c ?? a = b
Run Code Online (Sandbox Code Playgroud)
哪个运算符替换"??" ?
谢谢
我正在尝试实现一个非常非常快的布尔表达式引擎。我使用它来表示非常大的状态空间中的状态,因此我需要它每秒处理尽可能多的操作。该引擎的根本是产品的总和。我遇到了一个优化NOT运算符的问题。例如,如果我有一个带有N个小项的乘积之和,每个小项都有大约M个变量,则尝试求反,将创建M ^ N个小项,然后使用espresso算法对其进行简化。如果在逆操作期间间歇运行espresso算法,则可以加快速度并节省一些内存,但这还不够。我怀疑自己是第一个遇到此问题的人,并且我尝试进行研究,但似乎找不到有效的方法来解决此问题。
有人能指出我正确的方向吗?
我目前正在做一个程序,我已经搜索过但我找不到解决方案; 我的问题是我想要制作一个条件,其中所有选择的变量都不相等,我可以这样做,但只有长行的文本,有更简单的方法吗?到目前为止我的解决方案是:
if A!=B and A!=C and B!=C:
Run Code Online (Sandbox Code Playgroud)
但我想为几组五个变量做这件事,而且很多人都很困惑.我该怎么做才能让它变得更简单?
结果应该不一样吗?我不明白.
[True,False] and [True, True]
Out[1]: [True, True]
[True, True] and [True,False]
Out[2]: [True, False]
Run Code Online (Sandbox Code Playgroud) EXISTS
比COUNT(*)
它可以短路更快很多时候,我喜欢检查SQL中存在的东西.例如,我这样做:
-- PostgreSQL syntax, SQL standard syntax:
SELECT EXISTS (SELECT .. FROM some_table WHERE some_boolean_expression)
-- Oracle syntax
SELECT CASE
WHEN EXISTS (SELECT .. FROM some_table WHERE some_boolean_expression) THEN 1
ELSE 0
END
FROM dual
Run Code Online (Sandbox Code Playgroud)
在大多数数据库中,EXISTS
"短路",即一旦找到一行,数据库就可以停止在表中查找行.这通常比比较快得多,COUNT(*) >= 1
正如本博文中所见.
EXISTS
与GROUP BY
有时,我想在GROUP BY
查询中为每个组执行此操作,即我想"聚合"存在值.没有EXISTS
聚合函数,但PostgreSQL幸运地支持BOOL_OR()
聚合函数,就像在这个语句中一样:
SELECT something, bool_or (some_boolean_expression)
FROM some_table
GROUP BY something
Run Code Online (Sandbox Code Playgroud)
COUNT(*)
由于计算计数所需的明显顺序扫描,文档提到了一些缓慢的问题.但不幸的是,它并没有说明BOOL_OR()
被短路的事情.是这样的吗?BOOL_OR()
一旦遇到第一个TRUE …