在计算以下算法的时间复杂度时,我的解释是否正确?
正在使用HashSet moduleMarksheetFiles来添加包含指定的moduleName的文件。
for (File file: marksheetFiles){
while(csvReader.readRecord()){
String moduleName = csvReader.get(ModuleName);
if (moduleName.equals(module)){
moduleMarksheetFiles.add(file);
}
}
}
设m为文件数
因此,平均时间复杂度为:O((m * k)^ 2)。
这是对的吗?
另外,你会如何计算最坏的情况?
感谢。
PS。这不是功课,只是分析我的系统算法来评估性能。
答案 0 :(得分:2)
不,它没有平方,这是O(nk)。 (从技术上讲,这意味着它也 O((nk)²),但我们并不关心。)
你的误解是HashSet的最坏情况表现在这里。但是,即使散列表可能具有最坏情况的O(n)插入时间(如果需要重新散列每个元素),其amortized插入时间为O(1)(假设您的散列函数表现良好; { {1}}大概是)。换句话说,如果你插入多个东西,那么很多东西都是O(1)偶尔的O(n)插入无关紧要。
因此,我们可以将插入视为常量时间操作,因此性能完全由内部循环体的迭代次数决定,即O(nk)。