时间复杂度:While循环与嵌套for循环[java]
所以我刚开始学习时间复杂性,我对它有点“okayish”的理解,但是我对如何处理这个代码段有点困惑。 我读过其他的帖子,但我只是很难理解一些东西,除非有人把我要说的话给毁了。有点像一记耳光时间复杂度:While循环与嵌套for循环[java],java,time-complexity,Java,Time Complexity,所以我刚开始学习时间复杂性,我对它有点“okayish”的理解,但是我对如何处理这个代码段有点困惑。 我读过其他的帖子,但我只是很难理解一些东西,除非有人把我要说的话给毁了。有点像一记耳光 public int example(int[] array) { int result = 15; int i = array.length; while(i > 1) { for(int x = 0; x < array.length;x++)
public int example(int[] array) {
int result = 15;
int i = array.length;
while(i > 1)
{
for(int x = 0; x < array.length;x++)
{
result+= 1;
result+=2*array[x];
}
i = i/2;
}
return result;
}
public int示例(int[]数组){
int结果=15;
int i=数组长度;
同时(i>1)
{
for(int x=0;x
好的,我只计算算术运算。
从我的信仰来看,如果我错了,请纠正我(可能是错的)
x++发生n次
结果+=1发生n次
结果+=3*数组[x]发生2n次
总共4n次
和i=i/2发生logn次
那么正确的等式是4nlogn?您使用
4n*log(n)
的方法是正确的。但是,请注意,对于较大的O时间复杂性,常量被删除,因此这将是O(n*log(n))
由于大O定义,常数被删除:f(x)
isO(g(x))
iff(z)一些数字。这里的关键是c
,它可以是任何常数。即使你的f(x)
是100x
,你仍然可以拥有c=200
,g(x)
作为旁注,因为我们可以计算出常数,所以在计算大O时间复杂度时,您不必计算每个操作。您只需查看循环即可。一个发生次数n
次,另一个log(n)
次。所以它是O(n*log(n))
。代码可以在每个循环中执行1000个操作,也可以执行2个。因为常数是从大O方程中计算出来的,所以这个数字并不重要。只有循环的数量和性质才是正确的。使用4n*log(n)
您就在正确的轨道上了。但是,请注意,对于较大的O时间复杂性,常量被删除,因此这将是O(n*log(n))
由于大O定义,常数被删除:f(x)
isO(g(x))
iff(z)一些数字。这里的关键是c
,它可以是任何常数。即使你的f(x)
是100x
,你仍然可以拥有c=200
,g(x)
作为旁注,因为我们可以计算出常数,所以在计算大O时间复杂度时,您不必计算每个操作。您只需查看循环即可。一个发生次数n
次,另一个log(n)
次。所以它是O(n*log(n))
。代码可以在每个循环中执行1000个操作,也可以执行2个。因为常数是从大O方程中计算出来的,所以这个数字并不重要。只有循环的数量和性质才是如此。为什么你认为循环中的第二条语句执行的次数是前一条语句的两倍?我假设是因为发生了两次算术运算,但我猜它也发生了n次?我现在明白你的逻辑了。为什么你认为循环中的第二条语句执行的次数是前一条语句的两倍很多次是之前的吗?我假设是因为2个算术运算正在发生,但我猜它也只发生了n次?我现在明白你的逻辑了。结果+=2*数组[x]是2n次而不是n次吗?结果+=2*数组[x]是2n次而不是n次吗?