Big o 多变量大O分析

Big o 多变量大O分析,big-o,Big O,我发现了这个大O分析问题,并了解到可以有一个大O和多个变量 void f3(int n, int m, int r) { for (int i = 0; i < n; ++i) { O(N) for (int j = m; m > 0; m /= 2) { O(log(M)) } } } Answer: O(N log M) vo

我发现了这个大O分析问题,并了解到可以有一个大O和多个变量

void f3(int n, int m, int r) {
        for (int i = 0; i < n; ++i) {                   O(N)
            for (int j = m; m > 0; m /= 2) {            O(log(M))   

            }
        }
    }
Answer: O(N log M)
void f3(整数n、整数m、整数r){
对于(int i=0;i0;m/=2){O(log(m))
}
}
}
回答:O(N logm)
问题1阅读后,我想知道这样说是否准确:只有在有多个参数的情况下,大O中才可能有多个变量

我不确定,因为有多个变量的大O似乎不是很常见,至少从我能找到的情况来看,大多数答案都是针对通常的单变量大O分析

问题2 多变量的大O应该保持原样还是根据哪个变量增长得更快而简化

我能找到的最好的答案是,答案基本上是保留每个变量,除非你能确定哪个变量增长最快,在这种情况下你去掉了其他变量。不过我不知道答案有多准确

我想知道这样说是否准确:只有在有多个参数的情况下,大O中才可能有多个变量

不,那不准确。可以从单个参数派生多个变量。例如:

  • a=以n为基数的10位数
  • b=n的基2表示中的1位数
  • c=n和m的最大公约数
或者,如果存在字符串参数s:

  • d=s的长度
  • e=s中的字数
  • f=s中的行数
  • g=s中元音的数量
多变量的大O应该保持原样还是根据哪个变量增长得更快而简化

有时候你可以简化一个多变量公式,但我不会说你应该这么做。不要认为多个变量是有害的,应该避免。如果多个变量可以更好地描述问题,或者提供更严格的界限,或者更容易处理,那么就使用多个变量


例如,两个矩阵相乘的成本取决于两个矩阵的大小。自然有多个变量在起作用,试图减少它们的数量是毫无意义的。如果我想知道计算两个集合的交集需要多长时间,我需要知道每个集合中有多少项。一个有用的Big-O公式将有两个变量,这是自然的,也是不可避免的。

一个稍微离题的问题:如果给定一个参数的输入,例如
void func(int n)
,其中
n
用于for循环
for(int i=0;i
我们得到
O(n)<代码> >代码> >但是,如果<代码> n>代码>是任意数,例如“代码>空函数”(/CODE),在这里我们没有给出输入和<代码> int n=10 < /代码>。将<代码>为(int i=0;i<n;++i i/CODE)仍然是O(n)。这取决于如果考虑n个变量或常量。如果n是一个常数,那么O(n)=O(1)。这是你的决定。这是一个参考系的问题;任何一个都可能是正确的,这取决于你如何看待这个问题。我明白你的意思,非常感谢