求一简单算法,从少量数据中找出不同
小弟不太懂算法,请各位指教
例:
数据A:123,456,789,101,112
数据B:789,101,653,222,112
需要找出653,222
大家帮忙想个算法,谢谢了,尽量效率高的
[解决办法]
分两步完成:
1.对A,B两组数据排序,得到
数据A ':101,112,123,456,789
数据B ':101,112,222,653,789
此步骤的效率可以达到O(n*logn).
2.在数据B '中找出没有在A '中出现的数据
可以很快找到:222,653
此步骤的效率是线性的,即:O(n).
故总的效率是O(n*logn).
[解决办法]
数据很少直接2重循环就完了,数据稍大的话如一楼排序,再大的话可以用hash
[解决办法]
字符串的话,先把A串每个加一个不会有的字符合并成一个串(比如@;等)形成123@456@789@101@112@
然后在这个字符串里面分别查找789@,101@,653@,222@,112@,找不到的就是你想要的
[解决办法]
排好一组,另外一组每个元素二分查找。字符的话也可以二分,就是判断字典顺序了。另外一种方法,两组合并成一组,排序,然后遍历,看那个元素不是两个。
[解决办法]
数学中差集的概念(在第二个集合但是不在第一个集合中的数据)
熟悉STL的话,可以直接用STL 算法库中提供的差集运算,这里给出用STL算法实现的代码,供参考(Good Luck):
#include <iostream>#include <string>#include <vector>#include <algorithm>using namespace std;int main(){ /* // input 2 group data by hand vector<string> strVec1; // store the first group data vector<string> strVec2; // store the second group data string strTmp; cout << "Please enter the 1st data(spit with space/enter, end with ctr+z):" << endl; while(cin >> strTmp) { strVec1.push_back(strTmp); } cout << "Please enter the 2nd data(spit with space/enter, end with ctr+z):" << endl; cin.clear(); while(cin >> strTmp) { strVec2.push_back(strTmp); } */ // for demonstration string str1[] = {"123","456","789","101","112"}; string str2[] = {"123","456","222","653","789"}; vector<string> strVec1(str1,str1+5); // store the first group data vector<string> strVec2(str2,str2+5); // store the second group data vector<string> strVec3; // store the result (the difference set of 1st and 2nd group data) sort(strVec1.begin(),strVec1.end()); sort(strVec2.begin(),strVec2.end()); set_difference(strVec2.begin(), strVec2.end(), strVec1.begin(), strVec1.end(), back_inserter(strVec3)); copy(strVec3.begin(),strVec3.end(),ostream_iterator<string>(cout," ")); cout << endl; getchar(); return 0;}