我知道有項「不」上的IEnumerable由於LINQ,這需要收集到不反對,但我很擔心大哦性能什麼是最快的算法做這個?如何找到一個超集,它不是一個子集
1
A
回答
2
從IEnumerable<T>
中刪除項目子集的唯一方法是循環遍歷超集,並通過子集遍歷超集循環中的每個項目,如果在子集中找到該項目,則從超集中刪除該項目。
這會給你O(N²)平均。
現在是否有關於這些藏品(也許一個或兩個是一個列表或者可能一個或兩個序列進行排序),可以幫助您創建一個更高性能的解決方案的更多信息。
如果你有興趣,這裏是一個擴展方法,會做什麼,我只是描述:
public static IEnumerable<T> Exclude<T>
(this IEnumerable<T> source, IEnumerable<T> items)
{
foreach (T t in source)
if (!items.Contains(t))
yield return t;
}
沒關係,使用Enumerable.Except
擴展方法:
產生兩個序列的設置差異。
0
通過將超集轉換爲散列表(通常爲O(n),但隨後允許您在常量時間執行查找),可以獲得更好的性能。然後,您可以枚舉子集並檢查每個項目是否存在於超集中。整個操作需要O(n)額外的內存和O(n)時間。
1
如果你能以遍歷集合,可以保證O(n)的行爲(而不是「通常爲O(n),但有可能在最壞情況下O(N²)」是一個HashSet有)由迭代通過他們兩個在鎖步。
例如:
//loop boilerplate
if(itemA < itemB) {
itemA = a.next();
continue;
}
if(itemA > itemB) {
itemB = b.next();
continue;
}
a.remove(itemA);
你需要添加邊界檢查和其他樣板自己。
相關問題
- 1. 找到一個序集的子集
- 2. 創建一個數據集,它是SSRS中另一個數據集的子集
- 3. 當它不是一個時,Option如何作爲一個集合?
- 4. 如何驗證一個xml是否是C#中另一個子集的子集
- 5. 查找子集是一個數字
- 6. 找到一個範圍內的子集
- 7. 找到一個multiset的所有子集
- 8. 定義一個終端,它是xtext中ID的一個子集
- 9. 找到一個詞是不是另一個詞的一個子
- 10. R如何在列表中找到向量的一個子集的交集
- 11. 從另一個子集內的子集內訪問超集變量
- 12. 如何使用group_level匹配一個超集關鍵的一個子集(在CouchDB中的子選擇?)
- 13. 尋找一個子集< - 函數
- 14. 如何生成一個集合的所有唯一子集?
- 15. 彈簧注入一個單元集而不是一個空集
- 16. 如何將一個表從一個hbase集羣複製到另一個集羣?
- 17. 序列集合 - 找到一起是給定序列的子集
- 18. 調度:分區是一個整數集成K個子集
- 19. 如何從一個長列表子集?
- 20. 如何子集一個linnet對象
- 21. 一個R函數改變數據集 - 而不是回到它
- 22. 調用數據集的一個子集
- 23. 保存子集另一個集合
- 24. 驗證是一個數組是另一個子集
- 25. Open in Place(但只是一個子集)
- 26. Zepto只是jQuery的一個子集?
- 27. 找到最後一個TR(集團)
- 28. 如何將兩個私人Worksheet_Change子集合到一個VBA中?
- 29. 找到一個數組的子集,使子集中的元素有一個共同的差異
- 30. 如何檢查一個列表是否是另一個列表的子集?
好吧,讓我們假設我可以排序的包含的對象的特定屬性;我怎麼用這個? – Pierreten
如果您使用一個HashSet(其通常O(1)以檢查安全殼或添加/刪除),這是O(n),其中n是超集的大小。如果子集較小,最好迭代並從超集中移除它中的每個項目。 –
除非您嘗試刪除重複項,在這種情況下,如果散列鍵被正確選取,這將是一個O(1)問題,因爲散列鍵將負責最初移除重複項。裝載鍵仍然是O(n)。 – GrayWizardx