我有一个表格的规则清单
L1→> (A,B,C)
L2 – > (D,E),
L3→> (F,G,A),
L4-> (C,A)
…..
此列表包含约30k个这样的规则.
我有一个输入的形式(X,Y,Z)
这创建一个方法
List matchRules(input)
哪个属于RuleMatcher类
我从一个非常简单的明白天真的解决方案开始,为了使框架下降,得到一些工作.
public RuleMatcher(Collection rules) {
this.rules = rules;
}
public Collection matchRules(List input) {
List matchingRules = new ArrayList<>();
for(Rule r: this.rules) {
if(r.matches(input)) {
matchingRules.add(r);
}
}
return matchingRules;
}
匹配是一个非常简单的函数,用于检查长度是否相同,然后将每个令牌作为for循环进行检查.
这个matchRules函数的调用数十亿次.
显然这是一个很差的实现.根据我的剖析器,至少有一半的执行时间是在这个匹配函数中花费的.
我在想两种可能的解决方案:
A.某种Trie数据结构,可以匹配可以匹配的规则链.
B.某种哈希函数.每个符号被赋予唯一的标识符.不幸的是,有大约8,000个独特的符号,所以这可能是困难的.
C.对右边的大小进行一个哈希曼调节,规则中的令牌数量.不幸的是,大多数规则大小相同,所以这甚至不值得.
一些你想出来的一些令人敬畏的解决方案.
我希望有人能解释这个问题.
编辑:令牌只是一个唯一编号的对象.例如“NN”是一个令牌. “NN”的每个实例是完全相同的.
匹配代码:
public boolean rhsMatches(List tokens) {
if(tokens.size()!=rhsSize()) return false;
for(int i = 0;i
if(!rightSide.get(i).equals(tokens.get(i)) {
return false;
}
}
return true;
}
它不是很漂亮,但它的简单.