[英]How to make java nested loops efficient
我目前需要编写一个程序来进行成对比较以在 int 列表中找到匹配对,但我能想到的唯一方法是通过嵌套的 for 循环。 有没有办法使嵌套 for 循环的时间复杂度为 O(n) 而不是 O(n^2)?
int[] arr = new int[n];
int total = 0;
for (int i=0; i<n; i++){
for (int j=i+1; j<n; j++){
if (arr[i] == arr[j]){
total++;
}
}
}
看起来你只担心计数。 因此,如果修改数组不是问题,则在 O(nlog(n)) 中应用快速排序,然后在 O(n) 中计算邻居。
您可以使用具有O(1)
复杂度的HashSet
contains
方法 - 因为 Java 中Integer
值的hashCode
分布良好(它只是Integer
的值)您应该始终具有恒定的复杂性
HashSet<Integer> set = new HashSet();
for (int i=0; i<n; i++) {
if(set.contains(arr[i])) {
total++;
} else {
set.add(arr[i]);
}
}
在这里阅读更多:
还有一种可以在此处实现的附加算法,但它需要一些数据限制(由于您机器上数组的最大长度)。
您可以只创建一个 int 数组yourarray
并用0
初始化,长度为max(arr) + 1
。 然后你在每次执行yourarray[arr[i]]++
时迭代arr
然后你在迭代yourarray
检查值大于1
的位置 - 如果是这样那么它意味着这个值必须重复
O(n) 解决方案。 尝试这个。
public static void main(String[] args) {
int[] arr = {0, 1, 2, 3, 4, 3, 2, 3};
int total = arr.length - (int)IntStream.of(arr).distinct().count();
System.out.println(total);
}
output:
3
我认为您可以使用 HashSet 来解决此问题。 JAVA 中的 HashSet 不允许插入重复元素。 所以你可以用它来使时间复杂度变成 O(n)。
int[] arr = new int[n];
Set<Integer> set = new HashSet<Integer>();
Integer total = 0;
for (int x: arr)
{
if (!set.add(x))
{
total++;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.