我有三个载体
vector<string> usersA = {"a15_afd","a19_afd","a20_afd"}
vector<string> usersB = {"b15_afd","b26_afd","b98_afd"}
vector<string> usersC = {"c94_afd","c92_afd","c99_afd"}
我想检查字符a后面的数字是否存在于其他向量中。 例如:usersA索引0,是a15_254,我想检查15中是否存在其他向量usersB或usersC。
同样,我必须检查b和c之后的数字是否存在于其他向量中。 到目前为止我做了什么。将数字存储到特定的向量
vector<string> usersANumber; // it has the numbers of usersA {"15","19","20"}
vector<string> usersBNumber; // it has the numbers of usersB {"15","26","98"}
vector<string> usersCNumber; // it has the numbers of usersC {"94","92","99"}
我有三个for循环 第一个循环我检查其他两个向量中是否有usersANumber的数量, 第二个循环我检查另外两个向量中是否有usersBNumber的数量, 第三个循环我检查另外两个向量中是否存在usersCumber的数量
我发现这效率不高。有没有其他方法可以做到这一点
答案 0 :(得分:0)
将数字存储到新的向量后,您只需要对这些向量进行排序,然后使用二进制搜索算法搜索重复的项目:
vector<string> usersA = { "15", "19", "20" };
vector<string> usersB = { "15", "26", "98" };
vector<string> usersC = { "94", "92", "99" };
sort(usersA.begin(), usersA.end());
sort(usersB.begin(), usersB.end());
sort(usersC.begin(), usersC.end());
searchForDuplicateItems(usersA, usersB);
searchForDuplicateItems(usersA, usersC);
searchForDuplicateItems(usersB, usersC);
请注意,您只需要比较一次矢量,即在浏览了矢量 usersA 的所有项目后检查它们是否存在于矢量 usersB 中,没有必要浏览向量 usersB 的所有项目,检查它们是否存在于向量 usersA 中。
searchForDuplicateItems 函数实现如下所示:
void searchForDuplicateItems(vector<string> &v1, vector<string> &v2)
{
for (int i = 0; i < v1.size(); i++)
{
if (vectorContainsItem(v2, v1[i]))
{
// duplicate item found
}
}
}
这里是 vectorContainsItem 函数的实现,它在内部使用二进制搜索算法来提高效率:
bool vectorContainsItem(vector<string> &v, string &item)
{
int left = 0;
int right = (int) v.size() - 1;
int mid = (right + left) / 2;
while (left <= right)
{
mid = (right + left) / 2;
if (v[mid].compare(item) == 0)
return true;
else if (v[mid].compare(item) < 0)
left = mid + 1;
else if (v[mid].compare(item) > 0)
right = mid - 1;
}
return false;
}