【问题标题】:Vector intersection in C++C++中的向量交集
【发布时间】:2013-10-29 07:18:09
【问题描述】:

我有这个功能

vector<string> instersection(const vector<string> &v1, const vector<string> &v2);

我有两个字符串向量,我想找到两者中都存在的字符串,然后用公共元素填充第三个向量。

如果我的向量是...

v1 = <"a","b","c">
v2 = <"b","c">

【问题讨论】:

  • sort() 向量,然后使用单个 for 循环同时浏览两个向量,始终推进较小的向量。然后只收集共同的元素。
  • for 循环遍历一个向量,并在其中通过另一个向量执行 for

标签: c++ vector intersection


【解决方案1】:

试试std::set_intersection,例如:

#include <algorithm> //std::sort
#include <iostream> //std::cout
#include <string> //std::string
#include <vector> //std::vector

std::vector<std::string> intersection(std::vector<std::string> &v1,
                                      std::vector<std::string> &v2){
    std::vector<std::string> v3;

    std::sort(v1.begin(), v1.end());
    std::sort(v2.begin(), v2.end());

    std::set_intersection(v1.begin(),v1.end(),
                          v2.begin(),v2.end(),
                          back_inserter(v3));
    return v3;
}

int main(){
    std::vector<std::string> v1 {"a","b","c"};
    std::vector<std::string> v2 {"b","c"};

    auto v3 = intersection(v1, v2);

    for(std::string n : v3)
        std::cout << n << ' ';
}

【讨论】:

  • 这会改变 v1v2,OP 有 const vector&lt;string&gt; &amp;。在这里按价值取值可能更可取
  • @Caleth:我同意,但我只是展示了一个示例,功能取决于最终程序员。
  • 这是 O(n log n),其中 n 是两个大小的最大值。为什么不直接创建一个由其中一个向量的条目组成的哈希集,然后线性地通过另一个向量检查它们呢?那是 O(n + m) 时间,O(m) 内存。我可以看到我提出的解决方案除了使用更多内存之外,对缓存的友好性也较低。
  • 我认为 OP 没有说向量是排序的。
【解决方案2】:

您只需要对较小的向量进行排序。然后对较大的向量进行一次遍历,并使用二分搜索测试其项是否存在于较小的向量中。

【讨论】:

    【解决方案3】:

    按照here 的建议,考虑用内存换取时间,方法是从较小的向量中创建一个哈希集,然后在较大的向量上循环检查这些元素,而不是排序。这将比排序和使用std::set_intersection 更快。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-12
      • 2015-07-20
      • 1970-01-01
      • 1970-01-01
      • 2015-08-06
      • 1970-01-01
      • 1970-01-01
      • 2021-12-21
      相关资源
      最近更新 更多