博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
倒排列表求交集算法 包括baeza yates的交集算法
阅读量:6987 次
发布时间:2019-06-27

本文共 5217 字,大约阅读时间需要 17 分钟。

#ifndef __INTERSECT_HPP__#define __INTERSECT_HPP__#include "probe.hpp"namespace themas {/* * like stl's set_intersect */template
void linear_intersect(InputIterator begin1, InputIterator end1, InputIterator begin2, InputIterator end2, OutputIterator out){ if ( (end2 - begin2) > (end1 - begin1) ) { // why in the world would i do this? // hmmmmmmm.......... ! std::swap(begin1, begin2); std::swap(end1, end2); } while (begin1 != end1 && begin2 != end2) { if (*begin1 < *begin2) ++begin1; else if (*begin2 < *begin1) ++begin2; else { *out++ = *begin1; ++begin1; ++begin2; } }}/* * this time with a comparator! */template
void linear_intersect(InputIterator begin1, InputIterator end1, InputIterator begin2, InputIterator end2, OutputIterator out, Comparator cmp){ if ( (end2 - begin2) > (end1 - begin1) ) { // why in the world would i do this? // hmmmmmmm.......... ! std::swap(begin1, begin2); std::swap(end1, end2); } while (begin1 != end1 && begin2 != end2) { if (cmp( *begin1, *begin2 ) ) ++begin1; else if ( cmp(*begin2, *begin1) ) ++begin2; else { *out++ = *begin1; ++begin1; ++begin2; } }}/* * baeza_intersect */template< template
class Probe, class RandomAccessIterator, class OutputIterator>void baeza_intersect(RandomAccessIterator begin1, RandomAccessIterator end1, RandomAccessIterator begin2, RandomAccessIterator end2, OutputIterator out){ RandomAccessIterator probe1, probe2; if ( (end1 - begin1) < ( end2 - begin2 ) ) { if ( begin1 == end1 ) return; probe1 = begin1 + ( ( end1 - begin1 ) >> 1 ); probe2 = lower_bound< Probe >( begin2, end2, *probe1 ); baeza_intersect< Probe >(begin1, probe1, begin2, probe2, out); // intersect left if (! (probe2 == end2 || *probe1 < *probe2 )) *out++ = *probe2++; baeza_intersect< Probe >(++probe1, end1, probe2, end2, out); // intersect right } else { if ( begin2 == end2 ) return; probe2 = begin2 + ( ( end2 - begin2 ) >> 1 ); probe1 = lower_bound< Probe >( begin1, end1, *probe2 ); baeza_intersect< Probe >(begin1, probe1, begin2, probe2, out); // intersect left if (! (probe1 == end1 || *probe2 < *probe1 )) *out++ = *probe1++; baeza_intersect< Probe >(probe1, end1, ++probe2, end2, out); // intersect right }}/* * with a comparator */template< template
class Probe, class RandomAccessIterator, class OutputIterator, class Comparator >void baeza_intersect(RandomAccessIterator begin1, RandomAccessIterator end1, RandomAccessIterator begin2, RandomAccessIterator end2, OutputIterator out, Comparator cmp){ RandomAccessIterator probe1, probe2; if ( (end1 - begin1) < ( end2 - begin2 ) ) { if ( begin1 == end1 ) return; probe1 = begin1 + ( ( end1 - begin1 ) >> 1 ); probe2 = lower_bound< Probe >( begin2, end2, *probe1, cmp ); baeza_intersect< Probe >(begin1, probe1, begin2, probe2, out, cmp); // intersect left if (! (probe2 == end2 || cmp( *probe1, *probe2 ) )) *out++ = *probe2++; baeza_intersect< Probe >(++probe1, end1, probe2, end2, out, cmp); // intersect right } else { if ( begin2 == end2 ) return; probe2 = begin2 + ( ( end2 - begin2 ) >> 1 ); probe1 = lower_bound< Probe >( begin1, end1, *probe2, cmp ); baeza_intersect< Probe >(begin1, probe1, begin2, probe2, out, cmp); // intersect left if (! (probe1 == end1 || cmp( *probe2, *probe1 ) )) *out++ = *probe1++; baeza_intersect< Probe >(probe1, end1, ++probe2, end2, out, cmp); // intersect right }}} // themas#endif // __INTERSECT_HPP__

转自:https://github.com/erikfrey/themas/blob/master/src/set_intersection/intersect.hpp

 

#include 
#include
#include
#include
#include
#include "intersect.hpp"using namespace themas;int main(int argc, char * argv[]){ std::set
nums1, nums2; std::vector
result1, result2, result3; boost::mt19937 rng(time(NULL)); for ( unsigned int i = rng() % 16384; i != 0; --i ) nums1.insert(rng()); for ( unsigned int i = rng() % 16384; i != 0; --i ) nums2.insert(rng()); for ( unsigned int i = rng() % 16384; i != 0; --i ) { unsigned int j = rng(); nums1.insert(j); nums2.insert(j); } std::vector
v1(nums1.begin(), nums1.end()), v2(nums2.begin(), nums2.end()); linear_intersect(v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(result1)); baeza_intersect < binary_probe > (v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(result2)); baeza_intersect < interpolation_probe > (v1.begin(), v1.end(), v2.begin(), v2.end(), std::back_inserter(result3)); if (result1 != result2 || result1 != result3) std::cout << "FAIL!" << std::endl; else std::cout << "PASS!" << std::endl;}

 

本文转自张昺华-sky博客园博客,原文链接:http://www.cnblogs.com/bonelee/p/6594263.html,如需转载请自行联系原作者

你可能感兴趣的文章
Sql Server 网络配置
查看>>
Oracle案例11——Oracle表空间数据库文件收缩
查看>>
看博客学学Android(十四)
查看>>
在Windows下安装配置jforum测试环境
查看>>
WEB基础
查看>>
AtCoder Regular Contest 081
查看>>
树状数组模板
查看>>
2017"百度之星"程序设计大赛 - 初赛(A)
查看>>
Python3 输出
查看>>
实验四 shell编程2
查看>>
多线程的那点儿事(基础篇)
查看>>
解决ViewPager多次刷新后重叠问题
查看>>
在Eclipse中使用JUnit4进行单元测试(中级篇)
查看>>
备忘 - Redis For Mac
查看>>
LeetCode - 51. N-Queens
查看>>
LeetCode 【46. Permutations】
查看>>
提交form表单页面不跳转
查看>>
一个分号导致两种截然不同的结果
查看>>
System.web.optimization 在 Asp.Net WebForm 中应用得注意了
查看>>
springMVC学习笔记三
查看>>