无法正确计算数组中删除操作的时间复杂度?

时间:2014-12-19 08:21:08

标签: c arrays big-o time-complexity asymptotic-complexity

代码段

以下是delete函数定义,用于删除C语言中名为int的{​​{1}}类型数组中元素x的所有出现次数!

a

上述代码的时间复杂度为 O(n2),二次复杂度

我的问题:外部for循环将运行n次,内部for循环运行的次数将取决于x的出现次数,那么复杂性如何变为O (n2)?

1 个答案:

答案 0 :(得分:1)

在最坏的情况分析中,我们计算算法运行时间的上限。我们必须知道导致执行最大操作数的情况。

我们评估if-else条件中的值导致执行最大语句数时的情况。

因此,当数组包含所有相似元素并且要删除的元素相同时,最坏的情况可能发生。

在这种情况下,'if'执行外部for循环的所有值。因此在O(N)时间运行。

考虑内部for循环:

对于最坏情况下SIZE = size的数组,

第一次传递内循环执行n-1次

第二次循环执行n-2次等等....

c *((n-1)+(n-2)+ ..... + 1))其中c是内部for循环中assign语句所需的时间。为什么会这样?因为每次迭代后都会删除一个元素。

考虑K是分配i,j的恒定时间。

c1是检查循环条件以及递增和递减操作的开销。

然后,

c *((n-1)+(n-2)+ .... + 1)+ K + c1 *(size-1)

(n-1)+(n-2)+ ..... + 1 = n *(n-1)/ 2。

c n (n-1)/ 2 + k + c1 *(size-1)= 1/2 * c(n ^ 2-n)+ c(n -1)+ k =上限O(n ^ 2)。

因此时间复杂度结果为 O(n ^ 2)