大哦符号计算恒定步长

时间:2018-06-28 02:01:04

标签: java big-o

我搜索Big O表示法已有一段时间了,我了解到,在计算时,我们必须假设不依赖于输入数据大小的每个句子都采用恒定的C数计算步骤。

我的程序是这样的。 它“总是”获取一个“ 48位”随机种子并产生输出,并且在产生输出的过程中发生的实际移动根据种子值本身而不是大小而变化,因为它是固定的。 我为这个过程循环了n次,以获得n个输出。

这是否意味着我的程序的Big O标记为O(n)?还是我完全误会了什么?

因此,我刚在代码中编写的循环数。例如,如果我将其设置为1000,则它将接收1000个输入种子并产生1000个输出。循环内的进程,因此较大循环内的for循环数或if-else或switch语句数是固定的。在更大的循环中唯一改变的是根据种子的值选择哪个“ if语句”。

3 个答案:

答案 0 :(得分:0)

int f(int[] a, int[] b, int c) {
    int n = a.length;
    int m = b.length;
    int y = 0;
    for (int i = 0; i < n; ++i) {
        y += a[i];
        for (int j = 0; j < m; ++j) {
            y -= b[j];
        }
    }
    for (int k = 0; k < c; ++k) {
        y += 13;
    }
    return y;
}

因此,复杂度是O(n.m)+O(c)计步(循环,递归调用)。

    for (long k = seed; k > 1; k /= 2) {
        ...;
    }

最多可以给O(²log seed) 48。

答案 1 :(得分:0)

严格地说,O(n)表示该n是某种算法参数/某种输入或从中得出。它可以是输入的长度,甚至可以是输出的长度,但是它是从算法参数派生的。

因此,如果您使用某些脚本自动执行此过程,则当我们谈论您的过程“将该过程循环n次”时,该O(n)就具有含义。算法本身仍然可以在O(1)时间内工作。如果您不使过程自动化,则只需忘掉Big O即可-手动操作使其无关紧要。

答案 2 :(得分:0)

复杂度总是表示为相对于某物

由于您的输入长度是恒定的,所以表达相对于此的复杂性没有多大意义。相对于循环数,它可能具有 O(n)复杂性,但是同样,由于该值是硬编码的,因此该信息对用户几乎没有价值。

在您的情况下,最有用的可能是有关与输入相关的复杂度的信息。如果这是恒定的,则可以说您的程序在恒定时间内执行,因为无论(有效)用户输入是什么,程序产生输出所花费的时间大约为一样。