我正在努力理解大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
只是寻找一些明确的解释为什么我可能会或可能不会有错
答案 0 :(得分:2)
这不是一个棘手的问题,除非您使用的是允许操作符重载的C ++之类的语言,并且k
或result
类型的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)