我想找到下面代码的复杂性。 我使用此代码使用排序查找数组中第二高的元素。
for(i=0;i<2;i++)
{
for(j=0;j<n;j++)
{
//some code
}
}
复杂度是O(2n)还是O(n 2 )?
答案 0 :(得分:2)
这是一个非常广泛的话题。我只是努力把它带给你。你可以参考一些好书。我在Coreman
中的建议。
复杂性:
for循环的基本结构是
for(initialization;condition;updation)
在更新中我们正在更新值,所以基本上我们将循环迭代到条件。
所以它就像
n*(n+1)/2
在你的两个for循环案例中基本上是O(n ^ 2)。
复杂性的估计:
有时,获得算法复杂性的公式并不容易。在这种情况下,可以通过实验来估计它。计数变量可以添加到程序中,在执行某些关键操作并打印最终总计时递增。也可以通过调用例程来打印计算机系统的时钟,通过秒表或更好的方式测量运行时间。可以通过检查这些措施如何随问题规模而变化来推断复杂性。
程序或操作的计时准确度可以通过计算多次执行(可能是循环)并将该数字所用的总时间除以来得到改善。许多人同时使用分时计算机。程序所用的时间取决于系统负载。因此,在共享机器上完成的任何计时必须基于专用于所研究的特定程序的中央处理器时间,而不是基于经过的时间。
检查系列中相邻术语之间的差异可以指示定义系列的基础函数的形式。线性函数T(n)=a*n+b
在T(n)
和T(n-1)
之间产生恒定的差异:
D1(n) = T(n)-T(n-1) = a*n+b-a*(n-1)-b = a
二次函数T(n)=a*n2+b*n+c
产生线性一阶差分:
D1(n) = T(n)-T(n-1) = a*n2+b*n+c-a*(n-1)2-b*(n-1)-c = 2a*n-a+b
产生恒定的二阶差异D2(n) = D1(n)-D1(n-1)
。通常,d次多项式由常数dth-order
差异揭示。
答案 1 :(得分:1)
了解解决方案的最佳方法是绘制表格:
Iteration | i | j
----------+--------+-------
0 | 0 | 0
0 | 0 | 1
0 | 0 | 2
0 | ... | ...
0 | ... | ...
0 | ... | n - 1
1 | 1 | 0
1 | 1 | 1
1 | ... | ...
1 | ... | ...
1 | ... | n - 1
执行了多少次?这就是答案..
如果你想有一个直觉,你应该选择一些n
,运行一个例子。然后选择另一个n
,看看你得到了什么,最后你会得出答案的结论。
答案 2 :(得分:0)
如果“某些代码”执行o(1)则该代码的复杂性为O(2n)
那是因为内部代码的复杂性为o(n),我们循环执行2次。然后它是O(2n)
答案 3 :(得分:0)
Big Oh表示法给出了数量级的估计,常数的差异确实不会影响算法的大小,所以O(2n)= 2O(n)=(n)。
类似于1000&gt;&gt; 10 = 5.也就是说,1000比10大得多,它和10一样大于10,即使10是5的两倍。