代码段
以下是delete
函数定义,用于删除C语言中名为int
的{{1}}类型数组中元素x的所有出现次数!
a
上述代码的时间复杂度为 O(n2),二次复杂度。
我的问题:外部for循环将运行n次,内部for循环运行的次数将取决于x的出现次数,那么复杂性如何变为O (n2)?
答案 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)。