2013-12-19 43 views
5

我想找到兩個int數組的交集。我使用此代碼:在C中的兩個int數組的交集#

public int[] Find_Common_Elements(int[] p1, int[] p2) 
    { 
     int count = 0; 
     for (int i = 0; i < p1.Length; i++) 
     { 
      for (int j = 0; j < p2.Length; j++) 
      { 
       if (p1[i] == p2[j]) 
       { 
        count++; 
        break; 
       } 
      } 
     } 

     int[] result = new int[count]; 
     count = 0; 
     for (int i = 0; i < p1.Length; i++) 
     { 
      for (int j = 0; j < p2.Length; j++) 
      { 
       if (p1[i] == p2[j]) 
       { 
        result[count++] = p1[i]; 
        break; 
       } 
      } 
     } 

     return result; 
    } 

    public int[] BubbleSort(int[] numarray) 
    { 
     int max = numarray.Length; 
     for (int i = 1; i < max; i++) 
     { 
      for (int j = 0; j < max - i; j++) 
      { 

       if (numarray[j] > numarray[j + 1]) 
       { 
        int temp = numarray[j]; 
        numarray[j] = numarray[j + 1]; 
        numarray[j + 1] = temp; 
       } 
      } 
     } 
     return numarray; 
    } 

    public int[] Find_Unique_Elements(int[] numarray) 
    { 
     BubbleSort(numarray); 
     int element = numarray[0]; 
     int count = 1; 
     for (int i = 1; i < numarray.Length; i++) 
     { 
      if (element == numarray[i]) 
       continue; 
      else 
      { 
       element = numarray[i]; 
       count++; 
      } 
     } 

     int[] result = new int[count]; 

     count = 0; 
     element = numarray[0]; 
     result[count++] = element; 
     for (int i = 1; i < numarray.Length; i++) 
     { 
      if (element == numarray[i]) 
       continue; 
      else 
      { 
       element = numarray[i]; 
       result[count++] = element; 
      } 
     } 
     return result; 
    } 

    public void Result() 
    { 
     int[] array1 = new int[] { 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 
      95, 85, 75, 65, 55, 45, 35, 25, 15, 05, 
      10, 15, 20, 25, 30, 35, 40, 45, 50, 55 
     }; 

     int[] array2 = new int[] { 15, 25, 35, 45, 55, 
      12, 22, 32, 43, 52, 
      15, 25, 35, 45, 55 
     }; 

     int[] p1 = Find_Unique_Elements(array1); 
     int[] p2 = Find_Unique_Elements(array2); 
     int[] result = Find_Common_Elements(array1, array2); 

     for (int i = 0; i < p1.Length; i++) 
      textBox1.Text += "\n" + p1[i].ToString(); 
     for (int i = 0; i < p2.Length; i++) 
      textBox2.Text += "\n" + p2[i].ToString(); 
     for (int i = 0; i < result.Length; i++) 
      textBox3.Text += "\n"+result[i].ToString(); 
     } 








    private void button1_Click(object sender, RoutedEventArgs e) 
    { 
     Result(); 
    } 

但問題是,得到的結果爲15 15 25 25 35 35 45 45 55 55,我想15 25 35 45 55這有什麼代碼問題? 感謝您的幫助

+0

你爲什麼不返回Find_Unique_Elements(結果); –

回答

14

你可以使用這個內置的LINQ Intersect擴展方法:

using System.Linq; // Make sure you include this line 

public int[] Find_Common_Elements(int[] p1, int[] p2) 
{ 
    return p1.Intersect(p2).ToArray(); 
} 
+0

基於這個問題,在你面前彈出一個'Distinct',他想要一個不同的交集。 –

+3

@DanielMann'Intersect'是一個集合操作,它只會返回一個集合,因此永遠不會有重複的項目(除非你對distinct和intersect使用不同的等式定義)。 – Servy

+0

感謝p.s.w.g :)現在它的工作正常。 –

3

如果你想在學術上解決問題,即不使用內置的方法,那麼在這裏是兩種解決方案:

  1. 對兩個數組進行排序。然後通過類似於合併排序的方式進行遍歷,並打印出相同的元素。

  2. 查找一個數組中的主元(例如使用Median of Medians算法)。然後圍繞該樞軸分區每個陣列。然後打印出兩個數組中常見的樞軸值(通過這樣做解決了樞軸元素的交點)。然後遞歸地重複左側分區和右側分區上的操作。

編輯:我從純粹的算法的角度來看這個問題困惑。解決方案#2是一種優化的就地相交算法,但#1因較小的常數因子而工作得更快。我已經記錄了差異和推理爲什麼排序在一篇文章中更有效率,這篇文章有點太長了:Finding Intersection of Two Unsorted Arrays

1

Linq絕對是最乾淨的方法,但這並不意味着你應該扔掉你的代碼。這是一個很好的學習工具,可以質疑「爲什麼這些代碼不會做同樣的事情?」

答案非常簡單。您不會將唯一陣列傳遞到Find_Common_Elements! (Find_Common_Elements有一個內置的假設,即輸入具有獨特的元素,否則該行爲是符合市場預期。)只要改變這個

int[] result = Find_Common_Elements(array1, array2); 

這樣:

int[] result = Find_Common_Elements(p1, p2); 

將做你的代碼工作完美。

0
static void Main(string[] args) 
    { 
     int[] one= { 1, 3, 4, 6, 7 }; 
     int[] second = { 1, 2, 4, 5 }; 

     foreach (int r in one.Intersect(second)) 
      Console.WriteLine(r); 
     Console.ReadLine(); 
    } 

享受