【问题标题】:Big O Analysis with Multiple Variables多变量大 O 分析
【发布时间】:2020-01-02 04:28:46
【问题描述】:

我发现了这个大 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)

问题一 看了Big O with 2 variables which multiply together之后,我想知道这样说是否准确:只有多个参数.

我不确定,因为具有多个变量的大 O 似乎并不常见,至少从我能找到的情况来看,大多数答案都解决了通常的单变量大 O 分析。

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

我能找到的最佳答案来自Big O analysis for method with multiple parameters,答案基本上是保留每个变量,除非您可以确定哪个变量增长最快,在这种情况下您删除其他变量。我不知道答案有多准确。

【问题讨论】:

    标签: big-o


    【解决方案1】:

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

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

    • a = n 中以 10 为基数的位数
    • b = n 的 base 2 表示中 1 的位数
    • c = nm 的最大公约数

    或者,如果有字符串参数s

    • d = s 的长度
    • e = s 中的单词数
    • f = s 中的行数
    • g = s 中元音的个数

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

    有时您可以简化多变量公式,但我不会说您应该这样做。不要将多个变量视为需要避免的有害因素。如果多个变量可以更好地描述问题,或者提供更紧密的界限,或者更容易使用,那么使用多个变量。

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

    【讨论】:

    • 一个稍微偏离主题的问题:如果给定来自参数的输入,例如void func(int n),其中n 用于for循环for(int i = 0; i &lt; n; ++i,我们得到O(n),但如果n是一些任意数字,例如void func(),我们没有得到输入和int n = 10for(int i = 0; i &lt; n; ++i 仍然是 O(n) 吗?
    • 这取决于您将 n 视为变量还是常量。无论哪种方式,都是 O(n),是的。如果 n 是一个变量,那么就是这样,它是 O(n)。如果 n 是一个常数,那么 O(n) = O(1)。 这是你的决定。这是参考框架的问题;任何一个都可能是正确的,这取决于您如何看待问题。
    • 我明白你在说什么,非常感谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-29
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-14
    相关资源
    最近更新 更多