求兩個數(shù)組的交集,有很多解法,比如最暴力的 for循環(huán)嵌套,接下來要實現(xiàn)的一種是利用 hash 的方式。這里不使用 OC 提供的 NSSet,NSDictionary。
具體實現(xiàn)思路:
說明:兩個數(shù)組,分別稱為第一個數(shù)組、第二個數(shù)組
用一個數(shù)組中元素的hash值作為另一個新數(shù)組的下標,新建的數(shù)組要統(tǒng)一初始化,hash到的下標里面的元素統(tǒng)一設置為1,再循環(huán)hash另一個數(shù)組中的元素,用這個元素作為下標去新建的數(shù)組中取元素,如果能取到1則證明第二個數(shù)組中的這個元素在第一個數(shù)組中。hash出來的數(shù)字比較大,用這個數(shù)對數(shù)組的個數(shù)求余數(shù)。
新建一個數(shù)組,數(shù)組的大小選用第一個數(shù)組和第二個數(shù)組中個數(shù)少的那一個,因為此時另開辟了內(nèi)存,要少開辟一點,并初始化,如果擔心發(fā)生
hash碰撞,可以稍微將新建數(shù)組的容量擴大一點。選擇數(shù)量少的一個數(shù)組,循環(huán)獲取這個數(shù)組中元素的 hash 值,并用這個 hash 值對數(shù)組的個數(shù)求余數(shù)得到下標
index,用index這個下標訪問數(shù)組,在這個下標的位置存儲1。循環(huán)另一個數(shù)組,
hash里面的元素并用這個值對新建數(shù)組的個數(shù)求余數(shù),得出新的下標index2,用index2作為下標,去剛才新建的數(shù)組中獲取元素,如果獲取到的元素是1,那么久找到了,否則沒找到。
具體代碼如下:
- (void)viewDidLoad {
[super viewDidLoad];
NSArray<NSNumber *> *array1 = @[@"1",@"2",@"3",@"4"];
NSArray<NSNumber *> *array2 = @[@"1",@"2",@"3",@"4"];
int hashArray[8];
memset(hashArray, 0, sizeof(hashArray));
for (int i=0; i<array1.count; i++) {
int index = CFHash((__bridge CFTypeRef)(array1[i]))%8;
hashArray[index] = 1;
}
for (int i=0; i<array2.count; i++) {
int index = CFHash((__bridge CFTypeRef)array2[i])%8;
if (hashArray[index] == 1) {
NSLog(@"same num: %@", array2[i]);
}
}
}
具體執(zhí)行結(jié)果及數(shù)組的存儲內(nèi)容如下圖:
