算法的时间复杂度

时间:2012-04-29 01:49:34

标签: algorithm big-o time-complexity hashset

在计算以下算法的时间复杂度时,我的解释是否正确?

  • 正在使用HashSet moduleMarksheetFiles来添加包含指定的moduleName的文件。

    for (File file: marksheetFiles){
         while(csvReader.readRecord()){
             String moduleName = csvReader.get(ModuleName);
    
             if (moduleName.equals(module)){
                   moduleMarksheetFiles.add(file);
             }
         }
     }
    
  • 设m为文件数

  • 设k为每个文件的平均记录数。
  • 由于每个文件只添加一次,因为HashSet不允许重复。 HashSet.add()平均为O(1),最坏情况为O(n)。
  • 搜索具有指定moduleName的记录涉及将文件中的每条记录与moduleName进行比较,将采取O(n)步骤。

因此,平均时间复杂度为:O((m * k)^ 2)。

这是对的吗?

另外,你会如何计算最坏的情况?

感谢。

PS。这不是功课,只是分析我的系统算法来评估性能。

1 个答案:

答案 0 :(得分:2)

不,它没有平方,这是O(nk)。 (从技术上讲,这意味着它 O((nk)²),但我们并不关心。)

你的误解是HashSet的最坏情况表现在这里。但是,即使散列表可能具有最坏情况的O(n)插入时间(如果需要重新散列每个元素),其amortized插入时间为O(1)(假设您的散列函数表现良好; { {1}}大概是)。换句话说,如果你插入多个东西,那么很多东西都是O(1)偶尔的O(n)插入无关紧要。

因此,我们可以将插入视为常量时间操作,因此性能完全由内部循环体的迭代次数决定,即O(nk)。