我有一个程序,它创建一个类字典,在其中填充字符串的arrayList和从命令行参数给出的单词(按字母顺序,所有不同的长度)。无论如何,我需要实现二进制搜索,以在字典中查找作为回溯方法的一部分的前缀。当前缀比字典中的单词长时,我遇到问题 - 我试图调整这种情况的二进制搜索,但它产生的结果不正确。我真的不明白二进制搜索足以解决这个问题。如果我没有考虑前缀长于一个单词的问题,那么.subString会产生字符串indexoutofbounds。任何帮助将不胜感激。
public int searchPrefix(String prefixKey){
int minIndex=0;
int maxIndex= newDictionary.size()-1;
return searchPrefix( prefixKey, minIndex,maxIndex);
}
public int searchPrefix(String prefixKey, int minIndex, int maxIndex){
if(minIndex>maxIndex){
return-1;
}
int midIndex=(maxIndex-minIndex)/2+minIndex;
if (prefixKey.length()>newDictionary.get(midIndex).length()){
return searchPrefix( prefixKey, midIndex+1,maxIndex);
}
else if(newDictionary.get(midIndex).length(<prefixKey.length()&&newDictionary.get(midIndex).compareTo(prefixKey.substring(0,newDictionary.get(midIndex).length()))>0){
return searchPrefix(prefixKey,minIndex,maxIndex);
}
else if(newDictionary.get(midIndex).substring(0,prefixKey.length()).compareTo(prefixKey)>0){
return searchPrefix(prefixKey,minIndex,maxIndex-1);
}
else if(newDictionary.get(midIndex).length()<prefixKey.length()&&newDictionary.get(midIndex).compareTo(prefixKey.substring(0,newDictionary.get(midIndex).length()))<0){
return searchPrefix(prefixKey,minIndex,maxIndex);
}
else if(newDictionary.get(midIndex).substring(0,prefixKey.length()).compareTo(prefixKey)<0){
return searchPrefix( prefixKey, midIndex+1,maxIndex);
}
else
return midIndex;
}
答案 0 :(得分:0)
String方法compareTo负责不同长度的String值,以便(例如)&#34; ABC&#34;先于&#34; ABCD&#34;所以这些方法中的所有区别都不是必需的。
声明的级联开始:
if (prefixKey.length() > newDictionary.get(midIndex).length()){
return searchPrefix( prefixKey, midIndex+1,maxIndex);
}
else if(newDictionary.get(midIndex).length() < prefixKey.length() && ...
但这些条件是相同的,这意味着永远不会到达第二个分支。
你有两个陈述:
return searchPrefix(prefixKey,minIndex,maxIndex);
在任何情况下都不应该使用与传递给当前调用的参数完全相同的参数进行递归调用:无限递归结果。
为什么不能使用Arrays.binarySearch?
我无法提出改进建议,因为您尚未描述问题。请提供一个示例,给出一个小字典和一组具有预期结果的键。