例如兩個含有n個元素的有序(非降序)整型陣列a和b(陣列a與b中都沒有重複元素),求出其共同元素,
a = 0, 1, 2, 3, 4
b = 1, 3, 5, 7, 9
那麼它們的交集為。
計算陣列交集可以採用很多種方法,但陣列的相對大小一般會影響演算法的效率,所以需要根據兩個陣列的相對大小來確定採用的方法:
(1)對於兩個陣列長度相當的情況,一般可以採取如下三種方法。
方法一:採用二路歸併來遍歷兩個陣列。
設兩個陣列分別為array1[n1],array2[n2]。分別以i,j從頭開始遍歷兩個陣列。在遍歷過程中,如果當前遍歷位置的array1[i]與array[j]相等,則此數為兩個陣列的交集,記錄下來,並繼續向後遍歷array1和array2。如果array1[i]大於array2[j],則需繼續向後遍歷array2。如果array1[i]小於array2[j],則需要繼續向後遍歷array1,直到有乙個陣列結束遍歷即停止。具體**如下所示:
int mixed(int array1,int n1,int array2,int n2,int* mixed)
else if(array1[i]>array2[j])
else if(array1[i]
}return k;
}方法二:順序遍歷兩個陣列,將陣列元素存放到雜湊表中,同時對統計的陣列元素進行計數,如果為2,則為二者的交集元素。
方法三:遍歷兩個陣列中任意乙個陣列,將遍歷得到的元素存放到雜湊表,然後遍歷另外乙個陣列,同時對建立的雜湊表進行查詢,如果存在,則為交集元素。
(2)對於兩個陣列長度相差懸殊的情況,例如陣列a的長度遠遠大於陣列b的長度,則可以採用下面幾種方法:
方法一:依次遍歷長度小的陣列,將遍歷的得到的陣列元素在長陣列中進行二分查詢。具體而言,設兩個指向兩個陣列末尾元素的指標,取較小的那個數在另乙個陣列中二分查詢,找到,則存在乙個交集,並且將該目標陣列的指標指向該位置前乙個位置。如果沒有找到,同樣可以找到乙個位置,使得目標陣列中在該位置後的數肯定不在另乙個陣列中存在,直接移動該目標陣列的指標指向該位置的前乙個位置,再迴圈找,直到乙個陣列為空為止。因為兩個陣列中都可能出現重複的數,因此二分查詢時,當找到乙個相同的數x時,其下標為i,那麼下乙個二分查詢的下界變為i+1,避免x重複使用。
方法二:採用與方法一類似的方法,但是每次查詢在前一次查詢的基礎上進行,這樣可以大大縮小查詢表的長度。
方法三:採用與方法二類似的方法,但是遍歷長度小的陣列的方式有所不同,從陣列頭部和尾部同時開始遍歷,這樣可以進一步縮小查詢表的長度。
求兩個有序整型陣列的交集
有兩個有序的整型陣列a和b 沒有重複元素 他們的長度分別為lena和lenb,求出他們的共同元素。例如 a 0,1,3,5,7,9,11 b 2,3,4,7,11 它們的交集為。求交集的方法有很多種,但陣列的長度會影響演算法的效率。2.1.1 二路歸併 對於陣列a,b分別以i,j從頭遍歷陣列。如果當...
兩個有序集合求交集
方案一 暴力法,for for,時間複雜度o n n 當資料量很大時,不可取 方案二 拉鍊法 有序集合1 有序集合2 兩個指標指向首元素,比較元素的大小 1 如果相同,放入結果集,隨意移動乙個指標 2 否則,移動值較小的乙個指標,直到隊尾 這種方法的好處是 1 集合中的元素最多被比較一次,時間複雜度...
計算兩個集合的交集
include include include define number1 7 define number2 5 void createcollect int int void display int int int main printf 集合1 display collection1,numb...