2010-11-01 50 views
2

我有兩個列表,一個列表L1包含N1元素和另一個列表L2包含N2 elements.Both列表是不一樣的長度,幷包含重複elements.I要創造出具有獨特的元素另一個列表來自l1和l2。我可以如何有效地做到這一點,該解決方案的性能如何?數據結構:唯一在名單

P.S:我想要一個不使用任何其他數據結構的解決方案。

+0

這功課嗎?聽起來像是這樣。 – 2010-11-01 17:17:31

+0

每個列表是否包含可能重複的元素,或者您是否意味着列表之間可能存在重複? – Jeff 2010-11-01 17:18:14

+0

@Cameron:這是一個面試問題。 – Jony 2010-11-01 17:19:47

回答

0

創建一個新的Set並從列表l1和l2中添加元素。最終集合將是不包含重複的集合。但要確保你已經正確實現了equals()和hashCode()。

下面是我的樣品(不完美)做同樣的。在這裏張貼它來驗證我的邏輯;-)或者看看是否有優化這個

Lit unique=... 


if(l1.size==l2.size()) 
{ 
    //o(n) 
    copyToUnique(l1, l2, unique) 
} 
else if(l1.size>l2.size()) 
{ 
    //o(n) + num of extra elements 
    copyToUnique(l1, l2, unique) 
    unique.addAll(l1.subList(l2.size(),l1.size()); 
} 
else if(l1.size<l2.size()) 
{ 
    //o(n) + num of extra elements 
    copyToUnique(l2, l1, unique) 
    unique.addAll(l2.subList(l1.size(),l2.size()); 
} 

public void copyToUnique(List l1, List l2, List unique) 
{ 
    for(Object element:l1) 
    { 
     if(!l2.contains(element)) 
     { 
      unique.add(element); 
     } 
    } 
unique.addAll(l2); 
} 
+0

+1擊敗了我。 – casablanca 2010-11-01 17:17:31

+0

如果我不允許使用任何其他數據結構,該怎麼辦? – Jony 2010-11-01 17:18:21

+0

OP想要一個列表,而不是一個Set。 – dogbane 2010-11-01 17:18:29

0

如果您只需要使用列表,並且您有可能在每個列表和列表中重複列表,則需要創建一個新列表l3(用於保存l1和l2元素)並遍歷每個列表,如果對l3.contains(e)的調用返回false,則插入每個元素的e項。

正如其他人所說,使用一組絕對是刪除列表中的重複的項目最簡單的方法,並且列表可以從集創建返回給調用者。

性能是線性的,並基於l1 + l2中的元素數量。

+2

這個性能不是線性的,它是O(n^2),或類似的東西。你必須考慮檢查第三個列表是否包含元素。 – nojo 2010-11-01 17:33:12

+0

這不會使它O(n^2)。它實際上取決於所使用的List實現,但包含來自SDK的實現的最壞情況將是線性的,我相信(ArrayList),並且插入將是最差情況的線性。所以,即使它不是一個直的O(n),那裏也有一個乘數和線性增長,而不是一個指數和二次增長。 – Jeff 2010-11-01 17:40:32

+0

取決於l3是否排序。如果沒有排序,並假設沒有重複的最壞情況,則l3.contains()將在一個遞增大小的列表上執行,從開始處的0比較開始執行到最後的N =(l1 + l2-1)比較: sum(0..N)= N *(N-1)/ 2。 – Lars 2010-11-01 17:57:16

0

的解決方案是O(nlogn)。將各排序列表,然後通過兩個列表一起走,找到重複。您可以根據哪個列表具有當前元素的「最小」值(或者它們是否相同)來增加一個列表或另一個列表(或兩者)的位置。這有一個合理的開銷,所以一些O(n^2)算法實際上可能會更快,這取決於數據的大小/分佈。