for(i=0;i< m; i++)
{
for(j=i+1; j < m; j++)
{
for(k=0; k < n;k++)
{
for(l=0;l< n;l++)
{if(condition) do something}
}
}
}
答案 0 :(得分:3)
详情:
两个第一个循环将导致(m-1)+(m-2)+(m-3)+ ... + 1次重复,这等于m *(m-1)/ 2。至于后两个循环,它们基本上从0运行到n-1,因此它们需要n ^ 2次迭代。
由于你不知道条件是否会得到满足,那么你会采取最坏的情况,即它总是得到满足。
然后迭代次数为:
M *(M + 1)/ 2 * N ^ 2个* NumberOfIterations(东西)
在O表示法中,常数和较低的度数不是必需的,因此复杂性为:
O(平方公尺* N ^ 2)* O(东西)
答案 1 :(得分:2)
for(i=0;i< m; i++)
{
for(j=i+1; j < m; j++)
{
内部循环将运行((m-1) + (m-2) + ... 1)
次
= 1 + 2 + 3 + ...m-1
= m * (m - 1) / 2
for(k=0; k < n;k++)
{
for(l=0;l< n;l++)
{
在这种情况下,内环显然运行n * n times
很明显,迭代次数正是
(m * (m - 1) / 2) * (n * n)
= O(m^2 * n^2)
显然,这是假设的
if(condition) do something
经常运行。
答案 2 :(得分:1)
对我来说看起来像O(m ^ 2 n ^ 2),假设“某事”是恒定时间。
尽管j
循环从每个步骤的不同点开始,但i
和j
循环的组合效果仍然是m ^ 2因子。
评估未说明的条件本身通常是(至少)一个恒定的时间操作,所以当然循环不能比O(m ^ 2 n ^ 2)更快 - 当然,除非“某事”包括休息,goto,异常抛出或早期从一个或多个循环中退出的任何东西。
如果由于任何原因,n或m在整个过程中都不是一直的,那么所有的赌注都会被取消。
答案 3 :(得分:1)
我认为“做某事”的时间复杂性是O(S)。
让我们从最内循环开始:它的时间复杂度是O(n * S),因为它做了n次。包裹最内部循环的循环具有O(n) O(n S)= O(n ^ 2 * S)的时间复杂度,因为它执行内循环n次。
包含第二个最内循环的循环具有O(m-i)* O(n ^ 2 * S)的时间复杂度,因为它执行O(n ^ 2 * S)操作m-i次。
现在对于更难的部分:对于0 ... m-1范围内的每个i,我们进行(m-i)* O(n ^ 2 * S)操作。多久时间? (1 + 2 + 3 + ... + m)* O(n ^ 2 * S)。 但是(1 + 2 + ... + m)是arithmetic sequence的总和。因此,总和等于m *(m-1)/ 2 = O(m ^ 2)。
结论:我们做了大约m ^ 2次的O(n ^ 2 * S)操作。整个事物的时间复杂度是O(m ^ 2 * n ^ 2 * S)
答案 4 :(得分:0)
O(m ^ 2 * n ^ 2 *(某事的复杂性))。如果条件和某些东西在恒定时间内执行,那么O(m ^ 2 * n ^ 2)。
答案 5 :(得分:0)
O(m²*n²)*“某事”的复杂性