Algorithm 算法的时间复杂度

Algorithm 算法的时间复杂度,algorithm,big-o,time-complexity,hashset,Algorithm,Big O,Time Complexity,Hashset,在计算以下算法的时间复杂度时,我的解释正确吗 一个名为moduleMarksheetFiles的哈希集用于添加包含指定moduleName的文件 for (File file: marksheetFiles){ while(csvReader.readRecord()){ String moduleName = csvReader.get(ModuleName); if (moduleName.equals(module)){

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

  • 一个名为moduleMarksheetFiles的哈希集用于添加包含指定moduleName的文件

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

  • 设k为每个文件的平均记录数
  • 因为HashSet不允许重复,所以每个文件只添加一次。add()的平均值为O(1),最坏情况为O(n)
  • 搜索具有指定moduleName的记录需要将文件中的每个记录与moduleName进行比较,这将需要O(n)个步骤
因此,平均时间复杂度为:O((m*k)^2)

这是正确的吗

还有,你如何计算最坏的情况

谢谢


这不是作业,只是分析我系统的算法来评估性能。

不,不是平方,这是O(nk)。(从技术上讲,这意味着它也是O((nk)²),但我们不在乎。)

您的误解是,在这里最重要的是HashSet最糟糕的性能。然而,即使哈希表可能有最坏情况下的O(n)插入时间(如果它需要重新灰化每个元素),它的插入时间也是O(1)(假设您的哈希函数表现良好;
File.GetHashCode
可能是)。换句话说,如果插入多个对象,那么其中的许多对象将是O(1),因此偶尔插入O(n)并不重要


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

在第四和第五个项目符号中,n==m吗?此外,一旦将
文件添加到
模块标记表文件
,为什么不中断内部循环?最后,什么样的数据结构是
marksheetFiles
?它不只是O(mk)吗?为什么你认为它是平方的?@Ted Hopp-marksheetFiles也是一种哈希集数据结构。是的,n==m在第五个要点中对不起。由于该系统已经开发,在下一个循环之前,目前无法添加中断。谢谢你的建议though@Kevin-我认为它是平方的,因为您必须将每个记录与moduleName进行比较。答案是错误的。你能解释一下为什么你认为它是O(mk)吗?除非moduleName.equals(module)需要O(mk)时间,否则总体时间复杂度是O(mk)。O(nk)是否意味着它是线性的?是的,在文件数量和每个文件的平均行数的乘积中是线性的。或者,换句话说,所有文件的总行数是线性的。你最后的陈述是误导性的。哈希集插入是O(nk)最坏的情况,即使是无限大小的表,也不需要重新灰化-因为冲突。假设
hash(element)=1
[对于每个元素]-每个搜索都是
O(n)
,因此整个算法的最坏情况复杂性确实是
O(n^2k^2)
。一般情况当然不是。对,是的,我假设一个行为良好的散列函数<代码>文件
,来自标准库,大概有一个。正如我所说的,这是误导性的-没有错。对于有经验的读者来说,目的是明确的,但可能会让新手程序员感到困惑。