字梯复杂性分析

时间:2017-07-02 06:07:20

标签: algorithm time-complexity

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

万一人们不知道问题这是问题描述。

  

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

     

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

     

假设:

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

最短的转变是"击中" - > "热" - > "点" - > "狗" - > "嵌齿&#34 ;,   返回它的长度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假设它是&#39; so( logn)时间。 总的来说,它是(N * m * 26 * logN)=&gt; O(N * mlogN) 它是否正确?

1 个答案:

答案 0 :(得分:1)

$sqlUitlezenRanksUitlezen = mysqli_query($conn, "SELECT * FROM `Ranks` ORDER BY `RankID`"); $sqlDataRanksUitlezen = mysqli_fetch_assoc($sqlUitlezenAccountBewerken); foreach($sqlDataRanksUitlezen AS $sqlUitlezenRanksUitlezenEach) { echo '<option value="'.$sqlUitlezenRankEach['RankID'].'">'.$sqlUitlezenRankEach['RankNaam'].'</option>'; } 类型不会自动对其元素进行排序,而是“忠实地”按照添加顺序保留所有元素。所以List<T>实际上是wordList.contains。但是对于O(n),例如HashSet,此操作为visited(已摊销),因此请考虑切换到该值。