求兩個有序整型數組的交集
阿新 • • 發佈:2017-06-18
rip trac 哈希查找 comm views 整型 沒有 能夠 當前
1. 問題描寫敘述
有兩個有序的整型數組a和b(沒有反復元素),他們的長度分別為lenA和lenB,求出他們的共同元素。
比如:a = 0,1,3,5,7,9,11。b = 2,3,4,7,11;
它們的交集為{3。7,11}。
2. 方法思路
求交集的方法有非常多種,但數組的長度會影響算法的效率。
2.1 長度相當時。可採取的算法
2.1.1 二路歸並
對於數組a。b分別以i,j從頭遍歷數組。假設當前位置的a[i]等於b[j]。則這兩個數是兩個數組的一個交集,記錄下來並繼續遍歷;假設a[i]大於b[j],則繼續遍歷數組b,否則遍歷數組a。代碼例如以下:
//二路歸並法
int ComNun_Merge(int a[],int lenA,int b[],int lenB,int *comlst)
{
int i=0,j=0,k=0;
while(i < lenA && j < lenB)
{
if(a[i] == b[j] )
{
comlst[k++] = a[i];
i++;
j++;
}
else if(a[i] > b[j])
{
j++;
}
else
i++;
}
return k;
}
2.1.2 哈希查找
循環遍歷當中的一個數組。並將元素存放到哈希表中。然後遍歷還有一個數組,並進行hash查詢。
假設存在。則是兩個數組的一個交集,記錄下來。繼續查詢直到結束。
//哈希表查找法。此方法可無序,但要求元素為正數
int ComNum_Hash(int a[],int lenA,int b[],int lenB,int *comlst)
{
int hashTb[MAX_INT] = {0},i,j,k=0;
for(i = 0; i < lenA; i++)
hashTb[a[i]] = 1 ;
for(j = 0; j < lenB; j++)
{
if(hashTb[b[j]] == 1)
comlst[k++] = b[j];
}
return k;
}
2.2 兩數組長度相差較大
在這樣的情況下,能夠考慮使用二分查找法。先遍歷長度較小的數組。然後將這個元素值在在長度較大的數組中進行二分查找。
//二分查找法
int ComNum_Binary(int a[],int lenA,int b[],int lenB,int *comlst)
{
int i,j,k=0;
for(i = 0; i < lenA; i++)
{
int l=0,r=lenB-1,mid;
while(l <= r)
{
mid = (l+r)/2;
if( a[i] < b[mid] )
r = mid -1;
else if( a[i] > b[mid] )
l = mid +1;
else
{
comlst[k++] = a[i];
break;
}
}
}
return k;
}
求兩個有序整型數組的交集