Оптимизация вычисления дерева логической логики

У меня много истинных / ложных результатов, сохраненных в виде битов в 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))

Деревья очень простые, но очень длинные. В основном они выглядят так (ниже это упрощение, просто чтобы показать, что я ve got):

class Node {    
    int operator();
    List<Node> nodes;
    int conditionNumber();    
}

По сути, либо Узел является листом и затем имеет номер условия (соответствующий одному из битов в массивах long []), либо Узел не является листом и, следовательно, ссылается на несколько подузлов.

Они просты, но позволяют выражать сложные логические выражения. Он отлично работает.

Пока все хорошо, все работает отлично. Однако у меня есть проблема: мне нужно оценить LOT выражений, чтобы определить, истинны они или ложны. По сути, мне нужно выполнить некоторые вычисления методом перебора для проблемы, для которой нет лучшего решения, чем перебор.

Поэтому мне нужно пройти по дереву и ответить либо true , либо false в зависимости от содержимого дерева и содержимого long [] .

Метод, который мне нужно оптимизировать, выглядит следующим образом: m не ищет перехода от O (x) к O (y), где y будет меньше x.

Я ищу «умноженное на x» ускорение: если я могу написать код если я буду работать в 5 раз быстрее, то у меня будет 5-кратное ускорение, и все, и я буду очень доволен этим.

Единственное улучшение, которое я вижу на данный момент - и я думаю, что оно будет огромным » times x " ускорение по сравнению с тем, что у меня есть сейчас - было бы генерировать байт-код для каждого дерева и иметь логику для каждого дерева, жестко запрограммированную в класс. Он должен работать хорошо, потому что у меня когда-либо будет только сотня или около того деревьев (но деревья не фиксированы: я не могу заранее знать, как деревья будут выглядеть, иначе было бы тривиально просто вручную жестко кодировать каждое дерево ).

Есть ли идея, кроме генерации байт-кода для каждого дерева?

Теперь, если я хочу попробовать маршрут генерации байт-кода, как мне это сделать?

5
задан SyntaxT3rr0r 11 April 2011 в 12:13
поделиться