基本算法,求交集
2015-06-17 16:40
323 查看
一,交集运算算法
求多列数据的交集是一种应用广泛应用的算法,例如在搜索应用中,一个搜索关键词被分成了多个Term,每个Term对应一个倒排链表,那个整个搜索关键词的
搜索结果就是各个Term对应倒排链表元素的交集。
二,算法
三,运算
求多列数据的交集是一种应用广泛应用的算法,例如在搜索应用中,一个搜索关键词被分成了多个Term,每个Term对应一个倒排链表,那个整个搜索关键词的
搜索结果就是各个Term对应倒排链表元素的交集。
二,算法
/************************************************************************* > File Name: intersection.cpp > Author:zhangtx > Mail: 18510665908@163.com > Created Time: 2015年06月04日 星期四 17时19分17秒 ************************************************************************/ #include <vector> #include<iostream> using namespace std; template<class T> void printResult(int left,int right,T data[]) { cout<<endl<<"**************************************************************"<<endl; for(int idx=left;idx<=right;idx++) cout<<data[idx]<<" "; } template<class T> int partition(int left,int right,T data[]) { T tmpData=data[(left+right)/2]; data[(left+right)/2]=data[left]; data[left]=tmpData; while(left<right) { while(data[right]>=tmpData && left<right) right--; data[left]=data[right]; while(data[left]<=tmpData && left<right) left++; data[right]=data[left]; } data[left]=tmpData; return left; } template<class T> void quickSort(int left,int right,T data[]) { if (left < right) { int pos=partition<int>(left,right,data); quickSort(left,pos-1,data); quickSort(pos+1,right,data); } } template<class T> void intersection(int testData[][12],int column) { int *index=new int[column]; int *count=new int[column]; for (int idx=0;idx<column;idx++) { count[idx]=sizeof(testData[idx])/sizeof(int); index[idx]=0; } int idx=0; while(true) { T max=testData[0][index[0]]; /*get current max value of each array * */ for(idx=0;idx<column;idx++) { if(testData[idx][index[idx]]>max) max=testData[idx][index[idx]]; } /* * move pos according to max * */ for(idx=0;idx<column;idx++) while(testData[idx][index[idx]]<max && index[idx]<count[idx]) index[idx]++; /* * wheather the current value of each array is equal * */ for(idx=0;idx<column-1;idx++) { if (testData[idx][index[idx]]!=testData[idx+1][index[idx+1]]) break; } if (idx==column-1) cout<<max<<" "; bool flag=false; for(idx=0;idx<column;idx++) { if (index[idx]>count[idx]) { /* * one array is over * */ flag=true; break; } /*step to next*/ index[idx]++; } if (flag==true) break; } } int main(int argc,char *argv[]) { int testDataA[][12]={ {53,5,7,19,12,324,46,76,928,111,2322,343}, {53,51,7,19,12,3224,46,76,928,111,232,22}, {53,51,7,19,12,3224,46,76,928,111,23222,11} }; //cout<<endl<<"sorting before"<<endl; int countA=sizeof(testDataA[0])/sizeof(int); //printResult<int>(0,countA-1,testDataA[0]); quickSort<int>(0,countA-1,testDataA[0]); cout<<endl<<"sorting result"<<endl; printResult<int>(0,countA-1,testDataA[0]); //cout<<endl<<"sorting before"<<endl; int countB=sizeof(testDataA[1])/sizeof(int); //printResult<int>(0,countB-1,testDataA[1]); quickSort<int>(0,countB-1,testDataA[1]); cout<<endl<<"sorting result"<<endl; printResult<int>(0,countB-1,testDataA[1]); //cout<<endl<<"sorting before"<<endl; int countC=sizeof(testDataA[2])/sizeof(int); //printResult<int>(0,countC-1,testDataA[2]); quickSort<int>(0,countC-1,testDataA[2]); cout<<endl<<"sorting result"<<endl; printResult<int>(0,countC-1,testDataA[2]); cout<<endl<<"intersection"<<endl; /* intersection algo*/ intersection<int>(testDataA,3); cout<<endl; return 0; }
三,运算
[root@M-192-168-10-225 algo]# g++ -g intersection.cpp [root@M-192-168-10-225 algo]# ./a.out sorting result ************************************************************** 5 7 12 19 46 53 76 111 324 343 928 2322 sorting result ************************************************************** 7 12 19 22 46 51 53 76 111 232 928 3224 sorting result ************************************************************** 7 11 12 19 46 51 53 76 111 928 3224 23222 intersection 7 12 19 46 53 76 111 928
相关文章推荐
- ubuntu找不到库编译问题的解决
- 【failed to create java virtual machine】 解决方案
- 关于android manager 不能更新的问题
- python各种类型转换-int,str,char,float,ord,hex,oct等
- 深入Android SQLite 事务处理详解
- jQuery中使用ajax,$.post
- 【好程序员笔记分享】—— C语言中的宏定义
- 关于Base64
- 关于java.lang.UnsatisfiedLinkError的小案例
- eclipse 中文乱码问题解决
- linux命令八:mount
- IKAnalyzer结合Lucene使用和单独使用例子 简单性能测试
- Javascript之事件流
- eclipse+android配置SDK+ADT
- 深入解析单例线程安全问题
- youwuku和koudaitong以及weimeng差异
- 单例设计模式的几种常见实现方法
- Informatica Update 机制详解
- intellij在jdk1.7和1.8的字体问题
- C++智能指针auto_ptr