什么是大O符号下面的函数的时间复杂度?

时间:2019-02-01 23:24:33

标签: algorithm big-o

我正在努力理解大O,但遇到了一个棘手的问题。

当我看看这段代码,我马上想到O(N)只要看一眼 for循环但线

Table* createTable(){

    Table* table = (Table*)malloc(sizeof(struct Table*));

    Object **array = (Object**)malloc(3*sizeof(struct Object*));

    for(int j = 0; j < size; j++){
        array[j] = malloc(sizeof(struct Object));
    }
table->arr = array;
return table;

}

让我觉得这是不同的。

result = result * k

只是寻找一些明确的解释为什么我可能会或可能不会有错

2 个答案:

答案 0 :(得分:2)

这不是一个棘手的问题,除非您使用的是允许操作符重载的C ++之类的语言,并且kresult类型的operator *()方法已重载,否则存在一个独立的(自由)重载操作与这些类型作为参数定义的方法。我假设情况并非如此,

您的循环的阶为O(n)。在该循环中,您要做什么?您是否还要进行其他循环?或调用这样做的方法?号根据其操作数的大小是您系统的乘法操作符的复杂性?从技术上讲也许是肯定的,因为32位乘法在32位内核上要比64位乘法快,但这是基于操作数的 types ,而不是基于操作数的值。乘法操作是顺序O(1)的正常进行。

因此,总体复杂度为O(n * 1)或仅为O(n)。

除O(n)之外,这是唯一的方法是乘法运算符被重载,并且以幼稚的方式实现。例如是否通过迭代k次并将result加到自身k次来进行整数乘法。 在这种情况下 ,总体复杂度为O(n 2 )。

但是在任何正常情况下,复杂度仅为O(n)。

答案 1 :(得分:0)

这只是一条语句,与迭代不依赖n的一组语句无关。所以我们知道这  结果=结果* k 在O(1)中无论如何它的时间复杂度都不会改变。代码的时间复杂度为O(n)不大于O(n)