我有一个120000+单词的字典。我想以有效的方式搜索它,以检查它是否包含某个单词。
我想检查给定字符串的起始字符,然后仅从下面的字母表和上面的字母表执行搜索(以减少搜索空间)。
例如,如果word是堆栈。我想开始' r'并且完成了'。在这种情况下,开始位置和结束位置。
到目前为止,我已经这样做了:
inputFile = new Scanner(myFile);
while (inputFile.hasNext()) {
fileLine = inputFile.nextLine();
dictWords.add(fileLine);
no++;
}
HelperClass.setSearchPos(dictWords, "syncope", 0, dictWords.size());
public static void setSearchPos(ArrayList<String> dictList, String str, int startSearchPoint, int finishSearchPoint){
ArrayList<String> reducedSearchWords = new ArrayList<String>();
initSearchPos = startSearchPoint;
finalSearchPos = finishSearchPoint-1;
int midPos = (initSearchPos + finalSearchPos)/2;
char startWordChar = dictList.get(initSearchPos).charAt(0);
char finishWordChar = dictList.get(finalSearchPos).charAt(0);
startWordChar = shiftChar(startWordChar, 1);
finishWordChar = shiftChar(finishWordChar, -1);
while( startWordChar < str.charAt(0) &&
finishWordChar > str.charAt(0) ){
if(dictList.get(midPos).charAt(0) > str.charAt(0)){
setSearchPos(dictList, str, 0 , midPos);
}
if(dictList.get(midPos).charAt(0) < str.charAt(0)){
setSearchPos(dictList, str, midPos , finalSearchPos);
}
}
System.out.println("Star Pos " + initSearchPos);
System.out.println("Mid Pos " + midPos);
System.out.println("Finish Pos " + finalSearchPos);
}
public static char shiftChar(char c, int key) {
char shiftedChar;
shiftedChar = (char) ((char) c + key);
//This is used to bind the characters between Lowercase a-z
if (shiftedChar > 122) {
shiftedChar = (char) ((char) c - 123 + 97 + key);
}
return shiftedChar;
}
输出结果为:
Star Pos 88978
Mid Pos 96382
Finish Pos 103787
Star Pos 88978
Mid Pos 96382
Finish Pos 103786
Star Pos 88978
Mid Pos 96381
Finish Pos 103785
我对Star Pos和Mid Pos感到满意,但循环将继续,直到Finish Pos为0并抛出OutofBoundException。
任何建议?
答案 0 :(得分:3)
答案 1 :(得分:1)
最常规的做法是使用二进制搜索。
另一种方法是为每个起始aplhabet索引字典,然后直接转到该索引。但是,只有当您将其用于多次搜索时才有用,对于单次搜索而言,最好采用二分搜索。
另一件事是,如果进行多次搜索,您可以将索引和二进制搜索结合起来,使搜索速度更快。