我编写此代码以搜索较大文本中的小文本。到目前为止,它非常缓慢。我该如何优化它?请帮我优化这段代码。
public class St {
/**
* @param args the command line arguments
*/
public static void main(String[] args) throws IOException {
// TODO code application logic here
BufferedReader b1=new BufferedReader(new InputStreamReader(System.in));
String s=b1.readLine();
String t=b1.readLine();
String news = null;
//double u=t.hashCode();
//double q=s.hashCode();
//double x;
//.out.print(u+"\n"+q);
int x=t.length();
int y=s.length();
for(int i=0;i<y-x-1;i++){
//news=s.substring(i, i+t.length());
//x=news.hashCode();
//System.out.println(news);
if(t.equals(s.substring(i, i+x))){
System.out.println(i);
}
}
}
}
答案 0 :(得分:1)
您可以选择其中一种众所周知的算法及其实现,以便进行此类搜索。
您的选项包括Knuth Morris Pratt,Boyer Moore和Rabin Karp算法。每个都有自己的复杂性保证,一个可能比另一个基于您的输入数据更好。
从易于实施的角度来看,具有良好滚动哈希函数的Rabin Karp应该能够为您提供可接受的性能。 here提供了可靠的实施方案。
可能值得探索的另一个非常好的选择是正则表达式。正则表达式引擎很可能实现了一种快速算法来执行这种性质的子串匹配。
答案 1 :(得分:0)
虽然有更智能的算法,但如果没有它们,您可以实现一些非平凡的改进。只需使用Java中的内容:
for (int i=hay.indexOf(needle); i!=-1; i=hay.indexOf(needle, i+1) {
System.out.println(i);
}
由于您n
次复制m
字符只是为了比较它们,因此您的算法速度非常慢。这个完全避免复制。虽然实际字符串的复杂度仍为O(m*n)
,但它的表现要好得多,因为通常只需要对几个字符进行比较。