java - 从数字列表中生成所有唯一对,n 选择 2

标签 java algorithm math combinations combinatorics

我有一个元素列表(比方说整数),我需要进行所有可能的 2 对比较。我的方法是 O(n^2),我想知道是否有更快的方法。这是我在 Java 中的实现。

public class Pair {
 public int x, y;
 public Pair(int x, int y) {
  this.x = x;
  this.y = y;
 }
}

public List<Pair> getAllPairs(List<Integer> numbers) {
 List<Pair> pairs = new ArrayList<Pair>();
 int total = numbers.size();
 for(int i=0; i < total; i++) {
  int num1 = numbers.get(i).intValue();
  for(int j=i+1; j < total; j++) {
   int num2 = numbers.get(j).intValue();
   pairs.add(new Pair(num1,num2));
  }
 }
 return pairs;
}

请注意我不允许自配对,所以应该有 ((n(n+1))/2) - n 可能的配对。我目前的工作,但随着 n 的增加,我花了很长时间才能得到这对。有什么办法可以将上面的 O(n^2) 算法变成次二次的吗?任何帮助表示赞赏。

顺便说一句,我也尝试了下面的算法,但是当我进行基准测试时,根据经验,它的性能比上面的算法差。我原以为通过避免内部循环可以加快速度。下面这个算法不应该更快吗?我会认为它是 O(n)?如果没有,请解释并告诉我。谢谢。

public List<Pair> getAllPairs(List<Integer> numbers) {
 int n = list.size();
 int i = 0;
 int j = i + 1;
 while(true) {
  int num1 = list.get(i);
  int num2 = list.get(j);
  pairs.add(new Pair(num1,num2));

  j++;

  if(j >= n) {
   i++;
   j = i + 1;
  }

  if(i >= n - 1) {
   break;
  }
 }
}

最佳答案

嗯,你不能,对吧?

结果是一个包含 n*(n-1)/2 元素的列表,无论这些元素是什么,只是填充这个列表(比如用零)需要 O( n^2) 次,因为 n*(n-1)/2 = O(n^2)...

关于java - 从数字列表中生成所有唯一对,n 选择 2,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9453074/

相关文章:

database - 找到合适的数据结构以从两个列表中删除

python - 如何找到列表中不一定相邻的最大连续数字集?

android - 色差atan和atan2结果差异

math - Swift 枚举递归关联值

php - 如何在 PHP 中将 3 个或更多 ID 合并为 1 个 64 位 ID

C/C++整数运算

java - 优先禁用声音无法正常工作

java - 如何找到最大值的数组索引?

java - iText pdf 在使用 NOTO 字体或 Source Hans 时不显示汉字

java - 如何在 Android Studio 中使用像 AChartEngine 这样的 Java 库?