【问题标题】:Time Complexity of Code for finding longest word inside dictionary在字典中查找最长单词的代码时间复杂度
【发布时间】:2018-03-03 16:36:37
【问题描述】:

问题如下:你从一个2个字母的单词开始,你可以在单词的前面和后面附加字母。您必须返回字典中存在的最长单词,您可以通过在 2 个字母单词的前后附加字母来形成该单词,并且您形成的每个新单词也必须在字典中

例如: 开始:'at'

字典:[帽子、聊天、聊天、老鼠、评分、橙色]

输出:'chats',因为:at -> hat -> chat -> chats

我的代码如下:

public static String longest(ArrayList<String> input) {    
    return helper('at', dict);
}


public static String helper(String in, ArrayList<String> dict) {

    ArrayList<String> maxes = new ArrayList<String>();
    for (char a = 'a'; a < 'z'; a++) {
      String front = Character.toString(a) + in;
      String back = in + Character.toString(a);
      if (dict.contains(front)) {
        maxes.add(helper(front, dict));
      }
      if (dict.contains(back)) {
        maxes.add(helper(back, dict));
      }
    }

    if (maxes.size() == 0) {
      return in;
    } 

    String word = "";
    for (String w : maxes) {
      if (w.length() > word.length()) {
        word = w;
      }
    }
    return word;
  }

我想知道这个算法的时间复杂度是多少?我一辈子都想不通。

【问题讨论】:

  • 评论,因为它没有回答关于你的算法的问题——但我想我会向后工作,假设意图是这适用于全长字典。将字典预处理为 (ap/pre)pend 链的有向图。然后要检查一个单词,只需找到输入节点的子节点即可。

标签: java string recursion time time-complexity


【解决方案1】:

答案很大程度上取决于您的字典(n 个最大可达长度 Ln+1 的单词)和您的数据结构用于存储它。对helper 的每次调用(没有它的递归调用)都是 O(n L),dict 是一个 ArrayList,而对于哈希表,它是 O(L)(不存在不太可能的碰撞)。 (字典中可能有很长的无法到达的单词,但与它们进行比较仍然只花费 O(L),因为您的试用词不能再长了。)

至于对helper 的调用次数:这只是对通过前置/附加字母相关的单词树进行的深度优先搜索。因此,它是 O(v),其中 v 是访​​问的顶点数。各种输入词的 v 值也取决于您的字典:vn,当然,而且通常要少得多。举个例子:使用我的/usr/share/dict/words 中的 71813 行,它们都是 ASCII 字母(并且忽略大小写),所考虑的最多单词是 593(对于 argon 中的“Ar”)。

最坏情况的字典将所有单词组成一个链“ab”、“abc”、“abcd”、。您访问每个单词的总成本为 O(vn L)=O(n^3) (O(v L)=O (n^2) 与哈希表)。现实的字典会快得多,不仅因为 L 更小,还因为 v 更小;不幸的是,确切的加速很难分析。假设 L 是 Θ(log(n)); 可能是合理的。 v 没有有意义的渐近表达式作为 n 的函数,因为 realistic 字典没有任意大的 n .

【讨论】:

  • 它真的依赖字典吗?在计算 O(n) 时,您不只是假设最坏的情况来获得上限吗?我认为整个事情是:O(访问顶点),并且每次调用 helper() 时都会有一个“顶点”?
  • @Adam:这取决于字典(其大小明显是 n),因为输入词(甚至所有可能的输入词)可能是消失的祖先大字典的子集。 (考虑一个没有三个字母的单词!)当然它仍然是 O(n) (假设 dict.contains() 很快),但关键是对于一个现实的字典,它可能比通常的“最坏情况”分析更悲观. (是的,每个调用都是一个顶点,因为它扩展了一个单词。)
  • 好的,这有点清楚了!我仍然会找到一个最坏情况字典的示例,这对于您将如何解决此类问题很有趣/很有启发性。 (在编辑之前无法删除反对票)
  • @DavisHerring,感谢您的回复。最大可达长度 L 是多少?它是字典中最长单词的长度吗?
  • @clueless_wanderer:正如答案所说,_L_
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 2011-07-21
  • 2020-08-12
相关资源
最近更新 更多