我有一個元素列表(我們說整數),我需要做所有可能的2對比較。我的方法是O(n^2),我想知道是否有更快的方法。這裏是我在java中的實現。從數字列表生成所有唯一對,n選擇2
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;
}
}
}
我發佈了一個不同的版本來獲得配對。它只有1個循環。你能幫我回答我的問題嗎?這是第二個算法O(n)?我同意你的建議(即時創建和多線程)。動態創建不會太難實現,但多線程可能會以較不優雅的代碼/編碼爲代價而更快。它可能會更慢,如果我開始傳遞巨大的名單>(我想這樣做)。 – 2012-02-26 15:39:25
@JaneWayne:你不能創建所有需要的對,然後'O(n^2)'。我編輯了答案,對你的第二個實現進行了具體分析,但無論你做什麼 - 創建'O(n^2)'Pair'對象,都需要'O(n^2)'ops。 – amit 2012-02-26 16:12:25
謝謝。我一直在努力找到一本關於算法分析的不流淚的書(不是大多數大學使用的大型精裝書)。如果您有任何建議,請讓我知道。 – 2012-02-26 16:38:59