我对这些情况的时间复杂度是正确的吗?
I'm right about the time complexity on these situations?
在分析这样的代码时间复杂度时,我有点怀疑我假设的正确性。在这段代码中,array.length() 被视为线性复杂度函数。最后一个细节很重要,最初的练习认为它只是一个常量存储值,但我想知道如果不是的话会发生什么):
void printPairs(int[] array) {
for (int i = 0; i < array.length(), i++) {
for (int j = 0; j < array.length(), j++){
print(array[i], array[j])
}
}
}
所以,如果 array.length 是数组中的一个变量,就像 java 中的那样,所有这些东西都只是 O(N^2)。但是如果 array.length() 是一个函数呢?他的实现应该是线性的……然后……起初我认为它应该成为一个 O(N^4) 代码,但现在更好地考虑它我认为只是 O(N^3)。但我也认为这可能是我对这两个假设都错了,它一直是 O(N^2)。
有人可以纠正我吗?谢谢!
j < array.length()
被调用 array.length()*array.length()
次。
如果 array.length()
是 O(1),则 O(N^2)。 (例如 C++)
如果array.length()
是O(N),那么O(N^3)。 (例如 C strlen()
尽管代码可能会将其优化回 O(1))
很有可能编译器可以做一个简单的优化:
void printPairs(int[] array) {
int n = array.length();
for (int i = 0; i < n, i++) {
for (int j = 0; j < n, j++){
print(array[i], array[j])
}
}
}
那就是 O(N^2)
在分析这样的代码时间复杂度时,我有点怀疑我假设的正确性。在这段代码中,array.length() 被视为线性复杂度函数。最后一个细节很重要,最初的练习认为它只是一个常量存储值,但我想知道如果不是的话会发生什么):
void printPairs(int[] array) {
for (int i = 0; i < array.length(), i++) {
for (int j = 0; j < array.length(), j++){
print(array[i], array[j])
}
}
}
所以,如果 array.length 是数组中的一个变量,就像 java 中的那样,所有这些东西都只是 O(N^2)。但是如果 array.length() 是一个函数呢?他的实现应该是线性的……然后……起初我认为它应该成为一个 O(N^4) 代码,但现在更好地考虑它我认为只是 O(N^3)。但我也认为这可能是我对这两个假设都错了,它一直是 O(N^2)。
有人可以纠正我吗?谢谢!
j < array.length()
被调用 array.length()*array.length()
次。
如果 array.length()
是 O(1),则 O(N^2)。 (例如 C++)
如果array.length()
是O(N),那么O(N^3)。 (例如 C strlen()
尽管代码可能会将其优化回 O(1))
很有可能编译器可以做一个简单的优化:
void printPairs(int[] array) {
int n = array.length();
for (int i = 0; i < n, i++) {
for (int j = 0; j < n, j++){
print(array[i], array[j])
}
}
}
那就是 O(N^2)