腾讯面试题:A.txt和B.txt两个文件,A有1亿个qq号,B有100万个,用代码实现交、并、差
2014-05-07 13:53
465 查看
在STL中关于有序序列有这么四个算法:
set_union(beg, end, beg, end2, dest); //求并集A∪B
set_union(beg, end, beg, end2, dest, comp);
set_intersection(beg, end, beg, end2, dest); //求交集A∩B
set_intersection(beg, end, beg, end2, dest, comp);
set_difference(beg, end, beg, end2, dest); //求差集A-B
set_difference(beg, end, beg, end2, dest, comp);
set_symmetric_difference(beg, end, beg, end2, dest); //求对称差A∪B-A∩B
set_symmetric_difference(beg, end, beg, end2, dest, comp);
所以可以直接用这种stl的算法解决。如果一次无法把A文件读入内存,可以分块读取,多处理几次。
set_union(beg, end, beg, end2, dest); //求并集A∪B
set_union(beg, end, beg, end2, dest, comp);
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_union (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { while (true) { if (first1==last1) return std::copy(first2,last2,result); if (first2==last2) return std::copy(first1,last1,result); if (*first1<*first2) { *result = *first1; ++first1; } else if (*first2<*first1) { *result = *first2; ++first2; } else { *result = *first1; ++first1; ++first2; } ++result; } }
set_intersection(beg, end, beg, end2, dest); //求交集A∩B
set_intersection(beg, end, beg, end2, dest, comp);
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { while (first1!=last1 && first2!=last2) { if (*first1<*first2) ++first1; else if (*first2<*first1) ++first2; else { *result = *first1; ++result; ++first1; ++first2; } } return result; }
set_difference(beg, end, beg, end2, dest); //求差集A-B
set_difference(beg, end, beg, end2, dest, comp);
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { while (first1!=last1 && first2!=last2) { if (*first1<*first2) { *result = *first1; ++result; ++first1; } else if (*first2<*first1) ++first2; else { ++first1; ++first2; } } return std::copy(first1,last1,result); }
set_symmetric_difference(beg, end, beg, end2, dest); //求对称差A∪B-A∩B
set_symmetric_difference(beg, end, beg, end2, dest, comp);
template <class InputIterator1, class InputIterator2, class OutputIterator> OutputIterator set_symmetric_difference (InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, OutputIterator result) { while (true) { if (first1==last1) return std::copy(first2,last2,result); if (first2==last2) return std::copy(first1,last1,result); if (*first1<*first2) { *result=*first1; ++result; ++first1; } else if (*first2<*first1) { *result = *first2; ++result; ++first2; } else { ++first1; ++first2; } } }
所以可以直接用这种stl的算法解决。如果一次无法把A文件读入内存,可以分块读取,多处理几次。
相关文章推荐
- 最能够体现一个好的程序员的地方
- 解决职业危机的五个建议
- 推荐一款针对于程序员开发的字体Source Code Pro
- 面试问题
- 前端面试题整理(一)
- 生儿子的绝妙方法汇总,对程序员特管用!!!
- 从程序员到CTO的Java技术路线图 (转自安卓巴士)
- 华为数字芯片工程师实习生面试全过程
- 好习惯的培养和错误经验的积累(1)
- 剖析Android移动开发程序员的职业发展之路
- java程序员究竟该如何发展(网站开发方向)[图]
- 做程序员压力山大,很多人都快疯了
- 黑马程序员-交通灯
- 【面试题018】树的子结构
- 程序员的回归式进化
- 四十条测试你是不是合格的程序员
- 天天炫斗三大职业技能属性全面分析
- 随便扯扯,程序员应该具备哪些素质
- 程序员:伤不起的三十岁
- 程序员永远的痛之字符编码的奥秘