我有兩個ArrayList<Long>
巨大的大小約5,00,000在每個。我曾嘗試使用for循環使用list.contains(object)
,但它需要太多時間。我試圖通過拆分一個列表和比較多個線程,但沒有找到有效的結果。獲取列表的公共值計數
我需要沒有。兩個列表中相同的元素。
任何優化的方式?
我有兩個ArrayList<Long>
巨大的大小約5,00,000在每個。我曾嘗試使用for循環使用list.contains(object)
,但它需要太多時間。我試圖通過拆分一個列表和比較多個線程,但沒有找到有效的結果。獲取列表的公共值計數
我需要沒有。兩個列表中相同的元素。
任何優化的方式?
讓l1
成爲第一個列表並且l2
第二個列表。在大O表示法中,運行於O(l1*l2)
另一種方法是將一個列表插入到HashSet
中,然後對另一個列表中的所有其他元素測試它是否存在於HashSet中。這將給出大致2*l1+l2 -> O(l1+l2)
一般機制將排序這兩個列表,然後迭代排序列表尋找匹配。
當你有很多元素時,一個列表不是一個有效的數據結構,當你搜索一個元素時,你必須使用一個更有效的數據結構。 例如樹或散列圖!
讓我們假設列表1有m個元素,列表2有n個元素,m> n。如果元素不是數字排序的,似乎它們不是,比較步驟的總數 - 即方法的成本 - 因子mxn - n^2/2。在這種情況下,成本因素約爲50000x49999。
保持這兩個列表的順序將是最佳解決方案。如果列表是有序的,這些比較的成本將是因子m。在這種情況下,大約是50000.當兩個列表都通過兩個遊標迭代時,可以實現最佳結果。此方法可用代碼表示如下:
int i=0,j=0;
int count=0;
while(i<List1.size() && j<List2.size())
{
if(List1[i]==List2[j])
{
count++;
i++;
}
else if(List1[i]<List2[j])
i++;
else
j++;
}
如果您有可能一直保留列表,則此方法會有所不同。除此之外,我還認爲這是不可能的拆分和比較。
一個`HashSet`只包含**一個**值,在你的情況下是你正在存儲的`Long`。 – 2011-12-14 11:36:19