我有以下函数:
public void scanText(char[] T){
int q=0;
for(int i=0;i<T.length;i++){
q = transFunc[preCompRow[q]+T[i]];
if(q==pattern.length){
System.out.println("match found at position: "+(i-pattern.length+2));
}
}
}
该函数扫描字符数组以搜索给定模式的匹配项,该模式存储为有限自动机。自动机的转移函数存储在名为transFunc的变量中。
我正在测试此函数在包含800000个模式的800万个字符文本中。问题是访问数组preCompRow[q](它是一个int[])非常慢。如果删除代码中的preCompRow[q],则性能会大大提高。我认为这可能是因为在每次循环中,q变量具有不同的非顺序值(2、56、18、9..)。
有没有更好的方法以非顺序方式访问数组?
先行致谢!
transFunc[preCompRow[q]+T[i]]
改为了transFunc[T[i]]
,只花费了9秒的时间。 @leoxs 在两个测试执行期间,我没有看到任何交换活动。我正在使用2 GB的堆。 - AAAtransFunc[T[i]]
、transFunc[1+T[I]]
、transFunc[T[I]]
,所有的性能都很好,但每次我在索引中添加 preCompRow[q] 时整个程序就出问题了。当我将q
固定为某个值时,事情变得非常快,例如transFunc[preCompRow[1]+T[I]]
。我的结论是问题在于q
的值,在循环的每一次迭代中,它可以取 1-#模式字符之间的任何值。 - AAA