Java 在这种情况下,是否值得使用HashMap来提高速度?

Java 在这种情况下,是否值得使用HashMap来提高速度?,java,performance,dictionary,hashmap,big-o,Java,Performance,Dictionary,Hashmap,Big O,我有一个调用距离函数的函数。距离函数计算两个输入字符串之间的Levenshtein距离算法。我试图找到输入单词missspelleed和使用它作为拼写检查器返回的英语单词之间的最短距离,但我不确定我的HashMap是否能让我在速度上取得进展。wordContainer是一个包含n个单词的数组,这是否会使我的查找时间停滞 下面是我的代码 虽然这有一个合理的时间复杂度,但它有很多超负荷的工作/创建您不需要的对象。我建议做一个简单的循环 private static List<String>

我有一个调用距离函数的函数。距离函数计算两个输入字符串之间的Levenshtein距离算法。我试图找到输入单词missspelleed和使用它作为拼写检查器返回的英语单词之间的最短距离,但我不确定我的HashMap是否能让我在速度上取得进展。wordContainer是一个包含n个单词的数组,这是否会使我的查找时间停滞

下面是我的代码
虽然这有一个合理的时间复杂度,但它有很多超负荷的工作/创建您不需要的对象。我建议做一个简单的循环

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;
}

您必须计算从单词到N个其他单词的Levenshtein距离。“计算距离N次”处于启用状态

你唯一可以改进的方法是,如果你能想出一种方法,避免计算时间上的距离


HashMap对此无能为力。你需要做的,我不知道这是否可行,是设计一种方法来避免检查距离单词很远的单词的距离。

如果你需要一种比这更快的方法,那么你必须使用索引机制

我能给你的建议是。它是一个开源且广泛使用的数据索引框架。此外,还有一些基于Lucene核心的开发版本。您可以在提供的链接上阅读更多内容

在为静态列表编制索引,或为针对静态列表计算的值编制索引后,您可以在当前所需的很短时间内检索它们


我希望这会有帮助。

这是个好人,继续用吧。您必须快速访问这些对象,这需要使用数据结构映射。但我的查找时间仍处于启用状态?是否希望比启用更快?启用是可以接受的时间复杂性。坏的是n^2和其他类似的值。所以它现在很快,你需要一个更快的方法吗?你可能想要的是所有距离最小的单词,但这只给出了一个。使用一个简单的循环会更有效。是的,我一开始有一个循环,但我正在尝试找到一种比On更快检查单词拼写的方法。可能按长度将所有单词加载到树中,只搜索树中距离比输入的拼写错误单词短的部分。@Yawn-您必须计算从单词到N个其他单词的Levenshtein距离,因此搜索必须至少打开。@Yawn我相信您可以这样做,但您需要一个预构建的数据结构。你们可以有一本以一两个字母开头的单词字典,并检查它们之间的距离。这是不一样的,但通常第一个字母是正确的。您真正需要的是将单词转换成拼音,然后找到距离。@Yawn最有可能的方法是建立一个字典/缓存,其中包含拼错的单词和最接近的匹配项,以及选择哪些单词作为替换项,如果该单词已经匹配,您还可以立即返回,与其用蛮力检查词典中已经存在的单词,还不如找出拼写错误的所有排列方式?也许能更快地找到他们,嗯。
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;
}