一、陣列內資料無序且可以重複
本文採用一種交換的方式來求出兩個陣列的並集,交集和差集,這種演算法運算速度較快,記憶體消耗空間較少,是乙個值得學習的好方法,另外,作者提醒您,重要的不是演算法本身,而是該演算法會開拓我們的思維空間,要注意對問題的多思考。
演算法概述:
兩個任意元素的陣列,比較出兩個陣列中相同的元素和不同的元素。
元素劃分:
計算過程中,兩個陣列內部元素的劃分:
演算法流程:
從陣列1的尚未比較的元素中拿出第乙個元素array1(i),用array1(i)與array2(j)進行比較(其中j>i且j1. 陣列2中找到了乙個與array1(i)相等的元素,則將array2(j)與array2(i)進行交換,i加一,進行下次迭代
2. 陣列2直到結尾也沒找到與array1(i)相等的元素,則將array1(i)與
尚未進行比較的最後乙個元素array1(k)進行交換,i不加一,進行下次迭代。
演算法實現**:
#include
bool join(const int *arra, const int lena, const int *arrb, const int lenb, \
int *arrdst, int *len)
else if(arra[i] > arrb[j])
else
}//交集的真實數目
*len = ncount;
return true;
}bool merge(const int *arra, const int lena, const int *arrb, const int lenb, \
int *arrdst, int *len)
else if(arra[i] > arrb[j])
else
}while(i < lena)
while(j < lenb)
//並集的真實數目
*len = ncount;
return true;
}void print(const int *arr, const int len)
printf("\n\n");
}void main()
;int b = ;
int sizea = sizeof(a) / sizeof(a[0]);
int sizeb = sizeof(b) / sizeof(b[0]);
int i = 0;
int j = 0;
int len;
int *c = new int [sizea + sizeb];
printf("陣列a和b的交集:\n");
join(a, sizea, b, sizeb, c, &len);
print(c, len);
printf("陣列a和b的並集:\n");
merge(a, sizea, b, sizeb, c, &len);
print(c, len);
delete c;
printf("\n\n");
}三、3個已經排序的整數數列,找到common elements。
1)三個index指向三個數列開始,比較三者的值,若相等則找到乙個。若有兩個元素相等且較大,則較小的乙個index+;其他情況,較小的兩個index++。時間複雜度o(n),n小於等於最長的數列長度。
2)先找兩個陣列的common element,過程和歸併排序類似,然後看這個結果是否出現在陣列三中即可,用二分查詢。時間複雜度o(n),空間複雜度為o(1),如果是n個陣列,則可以採用敗者樹。(新學習的,呵呵)
JS陣列求並集,交集和差集
es7 filter結合includes 並集 let union a.concat b.filter v a.includes v 1,2,3,4,5 交集 let intersection a.filter v b.includes v 2 差集 let difference a.concat ...
python 兩個list 求交集,並集,差集
在python中,陣列可以用list來表示。如果有兩個陣列,分別要求交集,並集與差集,怎麼實現比較方便呢?當然最容易想到的是對兩個陣列做迴圈,即寫兩個for迴圈來實現。這種寫法大部分同學應該都會,而且也沒有太多的技術含量,本博主就不解釋了。這裡給大家使用更為裝bility的一些方法。老規矩,talk...
Linux 兩個檔案求交集 並集 差集
sort a.txt b.txt uniq dsort a.txt b.txt uniq在 a.txt 檔案 現,不在 b.txt 檔案 現 sort a.txt b.txt b.txt uniq u在 b.txt 檔案 現,不在 a.txt 檔案 現 sort b.txt a.txt a.txt ...