当前位置:   article > 正文

腾讯面试题:A.txt和B.txt两个文件,A有1亿个qq号,B有100万个,用代码实现交、并、差...

文件a和文件b分别保存2亿个用户,设计算法

在STL中关于有序序列有这么四个算法:

set_union(beg, end, beg, end2, dest);                    //求并集A∪B

set_union(beg, end, beg, end2, dest, comp);

  1. template <class InputIterator1, class InputIterator2, class OutputIterator>
  2. OutputIterator set_union (InputIterator1 first1, InputIterator1 last1,
  3. InputIterator2 first2, InputIterator2 last2,
  4. OutputIterator result)
  5. {
  6. while (true)
  7. {
  8. if (first1==last1) return std::copy(first2,last2,result);
  9. if (first2==last2) return std::copy(first1,last1,result);
  10. if (*first1<*first2) { *result = *first1; ++first1; }
  11. else if (*first2<*first1) { *result = *first2; ++first2; }
  12. else { *result = *first1; ++first1; ++first2; }
  13. ++result;
  14. }
  15. }

set_intersection(beg, end, beg, end2, dest);          //求交集A∩B

set_intersection(beg, end, beg, end2, dest, comp);

  1. template <class InputIterator1, class InputIterator2, class OutputIterator>
  2. OutputIterator set_intersection (InputIterator1 first1, InputIterator1 last1,
  3. InputIterator2 first2, InputIterator2 last2,
  4. OutputIterator result)
  5. {
  6. while (first1!=last1 && first2!=last2)
  7. {
  8. if (*first1<*first2) ++first1;
  9. else if (*first2<*first1) ++first2;
  10. else {
  11. *result = *first1;
  12. ++result; ++first1; ++first2;
  13. }
  14. }
  15. return result;
  16. }


set_difference(beg, end, beg, end2, dest);           //求差集A-B

set_difference(beg, end, beg, end2, dest, comp);

  1. template <class InputIterator1, class InputIterator2, class OutputIterator>
  2. OutputIterator set_difference (InputIterator1 first1, InputIterator1 last1,
  3. InputIterator2 first2, InputIterator2 last2,
  4. OutputIterator result)
  5. {
  6. while (first1!=last1 && first2!=last2)
  7. {
  8. if (*first1<*first2) { *result = *first1; ++result; ++first1; }
  9. else if (*first2<*first1) ++first2;
  10. else { ++first1; ++first2; }
  11. }
  12. return std::copy(first1,last1,result);
  13. }


set_symmetric_difference(beg, end, beg, end2, dest);                   //求对称差A∪B-A∩B

set_symmetric_difference(beg, end, beg, end2, dest, comp); 

  1. template <class InputIterator1, class InputIterator2, class OutputIterator>
  2. OutputIterator set_symmetric_difference (InputIterator1 first1, InputIterator1 last1,
  3. InputIterator2 first2, InputIterator2 last2,
  4. OutputIterator result)
  5. {
  6. while (true)
  7. {
  8. if (first1==last1) return std::copy(first2,last2,result);
  9. if (first2==last2) return std::copy(first1,last1,result);
  10. if (*first1<*first2) { *result=*first1; ++result; ++first1; }
  11. else if (*first2<*first1) { *result = *first2; ++result; ++first2; }
  12. else { ++first1; ++first2; }
  13. }
  14. }

所以能够直接用这样的stl的算法解决。假设一次无法把A文件读入内存,能够分块读取,多处理几次。



声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号