【发布时间】:2020-06-01 10:03:11
【问题描述】:
我有几个关于 Java Collection 的 add 函数如何处理字符串的问题。例如,在下面的代码 sn-p 中,我将字符串的 List 复制到 HashSet。在这种情况下,最坏情况下的总时间复杂度是多少?是 O(M x N) 还是 O(N),其中 M 是列表中任意字符串的最大长度,N 是列表中字符串的总数。
public HashSet<String> createDict(List<String> wordList) {
HashSet<String> wordDict = new HashSet<>();
for(String word : wordList) {
wordDict.add(word);
}
return wordDict;
}
如果我使用下面的代码而不是循环,时间复杂度会完全相同吗?
HashSet<String> wordDict = new HashSet<>(wordList);
【问题讨论】:
-
"是 O(M x N) 还是 O(N),其中 M 是列表中任何字符串的最大长度 [...]",可以你解释一下?为什么长度会影响复制过程?为什么它会与 N 相乘?
-
列表的长度(N)会影响复制过程,因为我正在运行一个循环来遍历列表中的所有字符串。但我的问题是,特定字符串的最大长度(M)是否也会影响副本的时间复杂度?如果是,为什么?
-
它没有,这与
HashSet如何添加元素和工作有关。请参阅以下提供相关信息的答案。 但是这是现实的答案。您可能会争辩说长度 M 必须至少被读取一次。读取是逐个字符完成的,如果你对每个 n 都进行读取,那么复杂度确实是 O(M x N)。但这是“我非常重视 O 符号”的答案。 -
没有字符串按值复制,仅按引用复制,因此它们的长度无关紧要。
标签: java string collections time-complexity