求2個集合的交集


求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)的同學就應該補課了。出來混,遲早要還的。

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM