У меня есть список элементов (скажем, целые числа), и мне нужно сделать все возможные 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;
}
}
}