java 有序列表_Java中的快速有序列表匹配算法

我有一个表格的规则清单

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;

}

它不是很漂亮,但它的简单.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值