Time Complexity of Code for finding longest word inside dictionary
问题如下:你从一个2个字母的单词开始,你可以在单词的前后附加字母。您必须返回字典中存在的最长单词,您可以通过在 2 个字母单词的前后附加字母来形成该单词,并且您形成的每个新单词也必须在字典中
例如:
开始:\\'at\\'
字典:[帽子,聊天,聊天,老鼠,速率,橙色]
输出:\\'chats\\',因为:at -> hat -> chat -> chats
我的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | 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; } |
我想知道这个算法的时间复杂度是多少?我一辈子都想不通。
答案很大程度上取决于您的字典(最大可达长度为 L<=n 1 的 n 个单词)以及用于存储它的数据结构。对
至于对
最坏情况的字典将所有单词组成一个链 "ab"、"abc"、"abcd" 等。您访问每个单词的总成本为 O(vn L )=O(n^3) (O(v L)=O(n^2) 与哈希表)。现实的字典会快得多,不仅因为 L 更小,而且因为 v 更小;不幸的是,确切的加速很难分析。假设 L 是 ??(log(n)); 可能是合理的。 v 作为 n 的函数,没有有意义的渐近表达式,因为现实的字典没有任意大的 n。