【问题标题】:How to search a word in dictionary efficiently without using linear search java: Reducing Search Space如何在不使用线性搜索java的情况下有效地搜索字典中的单词:减少搜索空间
【发布时间】:2015-09-28 14:56:39
【问题描述】:

我有一本包含 120000 多个单词的字典。我想以一种有效的方式搜索它以检查它是否包含某个单词。

我想检查给定字符串的起始字符,然后只从下面的字母表和上面的字母表执行搜索(以减少搜索空间)。

例如,如果单词是堆栈。我想以'r'开始并以't'结束。在这种情况下,开始位置和结束位置。

到目前为止,我已经这样做了:

    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。

有什么建议吗?

【问题讨论】:

  • binarySearch 已经存在。
  • 您正在将while 与递归结合起来。你每次都从finishSearchPoint 中减去 1。

标签: java performance search dictionary processing-efficiency


【解决方案1】:

您是否尝试过查看 Trie 数据结构?

https://en.wikipedia.org/wiki/Trie

给定一个现有的单词词典,这可以解决搜索特定单词的问题,同时占用最少的空间。

【讨论】:

    【解决方案2】:

    最常规的做法是使用二分搜索。

    另一种方法是为每个起始 aplhabet 索引字典,然后直接进入该索引。但这只有在您将它用于多个搜索时才有用,因为对于单个搜索,最好使用二分搜索。

    另一件事是,如果进行多次搜索,您可以将索引和二分搜索结合起来,从而使您的搜索速度更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-23
      • 2021-06-12
      • 2020-12-09
      • 1970-01-01
      • 2017-02-15
      • 2020-09-11
      • 2020-10-13
      • 1970-01-01
      相关资源
      最近更新 更多