我被要求编写此方法,然后根据数组的大小给出渐近运行时间。有人可以向我解释这是怎么做到的吗?
public int doSomething(int[] nums) {
int count = 0;
for (int i = 0; i < nums.length; i++)
for (int j = 0; j < i; j++)
if (nums[i] > nums[j])
count++;
return count;
}
答案 0 :(得分:2)
问题大小N是nums的长度。
从只有for语句的代码中确定渐近运行时的方法非常简单。
渐近运行时由传统表示法描述,如
O(N)
这是一个简单的声明。我们只需要处理输入元素一次。
像你这样的嵌套for语句意味着我们需要多次检查每个nums的值。
你在外循环中重复N次。您在内循环中重复多次依赖于N.
另外如何打印像
这样的三角形*
**
***
****
*****
******
三角形中的元素数量与N²
成比例答案 1 :(得分:1)
运行时间通常需要执行多少步骤。
渐近运行时间几乎相同,但你可以做一些“魔术”来简化你的结果。
在您的情况下,您有for (int i = 0; i < nums.length; i++)
个周期nums.length
个步骤。在每一步中,您都会for (int j = 0; j < i; j++)
。
首先,你只做1,然后做2步,而不是3步等。
运行时间为1 + 2 + 3 + 4 + 5 + 6 + .... + n
,使用您获得的系列总和:n*(n+1)/2
渐近运行时间基于一些规则。在我们的例子中,你可以摆脱常数,只有n
很重要,因此n*(n+1)/2 = Theta(n*(n)) = Theta(n^2)
结果:n^2