C++ 在两个向量之间找到相同元素的最有效方法是什么
如果我必须使用下面的字符向量C++ 在两个向量之间找到相同元素的最有效方法是什么,c++,C++,如果我必须使用下面的字符向量 vector<char> sv; sv.push_back('a'); sv.push_back('b'); sv.push_back('c'); sv.push_back('d'); sv.push_back('e'); vectorsv; sv.推回(“a”); sv.推回(“b”); sv.推回(“c”); sv.推回(“d”); sv.推回(“e”); 然后我有另一个字符向量,它有sv之前包含的部分元素 vector<char>
vector<char> sv;
sv.push_back('a');
sv.push_back('b');
sv.push_back('c');
sv.push_back('d');
sv.push_back('e');
vectorsv;
sv.推回(“a”);
sv.推回(“b”);
sv.推回(“c”);
sv.推回(“d”);
sv.推回(“e”);
然后我有另一个字符向量,它有sv之前包含的部分元素
vector<char> sv2;
v2.push_back('c');
v2.push_back('d');
v2.push_back('a');
v2.push_back('f');
v2.push_back('g');
向量sv2;
v2.推回(“c”);
v2.推回(“d”);
v2.推回(“a”);
v2.推回(“f”);
v2.推回(“g”);
如果我想计算同一元素出现的次数,那么解决这个问题的最佳方法是什么?对于向量
,它可以在线性时间内完成。为了简单起见,我们假设char
是无符号的,或者我们使用vector
ints[256]={0},s2[256]={0};
用于(自动a:sv)
++s[a];
用于(自动a:sv2)
++s2[a];
整数计数=0;
对于(int i=0;i<256;++i)
计数+=min(s[i],s2[i]);
在一般情况下使用排序和<代码> SETION交叉,作为<强> >JAROD42建议。
是向量排序?排序和STD::SETIX交叉。考虑如果它是unSundidif,你不能修改<代码> SV < /C> >和<代码> Sv2< /Cord>,创建排序副本。您还可以尝试线性复杂度方法,并对这两种方法进行基准测试。int s[256] = { 0 }, s2[256] = { 0 };
for (auto a : sv)
++s[a];
for (auto a : sv2)
++s2[a];
int count = 0;
for (int i = 0; i < 256; ++i)
count += min(s[i], s2[i]);