【问题标题】:Word ladder complexity analysis字梯复杂度分析
【发布时间】:2017-07-02 06:07:20
【问题描述】:

我想确保我正确地进行了时间复杂度分析。似乎有很多不同的分析。

以防人们不知道问题,这是问题描述。

给定两个单词(beginWordendWord)和一个字典的单词列表,找出从 beginWordendWord 的最短转换序列的长度,这样:

一次只能更改一个字母。 每个转换后的单词都必须存在于单词列表中。请注意,beginWord 不是转换后的单词。 例如,

给定:

beginWord = "hit"
endWord = "cog"
wordList = ["hot","dot","dog","lot","log","cog"]

因为一个最短的变换是“hit” -> “hot” -> “dot” -> “dog” -> “cog”, 返回它的长度 5。

这是简单的 BFS 算法。

    static int ladderLength(String beginWord, String endWord, List<String> wordList) {
    int level = 1;
    Deque<String> queue = new LinkedList<>();
    queue.add(beginWord);
    queue.add(null);
    Set<String> visited = new HashSet<>();
    // worst case we can add all dictionary thus N (len(dict)) computation
    while (!queue.isEmpty()) {
        String word = queue.removeFirst();
        if (word != null) {
            if (word.equals(endWord)) {
                return level;
            }
            // m * 26 * log N
            for (int i = 0; i < word.length(); i++) {
                char[] chars = word.toCharArray();
                for (char c = 'a'; c <= 'z'; c++) {
                    chars[i] = c;
                    String newStr = new String(chars);
                    if (!visited.contains(newStr) && wordList.contains(newStr)) {
                        queue.add(newStr);
                        visited.add(newStr);
                    }
                }
            }
        } else {
            level++;
            if (!queue.isEmpty()) {
                queue.add(null);
            }
        }
    }
    return 0;
}

wordList(字典)包含N元素,beginWord的长度是m

在最坏的情况下,队列将包含单词列表中的所有元素,因此,外部 while 循环将运行 o(N)。 对于每个单词(长度 m),它会尝试 26 个字符(a 到 z),因此内部嵌套的 for 循环是 o(26*m),而在内部 for 循环内部,它确实 wordList.contains 假设它是 o(logN)。 所以总的来说它是 o(N*m*26*logN) => o(N*mlogN) 它是否正确?

【问题讨论】:

    标签: algorithm time-complexity


    【解决方案1】:

    List&lt;T&gt; 类型不会自动对其元素进行排序,而是“忠实地”保持所有元素的添加顺序。所以wordList.contains 实际上是O(n)。但是对于HashSet,例如visited,这个操作是O(1)(摊销),所以考虑切换到那个。

    【讨论】:

    • 感谢您的评论。你觉得整体分析是正确的吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    相关资源
    最近更新 更多