答案 0 :(得分:1)
TL; DR :忽略它
长答案:这取决于您的算法的其余部分以及您想要实现的目标。通常,您将对数组执行一些有用的操作,这些操作至少具有与填充数组相同的时间复杂度,因此数组填充不会导致时间复杂度。此外,使用0填充数组就像初始化数组一样,因此您的“真实”算法可以正常工作。但是在某些情况下你可以考虑。
请注意,我在以下示例中使用伪代码,我希望很清楚算法应该做什么。另请注意,所有示例都不会对数组执行任何有用的操作。这只是为了说明我的观点。
假设您有以下代码:
A = Array[n]
for(i=0, i<n, i++)
A[i] = 0
print "Hello World"
然后很明显,算法的运行时间高度依赖于n
的值,因此应该算作线性复杂度O(n)
另一方面,如果你有一个更复杂的功能,请说出这个:
A = Array[n]
for(i=0, i<n, i++)
A[i] = 0
for(i=0, i<n, i++)
for(j=n-1, j>=0, j--)
print "Hello World"
然后即使你考虑到填充数组的复杂性,你也会以O(n^2+2n)
的复杂性结束,它等于类O(n^2)
,因此在这种情况下并不重要。 / p>
最有趣的情况肯定是你有不同的选项用作基本操作。假设我们有以下代码(someFunction
是一个任意函数):
A = Array[n*n]
for(i=0, i<n*n, i++)
A[i] = 0
for(i=0, i*i<n, i++)
someFunction(i)
现在取决于您选择的基本操作。您选择哪一个高度依赖于您想要实现的目标。假设someFunction
是一个非常便宜的函数(关于时间复杂度),访问数组A
更昂贵。然后你可以使用O(n^2)
,因为访问数组已经完成n ^ 2次。另一方面,someFunction
与填充数组相比价格昂贵,您可以选择将其作为基本操作并与O(sqrt(n))
一起使用。
请注意,我们也可以得出结论,由于第一部分(数组填充)的执行频率高于其他部分(someFunction
),因此操作中的哪一个操作无关紧要更长的完成时间,因为在某些时候阵列填充将需要更长的时间。因此,您可以认为复杂性具有为二次O(n^2)
这可能是理论上的观点。但在现实生活中,你通常会有一个你想要计算的操作,而不关心其他操作。
实际上,您可以考虑忽略数组填充以及在上面提供的所有示例中将其考虑在内,这取决于print
或访问数组是否更昂贵。但我希望在前两个例子中很明显哪一个会增加运行时间,因此应该被视为基本操作。