当您的函数具有多个非嵌套循环时,是否会改变O(N)的时间复杂度?我知道,如果您要编写一个函数来记录数组的每个元素,则可以通过一个循环来执行此操作,从而为您提供O(N)的bigO,但是如果您添加更多的循环,那么将为您提供一个bigO O(N *循环数)?
考虑此字符串压缩功能,鉴于它多次遍历字符串,它是什么bigO:
function compression(string) {
let compressed = "";
let map = {
}
string.split("").forEach((e, i) => {
map[e] = 0;
})
string.split("").forEach((e, i) => {
map[e] += 1;
})
for (var element in map) {
compressed += element + map[element];
}
if (compressed.length > string.length) {
return string;
} else {
return compressed;
}
}
答案 0 :(得分:1)
对于如您所示的非嵌套循环,时间复杂度保持为O(N)。这是因为循环数是一个常数-例如,如果您对N个元素运行3次,则使用大O表示法可以删除该常数。因此,它仍然是O(N)。
注意:这假设循环数是一个常数。如果循环数以任何方式取决于元素数,那么您将需要考虑这种关系。
答案 1 :(得分:0)
根据定义,当算法需要在大小为O(N)
的输入上执行的基本运算次数f(N)
满足时,算法为N
:
f(N) <= C.N ; N >= N0
对于独立于C
的某个正常数N
,其中N0
是一些初始索引,也独立于N
。
假设您将三个循环组合在一起,每个循环O(N)
。根据定义,您将拥有三对常量(C1, N1)
,(C2, N2)
和(C3, N3)
,这样
loop1(N) <= C1.N ; N >= N1
loop2(N) <= C2.N ; N >= N2
loop3(N) <= C3.N ; N >= N3
然后
loop1(N) + loop2(N) + loop3(N) <= (C1 + C2 + C3)N ; N >= max(N1,N2,N3)
和O(N)
的定义适用于常数C = C1+C2+C3
和初始索引N0 = max(N1,N2,N3)
。因此,由于常数O(N)
和O(N)
并不依赖于C
,因此常数N0
算法的串联还是N
。