【问题标题】:How to calculate complexity of internal iterations如何计算内部迭代的复杂度
【发布时间】:2017-01-05 07:56:08
【问题描述】:
这是关于识别 java 程序的时间复杂度的。如果我有 for 或 while 等迭代,我们可以确定复杂性。但是如果我使用 java API 来做一些任务,如果它是内部迭代的,我认为我们也应该包括它。如果是这样,该怎么做。
例子:
String someString = null;
for(int i=0;i<someLength;i++){
someString.contains("something");// Here i think internal iteration will happen, likewise how to identify time complexity
}
谢谢,
阿迪亚
【问题讨论】:
标签:
java
iteration
time-complexity
【解决方案1】:
Java API 中的内部操作根据其实现具有自己的时间复杂度。例如,String 变量的 contains 方法以线性复杂度运行,其中依赖关系基于您的 someString 变量的长度。
简而言之 - 您应该检查内部操作的工作原理,并在计算复杂性时将其考虑在内。
特别是对于您的代码,时间复杂度类似于 O(N*K),其中 N 是循环的迭代次数 (someLength),K 是您的 someString 变量的长度。
【解决方案2】:
您是正确的,因为内部迭代会增加您的复杂性。但是,除了极少数情况外,API 方法的复杂性没有得到很好的记录。许多收集操作对所有实现都有上限要求,但即使在这种情况下,也不能保证实际代码的复杂度不会低于要求。对于像String.contains() 这样的情况,有根据的猜测几乎肯定是正确的,但同样不能保证。
获得一致指标的最佳选择是查看您正在使用的特定 API 实现的源代码,并尝试从中找出复杂性。另一种好的方法是使用各种输入大小和类型对您关心的方法运行基准测试,并简单地根据结果图的形状估计复杂性。对于代码过于复杂而无法直接分析的情况,后一种方法可能会产生更好的结果。