生活随笔
收集整理的這篇文章主要介紹了
腾讯实习笔试:关于几个有序数组求交集的问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目就是假設有三個有序數組對其求交集,要求算法空間復雜度必須小,有序數組量會比較大。
解法:
第一種就是用二分法查找,二分法查找的效率是log(n),兩個數組求交集就是n1log(n2),當n1遠小于n2的時候,這個算法效果可以
第二種就是遍歷,用兩個游標來實現,具體可以見代碼,算法效率o(n1+n2)線性,當n1和n2比較接近時效果可以
#include<iostream>
#include<cstdlib>
#include<vector>
#include<list>
#include<algorithm>
#include<ctime>using std
::vector
;
using std
::list
;
void getRandOrderIntVec(vector
<int>& vecInt
, int num
,int max
)
{vecInt
.clear();vecInt
.reserve(num
);while (vecInt
.size() < num
){if (vecInt
.empty()){int value
= (std
::rand() % (max
));vecInt
.push_back(value
);}else {int value
= (std
::rand() % max
) + vecInt
.back() + 1;vecInt
.push_back(value
);}}}
void getSameValue(vector
<int>& vec1
, vector
<int>& vec2
, vector
<int>& vec3
, vector
<int>& vecSame
)
{vecSame
.clear();int minNumInThreeVec
= vec1
.size();if (vec2
.size() < minNumInThreeVec
){minNumInThreeVec
= vec2
.size();}if (vec3
.size() < minNumInThreeVec
){minNumInThreeVec
= vec3
.size();}minNumInThreeVec
/= 2; vecSame
.reserve(minNumInThreeVec
);vector
<int>::iterator vecIter1
= vec1
.begin();vector
<int>::iterator vecIter2
= vec2
.begin();vector
<int>::iterator vecIter3
= vec3
.begin();while ((vecIter1
!= vec1
.end())& (vecIter2
!= vec2
.end())& (vecIter3
!= vec3
.end())){if (((*vecIter1
) == (*vecIter2
))& ((*vecIter2
) == (*vecIter3
))){vecSame
.push_back(*vecIter1
);if ((vecIter1
!= vec1
.end())& (vecIter2
!= vec2
.end())& (vecIter3
!= vec3
.end())){vecIter1
++;vecIter2
++;vecIter3
++;}else{return; }}else{int caseValue
= 0;int minValue
= (*vecIter1
);if (minValue
> (*vecIter2
)){minValue
= (*vecIter2
);caseValue
= 1;}if (minValue
> (*vecIter3
)){caseValue
= 2;}switch (caseValue
){case 0:{if (vecIter1
!= vec1
.end()){vecIter1
++;break;}else{return;}}case 1:{if (vecIter2
!= vec2
.end()){vecIter2
++;break;}else{return;}}case 2:{if (vecIter3
!= vec3
.end()){vecIter3
++;break;}else{return;}}default:break;}}}
}void getSameValueByBinarySeach3(vector
<int>& vec1
, vector
<int>& vec2
, vector
<int>& vec3
, vector
<int>& vecSame
)
{vecSame
.clear();int minNumInThreeVec
= vec1
.size();if (vec2
.size() < minNumInThreeVec
){minNumInThreeVec
= vec2
.size();}if (vec3
.size() < minNumInThreeVec
){minNumInThreeVec
= vec3
.size();}minNumInThreeVec
/= 2;vecSame
.reserve(minNumInThreeVec
);vector
<int>::iterator pos2Iter
= vec2
.end(); vector
<int>::iterator pos3Iter
= vec3
.end();for (int i
= (vec1
.size()-1); i
>= 0; i
--){pos2Iter
= std
::lower_bound(vec2
.begin(), pos2Iter
, vec1
[i
]); if ((*pos2Iter
) == vec1
[i
]){pos3Iter
= std
::lower_bound(vec3
.begin(), pos3Iter
, vec1
[i
]);if ((*pos3Iter
) == vec1
[i
]){vecSame
.push_back(vec1
[i
]);}}}
}void getSameValueByBinarySeach2(vector
<int>& vec1
, vector
<int>& vec2
, vector
<int>& vec3
, vector
<int>& vecSame
)
{vecSame
.clear();int minNumInThreeVec
= vec1
.size();if (vec2
.size() < minNumInThreeVec
){minNumInThreeVec
= vec2
.size();}if (vec3
.size() < minNumInThreeVec
){minNumInThreeVec
= vec3
.size();}minNumInThreeVec
/= 2;vecSame
.reserve(minNumInThreeVec
);vector
<int>::iterator pos2Iter
= std
::lower_bound(vec2
.begin(), vec2
.end(), vec1
.back()); vector
<int>::iterator pos3Iter
= std
::lower_bound(vec3
.begin(), vec3
.end(), vec1
.back());for (int i
= 0; i
< vec1
.size(); i
++){if (std
::binary_search(vec2
.begin(), pos2Iter
, vec1
[i
])){if (std
::binary_search(vec3
.begin(), pos3Iter
, vec1
[i
])){vecSame
.push_back(vec1
[i
]);}}}
}void getSameValueByBinarySeach(vector
<int>& vec1
, vector
<int>& vec2
, vector
<int>& vec3
, vector
<int>& vecSame
)
{vecSame
.clear();int minNumInThreeVec
= vec1
.size();if (vec2
.size() < minNumInThreeVec
){minNumInThreeVec
= vec2
.size();}if (vec3
.size() < minNumInThreeVec
){minNumInThreeVec
= vec3
.size();}minNumInThreeVec
/= 2;vecSame
.reserve(minNumInThreeVec
);for (int i
= 0; i
< vec1
.size(); i
++){if (std
::binary_search(vec2
.begin(), vec2
.end(), vec1
[i
])){if (std
::binary_search(vec3
.begin(), vec3
.end(), vec1
[i
])){vecSame
.push_back(vec1
[i
]);}}}
}void printVec(vector
<int>& vec
)
{for (int i
= 0; i
< vec
.size(); i
++){std
::cout
<< vec
[i
] << " ";}std
::cout
<< std
::endl
;
}bool ifTwoVecSame(vector
<int>& vec1
, vector
<int>& vec2
)
{if (vec1
.size() != vec2
.size()){return false;}for (int i
= 0; i
< vec1
.size(); i
++){if (vec1
[i
] != vec2
[i
]){return false;}}return true;
}
int main()
{vector
<int> vec1
;vector
<int> vec2
;vector
<int> vec3
;getRandOrderIntVec(vec1
, 300000,100);getRandOrderIntVec(vec2
, 50000000,60);getRandOrderIntVec(vec3
, 100000000,60);std
::cout
<< "遍歷法求交集" <<std
::endl
;vector
<int> sameVec
;clock_t startTime
, endTime
;startTime
= clock();getSameValue(vec1
, vec2
, vec3
,sameVec
);endTime
= clock();std
::cout
<< "遍歷法運行時間 " << (endTime
- startTime
) <<std
::endl
;std
::cout
<< "交集數目 :" << sameVec
.size() << std
::endl
;std
::cout
<< "二分法求交集" << std
::endl
;vector
<int> sameVec2
;clock_t startTime2
, endTime2
;startTime2
= clock();getSameValueByBinarySeach(vec1
, vec2
, vec3
, sameVec2
);endTime2
= clock();std
::cout
<< "二分法運行時間 " << (endTime2
- startTime2
) << std
::endl
;std
::cout
<< "交集數目 :" << sameVec2
.size() << std
::endl
;std
::cout
<< "兩種方法結果相同1,不同 0: " << ifTwoVecSame(sameVec
, sameVec2
) << std
::endl
;std
::cout
<< "二分法求交集3" << std
::endl
;vector
<int> sameVec3
;clock_t startTime3
, endTime3
;startTime3
= clock();getSameValueByBinarySeach3(vec1
, vec2
, vec3
, sameVec3
);endTime3
= clock();std
::cout
<< "二分法運行時間3 " << (endTime3
- startTime3
) << std
::endl
;std
::cout
<< "交集數目3 :" << sameVec3
.size() << std
::endl
;std
::cout
<< "兩種方法結果相同1,不同 0: " << ifTwoVecSame(sameVec
, sameVec3
) << std
::endl
;
}
總結
以上是生活随笔為你收集整理的腾讯实习笔试:关于几个有序数组求交集的问题的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。