我想确保我正确地进行时间复杂度分析。似乎有许多不同的分析。
万一人们不知道问题这是问题描述。
给定两个字(
beginWord
和endWord
)以及字典的单词列表,找到从beginWord
到endWord
的最短转换序列的长度,这样:一次只能更改一个字母。 每个转换后的单词必须存在于单词列表中。请注意,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)
它是否正确?
答案 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
(已摊销),因此请考虑切换到该值。