2013年1月27日 星期日

[C Programming] 等值數目

已知兩個整數數列f[]與g[],它們的元素都已自小到大排列好,
且兩個陣列中的元素都各自不相同(Ex. f[]:1,3,5,7,9  g[]:3,5,7,8,10)
請寫一個程式,算出兩個陣列彼此之間有多少組相同的資料,
以範例來說有3 5 7共3組。

但請不要使用暴力法,這樣會是O(n^2)。
提示:善用已排序的特性。


解:
因為同陣列的元素都各自不相同且排序,
所以當:
1. f[i] < g[j] → i++;
2. f[i]==g[j] → i++; j++; cnt++; (因為這組相等不會再重複出現了)
3. f[i] > g[j] → j++;
一直到其中一個index先跑到底為止。
若兩陣列長度皆為n,最多只要比對2n次就可以結束了!

Code大概長這樣:
int eq_cnt(int f[], int g[], int m, int n)
{
 int cnt = 0, i = 0, j = 0;
 while( (i < m) && (j < n) )
  if(f[i] < g[j]) 
   i++;
  else if(f[i] == g[j])
  { i++;j++;cnt++; }
  else
   j++;
 return cnt;
}

沒有留言:

張貼留言