java break语句是否使我的代码更快?
我本来应该写一段代码来说明数组是否有重复项。运行时间并不重要。我认为我下面的代码将有O(n²)
,因为我使用了嵌套的for循环。我知道有比我写的代码更好更快的代码,但是我的问题是,我在if语句中做的break
语句是否会使我的代码(稍微)更快它应该会让它更快,因为程序知道“嘿,我们找到了一个副本,我们可以停止搜索更多”。我曾经听一位同学说,如果我避免使用像return
或break
这样的语句,代码会更好/更稳定。可惜那时我没有足够的关心去问为什么。也许你能告诉我这是不是真的
如果他是对的,并且这些语句“伤害”了我的代码,那么还有更好的解决方法吗
public class FindDuplicate{
public static void main(String[] args){
int[] A={1,2,3,4,5,6,7,8,4};
boolean bool=false;
for(int i=0; i<A.length; i++){
for(int j=0; j<A.length; j++){
if(A[i]==A[j] && i!=j){
bool=true;
break;
}
}
}
if(bool==true){
System.out.print("Duplicate found");
}else{
System.out.print("No duplicate found");
}
}
}
# 1 楼答案
然而,并不是在所有情况下,在大多数情况下,考虑到你不必在找到你想要的东西后不断迭代,它确实会让你的代码更快
下面的算法包含两个嵌套循环。外部循环遍历数组的所有
N
项,因此需要O(N)
个步骤。 对于通过外循环的每次行程,内循环也会迭代数组中的N
项,因此它也会执行takes O(N)
步。 因为一个循环嵌套在另一个循环中,所以组合的性能是O(N × N) = O(N2)
通过在外循环的每次迭代中不返回
j = 0
,我们可以使算法更快一些注意,在这种情况下,我们不需要检查^{,因为它们永远不会相等
当使用
break
时,JVM
规范没有说明是否存在性能损失。简单地说,没有任何证据表明使用break
或return
会使代码不稳定(据我所知并非如此)。我唯一会说“哦,这不是一个好的做法”的情况是当你过度使用break
这个词时。然而,在许多情况下break
是更快完成任务的唯一可能,例如您当前的解决方案。基本上,当你找到你想要的东西时,为什么还要继续迭代呢?。我认为^ {CD11}}也不是“坏的实践”,因为类似于{{CD9}},为什么在不需要的时候继续执行代码,这肯定会使代码更快。p>我们能让查找重复算法更快吗
当然,我们可以考虑java中的不允许重复的^{O(n)
时间内找到重复项。由于^{false
解决方案:
# 2 楼答案
实际上,您不需要
bool
标志变量,也不需要使用break
return
将停止迭代,如果未找到重复项,则返回false:只需要指出,性能不应该是编码时的唯一目标。您应该像担心性能一样担心可维护性或编写更少/干净的代码。 它取决于上下文(调用该函数的频率、应该进行多少次迭代、是否使用并行流运行?…)你的应用程序运行是为了选择一种或另一种做事方式
很多帖子都在讨论循环性能与流性能,以及支持和反对的观点:
我只是想让你看看有多干净(1行!)正在为相同的purpouse使用Java8语法:
输出: