Java 一个for循环中两个for循环的运行时复杂性
我正在编写一个java方法,用于查找数组的稳定性索引。我的算法运行良好,但我不确定它的运行时复杂性。我相信它是O(n),因为第一个循环是O(n),两个内环是O(2n),但我还是不确定Java 一个for循环中两个for循环的运行时复杂性,java,data-structures,runtime,big-o,Java,Data Structures,Runtime,Big O,我正在编写一个java方法,用于查找数组的稳定性索引。我的算法运行良好,但我不确定它的运行时复杂性。我相信它是O(n),因为第一个循环是O(n),两个内环是O(2n),但我还是不确定 int[] arr = {0, -3, 5, -4, -2, 3, 1, 0}; for(int num = 0; num < arr.length; num++){ int sumLeft= 0; int sumRight = 0; for(int i = 0; i<num;
int[] arr = {0, -3, 5, -4, -2, 3, 1, 0};
for(int num = 0; num < arr.length; num++){
int sumLeft= 0;
int sumRight = 0;
for(int i = 0; i<num; i++){
sumLeft= sumLeft + arr[i];
}
for(int i = num + 1; i < arr.length;i++){
sumRight= sumRight + arr[i];
}
if(sumLeft==sumRight){
System.out.println(num);
}
}
它是O(n^2)
for(int num=0;num
- 我们可以给你一个答案,答案是
O(N^2)
- 我们可以为你自己解释如何解决这个问题
计算的方法是计算操作数
当我说“计数”时,我并不是字面上的意思。我真正的意思是,你需要计算出一个代数公式,计算一些指示性操作被执行的次数
因此,在你的例子中,我认为这两种说法是最重要的:
sumLeft= sumLeft + arr[i];
sumRight= sumRight + arr[i];
(我为什么选择这些陈述?直觉/经验!学究式的方法是计算所有操作。但是有了经验,你可以选择重要的操作…其余的都不重要。)
现在,对于公式:
在外循环的一次迭代中,第一条语句从0执行到num-1
;即num
次
在外循环的一次迭代中,第二条语句从num+1执行到array.length-1
;即array.length-num-1
次
因此,在外循环的一次迭代中,这两条语句被执行num+array.length-num-1
次,这将减少到array.length-1
次
但是外部循环运行array.length
次,因此这两条语句执行array.length x(array.length-1)
次
最后,根据大Oh的定义,array.length x(array.length-1)
属于复杂性类O(N^2)
,其中N
是数组大小。是O(N^2)-N个元素被检查N次。
for(int num = 0; num < arr.length; num++){
int sumLeft= 0;
int sumRight = 0;
for(int i = 0; i<num; i++){// <------------- 1 ~ n
//https://en.wikipedia.org/wiki/1_%2B_2_%2B_3_%2B_4_%2B_%E2%8B%AF
sumLeft= sumLeft + arr[i];
}
for(int i = num + 1; i < arr.length;i++){
sumRight= sumRight + arr[i];
}
if(sumLeft==sumRight){
System.out.println(num);
}
}
sumLeft= sumLeft + arr[i];
sumRight= sumRight + arr[i];