我有很多真/假结果保存为long[]
数组中的位。我确实有大量的这些(数以百万计的多头)。
例如,假设我只有五个结果,我会有:
+----- condition 5 is true
|
|+---- condition 4 is false
||
||+--- condition 3 is true
|||
|||+-- condition 2 is true
||||
||||+- condition 1 is false
10110
我也确实有一些树代表如下语句:
condition1 AND (condition2 OR (condition3 AND condition 4))
树很简单,但很长。它们基本上看起来像这样(下面是过度简化,只是为了展示我所拥有的):
class Node {
int operator();
List<Node> nodes;
int conditionNumber();
}
基本上,要么节点是叶子,然后有一个条件编号(匹配 long[] 数组中的一位),要么节点不是叶子,因此引用了几个子节点。
它们很简单,但允许表达复杂的布尔表达式。它工作得很好。
到目前为止一切顺利,一切正常。但是我确实有一个问题:我需要评估很多表达式,确定它们是真还是假。基本上我需要对一个没有比暴力破解更好的解决方案的问题进行一些暴力计算。
所以我需要走树并true
根据false
树的内容和long[]
.
我需要优化的方法是这样的:
boolean solve( Node node, long[] trueorfalse ) {
...
}
在第一次调用时node
是根节点,然后显然是子节点(递归,该solve
方法调用自身)。
知道我只会有几棵树(可能多达一百个左右)但要检查数百万棵树long[]
,我可以采取哪些步骤来优化它?
显而易见的递归解决方案传递参数((子)树和long [],我可以通过不将其作为参数传递来摆脱long[]
它)并且所有递归调用等都非常慢。我需要检查哪个运算符是使用(AND 或 OR 或 NOT 等),并且涉及到相当多的 if/else 或 switch 语句。
我不是在寻找另一种算法(没有),所以我不是在寻找从 O(x) 到 O(y),其中 y 小于 x。
我正在寻找的是“x 倍”加速:如果我可以编写执行速度提高 5 倍的代码,那么我将获得 5 倍的加速,仅此而已,我会很高兴的。
到目前为止,我看到的唯一增强——我认为与我现在相比,这将是一个巨大的“x 倍”加速——将为每棵树生成字节码,并将每棵树的逻辑硬编码到一个类中. 它应该工作得很好,因为我只会有一百多棵树(但树不是固定的:我无法提前知道树的外观,否则简单地手动对每棵树进行硬编码将是微不足道的)。
除了为每棵树生成字节码之外还有什么想法吗?
现在如果我想尝试字节码生成路线,我应该怎么做?