求2個集合的交集
第一種方法
最簡單、粗暴的循環遍歷2個集合,判斷如果有相同的元素就取出來。假設集合1的長度為M,集合2的長度為N,那么,時間復雜度為:O(M*N)
代碼:
public static List<string> GetIntersection(List<string> list1, List<string> list2) { List<string> list3 = new List<string>(); //第一種方法:循環遍歷 //O(n×m) for (int i = 0; i < list1.Count; i++) { for (int j = 0; j < list2.Count; j++) { if (list1[i]==list2[j]) { list3.Add(list1[i]); } } } return list3; }
第二種方法
利用hash這種很有用的數據結構來實現。我們知道,hash的特點之一就是不允許有重復元素,即hash表中的元素都是唯一的。所以,我們的思路就是:先把第一個集合的所有元素都放進hashSet中,時間復雜度O(M);再把第二個集合中的元素放進hashSet中,如果有重復元素,就是這2個集合的交集,時間復雜度為O(N)。即總的時間復雜度從O(M*N)降低到了O(M+N)。
代碼:
public static List<string> GetIntersection2(List<string> list1, List<string> list2) { //第二種方法:hash List<string> list3 = new List<string>(); HashSet<string> hashSet = new HashSet<string>(); foreach (string item in list1) { hashSet.Add(item); } foreach (string item in list2) { if (hashSet.Add(item) == false) { list3.Add(item); } } return list3; }
測試
代碼:
static void Main(string[] args) { List<string> list1 = new List<string>(); list1.Add("apple"); list1.Add("banana"); list1.Add("pear"); list1.Add("orange"); list1.Add("grape"); List<string> list2 = new List<string>(); list2.Add("nokia"); list2.Add("sumsung"); list2.Add("htc"); list2.Add("apple"); list2.Add("orange"); List<string> list =new List<string>(); //test for two set join //list = TwoSetsIntersection.GetIntersection(list1, list2); list = TwoSetsIntersection.GetIntersection2(list1, list2); foreach (string item in list) { Console.Write(item + "\t"); } }
總結
hash的另一個特點是查找效率為O(1),驚人的高!
對於這道題目要是算出來O(M*N)的同學就應該補課了。出來混,遲早要還的。