c++ - 检查元素是否在两个 vector 中的最快方法

标签 c++ algorithm vector

所以,假设我们有两个 vector ,vec1 和 vec2。仅对两个 vector 中的元素执行某些操作的最快方法是什么。 到目前为止,我已经做到了。简单地说,我们如何才能更快地实现这一目标,或者有什么办法:

vector<Test*> vec1;
vector<Test*> vec2;

//Fill both of the vectors, with vec1 containing all existing 
//objects of Test, and vec2 containing some of them.


for (Test* test : vec1){

    //Check if test is in vec2
    if (std::find(vec2.begin(), vec2.end(), test) != vec2.end){

        //Do some stuff

    }

}

最佳答案

您的方法是 O(M*N),因为它调用 std::findvec2 的每个元素的元素数量成线性 vec1。您可以通过多种方式改进它:

  • 排序 vec2 可以让您将时间减少到 O((N+M)*Log M) - 即您可以在范围 上使用二进制搜索vec2.begin(), vec2.end()
  • 对两个 vector 进行排序可以让您在 O(NLog N + MLog M) 中搜索 - 您可以使用类似于合并排序范围的算法来查找匹配对在线性时间内
  • vec2 元素使用散列集可以让您将时间减少到 O(N+M) - 现在集的构造时间和在它是线性的。

关于c++ - 检查元素是否在两个 vector 中的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28115651/

相关文章:

c++ - 在 C++(或 C++11)中是否有与 C# 中的 @ 等价的东西?

c++ - Dynamic#include 基于宏定义

php - 为什么 02000 被评估为 1024

C++使用命令行输入txt文件但无法打开文件

arrays - 你如何计算算法的大O

c++ - std::vector 的这种读取是如何工作的?

python - 将循环输出中的所有数字相乘

algorithm - 找到所有叶子节点都为真的分支

r - 分配由概率分布通知的特定数量的值(在 R 中)

c++ - std::vector 中的 erase() 是线性时间操作吗?