在这个例子中使用HashMap的速度是否值得?

时间:2017-02-13 07:29:56

标签: java performance dictionary hashmap big-o

我有一个调用距离函数的函数。距离函数计算两个输入字符串之间的Levenshtein距离算法。我试图找到一个输入的单词(miss spelleed)和一个返回的英语单词之间的最短距离(使用它作为拼写检查程序),但我不确定我的HashMap是否能让我获得速度。 wordContainer是一个包含n个单词的数组,这会让我的查找时间卡在O(n)中吗?

我的代码

  private static String findClosestMatch(String word) {
        Map<Integer, String> wordAndDistanceMap = new HashMap<>();
        wordContainer.forEach(s -> wordAndDistanceMap.put(distance(s, word), s));
        return wordAndDistanceMap.get(Collections.min(wordAndDistanceMap.keySet()));
    }

3 个答案:

答案 0 :(得分:1)

虽然这有一个合理的时间复杂性,但它有很多人在做工作/创建你永远不需要的对象。我建议有一个简单的循环。

private static List<String> findClosestMatch(String word) {
    int min = Integer.MAX_VALUE;
    List<String> minWords = new ArrayList<>();
    for (String s : wordContainer) {
        int dist = distance(s, word);
        if (dist < min) {
           min = dist;
           minWords.clear();
        }
        if (dist == min)
           minWords.add(s);
    }
    return minWords;
}

答案 1 :(得分:0)

你必须计算从word到N个其他词的Levenshtein距离。计算距离N次是O(N)。

唯一可以改进O(N)的方法是,您可以设法避免计算距离O(N)次。

HashMap对此无能为力。你需要做什么(我不知道这是否可行)是设法避免检查距离word“很远”的单词的距离。

答案 2 :(得分:0)

如果您需要比此更快的方法,那么您必须使用索引机制。

我可以建议你Apache SOLR。它是一个开源且广泛使用的框架来索引数据。此外,还有一些基于Lucene核心的Elastic Search和{{3}}开发版本。您可以在提供的链接上阅读更多信息。

在为静态列表建立索引或为您计算的值编制索引后,您可以在当前需要的非常短的时间内检索它们。

我希望这会有所帮助。