O(2M N)和O(kN)的时间复杂性
Time complexity of O(2m+n) and O(kn)
func(){
for(i = 0; i < m; i++){//do something}
for(i = 0; i < n; i++){//do something}
for(i = 0; i < m; i++){//do something}
}
将其时间复杂性写入o(2m n(= o(m n(是正确的,因为o(2m(= o(m(?
以及另一个问题,如果我具有迭代大小为n,k-times的数组,其中k是从输入中计算到函数之前从输入中计算出来的。
func(int k){
for(int i = 0; i < k; i++){
for(int j = 0; j < n; j++){}
}
}
可以说它的时间复杂性是o(k*n(= o(n(的原因与第一个问题相同的原因?
将其时间复杂性写入o(2m n(= o(m n(是正确的,因为o(2m(= o(m(?
是。大oH表达式的术语可以分为单个的大oh表达式,因此O(2m+n) = O(2m) + O(n) = O(m) + O(n) = O(m+n)
可以说它的时间复杂性是o(k*n(= o(n(的原因与第一个问题相同的原因?
否,因为k
不是常数。
第一个是正确的,因为数字 2
是恒定的,因此与时间coplexity没有区别。
但是,第二个可能既是错误又正确。如果将k
视为永远不会改变的常数,则时间复杂性为O(n)
。但是,如果k是可变的,则时间复杂性严格 O(kn)
,因为k可以增加或减少,因此会在渐近时间复杂性上有所不同。
因此,在您的情况下,复杂性是严格的O(kn)
。
让我们从大o的定义中谈论这一点:
我们说f(n(= o(g(n((,如果对于任何正n₀,存在常数的c = c(n₀(,因此对于任何n>n₀,f(n(的确如此≤cg(n(。
因此,在您的第一种情况下,如果我们选择一个常数c,则有O(2m n(≤O(2m 2n(= O(m n(。
但对于第二种情况,对于您选择的任何C,都存在这样的k
以使要求失败,因此第二种情况不能为O(n(。实际上是O(kn(。(您可能会说如果调节可变k,则是o(n(,在这种情况下,您可以选择比k上限大的C(
在具有3个循环的第一个函数中,其中两个从(零(开始到(m(,第三个从(零(开始到(n(,因此时间复杂性此函数的 O(2M N( = o(m n( = o(n(,这种情况称为"线性时间复杂性"这意味着,当(M(或(N(的值增加时,时间复杂性线性增加,因此第一个函数的时间复杂性为true
在具有两个嵌套循环的第二个函数中,内部环从(零(启动到(n(并重复(k(次,例如(k = 3(和(n = 2(,这是指内部循环从(零(开始到(2(,然后重复3次,因此时间复杂度为O(2 2 2(= O(2*3(= O(n k(,,因此,第二个功能的时间复杂性为 o(n k(
- 具有未知值时的时间复杂性
- 使用堆查找第K个最大元素的时间复杂性
- 解决这个问题的时间复杂性是多少
- 如果你有一个固定大小的数组,你需要遍历它!n次,使用二进制搜索如何改变时间复杂性
- 对于像C++这样的现实世界语言,时间复杂性有什么一致的定义吗
- 两个嵌套循环的运行时间复杂性:二次型还是线性
- 是平衡二进制树上预购和DFS的时间复杂性
- 带有多个内部回路的循环的时间复杂性
- 列表STL的时间复杂性在一段时间内进行排序
- O(2M N)和O(kN)的时间复杂性
- 映射向量的时间复杂性是多少
- 时间复杂性差异以及如何
- 递归最糟糕的情况时间复杂性
- 可传递值影响递归算法的渐近时间复杂性
- 程序的时间复杂性确定两个字符串是否彼此排列
- 为什么此代码O(n)的时间复杂性
- next_perMuart的时间复杂性在大o符号中
- C 中使用了哪种类型的堆以及STD :: Pirstity_queue的时间复杂性
- 带有两个递归调用的递归算法的时间复杂性
- 是以下片段O(n^2)的时间复杂性