【问题标题】:Is it worth using a HashMap in this instance for speed?在这种情况下是否值得使用 HashMap 来提高速度?
【发布时间】:2017-07-01 02:54:31
【问题描述】:

我有一个调用距离函数的函数。 distance 函数计算两个输入字符串之间的 Levenshtein 距离算法。我试图找到输入的单词(拼写错误)和要返回的英文单词(使用它作为拼写检查器)之间的最短距离,但我不确定我的 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()));
    }

【问题讨论】:

  • 这是个好人,继续使用它。您必须快速访问这些对象,这需要使用数据结构映射。
  • 但是我的查找时间还是O(n)?
  • 你想要比 O(n) 更快?
  • O(n) 是可接受的时间复杂度。不好的是 n^2 和其他与此类似的值。所以目前速度很快,需要更快的方法吗?
  • 您可能想要的是所有距离最短的单词,但这只给出了一个。使用简单的循环会更有效。

标签: java performance dictionary hashmap big-o


【解决方案1】:

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

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

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

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    您必须计算从word 到 N 的 Levenshtein 距离。计算N次距离是O(N)。

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

    HashMap 对此无能为力。您需要做的(我不知道这是否可能)是设计一种方法来避免检查与word 相距“很远”的单词的距离。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 是的,起初我有一个循环 - 但我正在尝试找到一种比 O(n) 更快地拼写检查单词的方法。也许将所有单词按长度加载到树中,并且只搜索树中距离小于输入的拼写错误的单词的部分。
      • @Yawn - 您必须计算从 word 到 N 个其他单词的 Levenshtein 距离,因此搜索必须至少 O(N)
      • @Yawn 我相信你可以做到,但你需要一个预建的数据结构。您可以拥有一个以给定字母(或两个)开头的单词的字典,并检查这些单词的距离。这不一样,但通常第一个字母是正确的。你真正需要的是将单词转换成语音,然后找到距离。
      • @Yawn 你最好的办法很可能是建立一个字典/缓存的单词拼写错误和最接近的匹配(以及哪些单词被选为替换)如果单词已经是一个,你也可以立即返回匹配,而不是蛮力检查字典中已有的单词。
      • 会找到拼写错误作品的所有排列吗?也许可以更快地找到他们,嗯。
      猜你喜欢
      • 2019-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 1970-01-01
      • 2012-10-05
      • 1970-01-01
      • 2017-08-31
      相关资源
      最近更新 更多