多个已排序数组的交集

2024-03-26

From this https://stackoverflow.com/questions/2400157/the-intersection-of-two-sorted-arrays,我们知道解决两个排序数组的交集的方法。那么如何获取多个已排序数组的交集呢?

根据两个排序数组的答案,我们可以将其应用于多个数组。这是代码

vector<int> intersectionVector(vector<vector<int> > vectors){
    int vec_num = vectors.size();

    vector<int> vec_pos(vec_num);// hold the current position for every vector
    vector<int> inter_vec; // collection of intersection elements

    while (true){
        int max_val = INT_MIN;
        for (int index = 0; index < vec_num; ++index){
            // reach the end of one array, return the intersection collection
            if (vec_pos[index] == vectors[index].size()){
                return inter_vec;
            }

            max_val = max(max_val, vectors[index].at(vec_pos[index]));
        }

        bool bsame = true;
        for (int index = 0; index < vec_num; ++index){
            while (vectors[index].at(vec_pos[index]) < max_val){
                vec_pos[index]++; // advance the position of vector, once less than max value
                bsame = false;
            }
        }

        // find same element in all vectors
        if (bsame){
            inter_vec.push_back(vectors[0].at(vec_pos[0]));

            // advance the position of all vectors
            for (int index = 0; index < vec_num; ++index){
                vec_pos[index]++;
            }
        }
    }
}

有没有更好的方法来解决呢?

Update1

从这两个话题1 https://stackoverflow.com/questions/497338/efficient-list-intersection-algorithm and 2 https://stackoverflow.com/questions/4642172/computing-set-intersection-in-linear-time,看来Hash set是更有效的方法。

Update2

为了提高性能,也许min-heap可以用来代替vec_pos在我上面的代码中。和变量max_val保存所有向量的当前最大值。所以只需将根值与max_val,如果相同,则可以将该元素放入交集列表中。


要获得两个排序范围的交集,std::set_intersection http://en.cppreference.com/w/cpp/algorithm/set_intersection可以使用:

std::vector<int> intersection (const std::vector<std::vector<int>> &vecs) {

    auto last_intersection = vecs[0];
    std::vector<int> curr_intersection;

    for (std::size_t i = 1; i < vecs.size(); ++i) {
        std::set_intersection(last_intersection.begin(), last_intersection.end(),
            vecs[i].begin(), vecs[i].end(),
            std::back_inserter(curr_intersection));
        std::swap(last_intersection, curr_intersection);
        curr_intersection.clear();
    }
    return last_intersection;
}

这看起来比您的解决方案干净得多,您的解决方案太混乱而无法检查正确性。 它还具有最佳的复杂性。

标准库算法set_intersection可以以任何使用的方式实现

最多 2·(N1+N2-1) 次比较,其中 N1 = std::distance(first1, last1) 且 N2 = std::distance(first2, last2)。

first1等等是定义输入范围的迭代器。如果标准库是开源的(例如 libstd++ 或 libc++),您可以在其源代码中查看实际实现。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多个已排序数组的交集 的相关文章

  • PHP 中只保留数组的前 N ​​个元素? [复制]

    这个问题在这里已经有答案了 有没有办法只保留数组的前 N 个 例如 10 个 元素 我知道有array pop 但是有没有更好 更优雅的方法呢 您可以使用array slice http php net array slice or arr
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • 复制目录内容

    我想将目录 tmp1 的内容复制到另一个目录 tmp2 tmp1 可能包含文件和其他目录 我想使用C C 复制tmp1的内容 包括模式 如果 tmp1 包含目录树 我想递归复制它们 最简单的解决方案是什么 我找到了一个解决方案来打开目录并读
  • 如何创建包含 IPv4 地址的文本框? [复制]

    这个问题在这里已经有答案了 如何制作一个这样的文本框 我想所有的用户都见过这个并且知道它的功能 您可以使用带有 Mask 的 MaskedTestBox000 000 000 000 欲了解更多信息 请参阅文档 http msdn micr
  • 获取两个工作日之间的天数差异

    这听起来很简单 但我不明白其中的意义 那么获取两次之间的天数的最简单方法是什么DayOfWeeks当第一个是起点时 如果下一个工作日较早 则应考虑在下周 The DayOfWeek 枚举 http 20 20 5B1 5D 3a 20htt
  • java.io.Serialized 在 C/C++ 中的等价物是什么?

    C C 的等价物是什么java io Serialized https docs oracle com javase 7 docs api java io Serializable html 有对序列化库的引用 用 C 序列化数据结构 ht
  • 如何使用 LINQ2SQL 连接两个不同上下文的表?

    我的应用程序中有 2 个数据上下文 不同的数据库 并且需要能够通过上下文 B 中的表的右连接来查询上下文 A 中的表 我该如何在 LINQ2SQL 中执行此操作 Why 我们正在使用 SaaS 产品来跟踪我们的时间 项目等 并希望向该产品发
  • 在 Visual Studio 2010 中从 Fortran 调用 C++ 函数

    我想从 Fortran 调用 C 函数 为此 我在 Visual Studio 2010 中创建了一个 FORTRAN 项目 之后 我将一个 Cpp 项目添加到该 FORTRAN 项目中 当我要构建程序时出现以下错误 Error 1 unr
  • 在一个平台上,对于所有数据类型,所有数据指针的大小是否相同? [复制]

    这个问题在这里已经有答案了 Are char int long 甚至long long 大小相同 在给定平台上 不能保证它们的大小相同 尽管在我有使用经验的平台上它们通常是相同的 C 2011 在线草稿 http www open std
  • 我可以使用 moq Mock 来模拟类而不是接口吗?

    正在经历https github com Moq moq4 wiki Quickstart https github com Moq moq4 wiki Quickstart 我看到它 Mock 一个接口 我的遗留代码中有一个没有接口的类
  • DbContext 和 ObjectContext 有什么区别

    From MSDN 表示工作单元和存储库模式的组合 使您能够查询数据库并将更改分组在一起 然后将这些更改作为一个单元写回存储 DbContext在概念上类似于ObjectContext 我虽然DbContext只处理与数据库的连接以及针对数
  • CMake 无法确定目标的链接器语言

    首先 我查看了this https stackoverflow com questions 11801186 cmake unable to determine linker language with c发帖并找不到解决我的问题的方法 我
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch
  • Cmake 链接共享库:包含库中的头文件时“没有这样的文件或目录”

    我正在学习使用 CMake 构建库 构建库的代码结构如下 include Test hpp ITest hpp interface src Test cpp ITest cpp 在 CMakeLists txt 中 我用来构建库的句子是 f
  • 方法优化 - C#

    我开发了一种方法 允许我通过参数传入表 字符串 列数组 字符串 和值数组 对象 然后使用这些参数创建参数化查询 虽然它工作得很好 但代码的长度以及多个 for 循环散发出一种代码味道 特别是我觉得我用来在列和值之间插入逗号的方法可以用不同的
  • 如何部署“SQL Server Express + EF”应用程序

    这是我第一次部署使用 SQL Server Express 数据库的应用程序 我首先使用实体 框架模型来联系数据库 我使用 Install Shield 创建了一个安装向导来安装应用程序 这些是我在目标计算机中安装应用程序所执行的步骤 安装
  • System.IO.FileNotFoundException:找不到网络路径。在 Windows 7 上使用 DirectoryEntry 对象时出现异常

    我正在尝试使用 DirectoryEntry 对象连接到远程 Windows 7 计算机 这是我的代码 DirectoryEntry obDirEntry new DirectoryEntry WinNT hostName hostName
  • 无法接收 UDP Windows RT

    我正在为 Windows 8 RT 编写一个 Windows Store Metro Modern RT 应用程序 需要在端口 49030 上接收 UDP 数据包 但我似乎无法接收任何数据包 我已按照使用教程进行操作DatagramSock
  • Oracle Data Provider for .NET 不支持 Oracle 19.0.48.0.0

    我们刚刚升级到 Oracle 19c 19 3 0 所有应用程序都停止工作并出现以下错误消息 Oracle Data Provider for NET 不支持 Oracle 19 0 48 0 0 我将 Oracle ManagedData
  • 当从finally中抛出异常时,Catch块不会被评估

    出现这个问题的原因是之前在 NET 4 0 中运行的代码在 NET 4 5 中因未处理的异常而失败 部分原因是 try finallys 如果您想了解详细信息 请阅读更多内容微软连接 https connect microsoft com

随机推荐

  • MVVM ViewModel 是否应该执行类型转换/验证?

    我们刚刚开始了解 WPF 中的 MVVM 我们已经使用我们在视图中绑定的 强类型 属性 int double 等 实现了 ViewModel 大多数情况下类型转换工作正常 因此输入数据非常简单 但我们在验证方面遇到了问题 例如 如果在绑定到
  • boost::asio::async_resolve 问题

    我正在构造一个使用的 Socket 类boost asio 首先 我做了一个connect获取主机和端口并将其解析为 IP 地址的方法 这很有效 所以我决定看看async resolve 但是 我的回调总是收到错误代码995 使用与同步工作
  • 没有await的using语句中的async,这安全吗?

    如果在 using 语句中进行异步调用 并且调用的结果是异步处理的 即 发生这种情况的方法是异步的 并且在加载和处理结果之前返回 那么 using 语句是否会超出范围 换句话说 做这样的事情是否安全 async void LoadAndPr
  • C# 运行时提升应用程序权限

    我已经尝试了 Stackoverflow com 中描述的所有可能的解决方案 但我无法使应用程序以管理员身份运行或提示管理员权限 I tried 使用 runAs requireAdministrator 创建清单 手动设置 verb ru
  • Magento,自定义产品列表

    我根据Mage Catalog Block Product List制作了自己的产品列表页面 应用程序 代码 本地 法师 目录 块 产品 Special php class Mage Catalog Block Product Specia
  • rubyonrails 更新到 gem 1.8.1 时出错

    我将gem更新到最新的1 8 1 现在当我使用rails命令时 我收到如下错误 NOTE Gem Specification default executable is deprecated with no replacement It w
  • 艺术::ConditionVariable::WaitHoldingLocks(艺术::线程*)

    我们的移动应用程序已发布在 Google Play 商店中 崩溃和 ANR 报告在 Firebase Crashlytics 中生成 出现如下所示的ANR 0 libc so 系统调用 28 1 libart so 艺术 Condition
  • SolrNET - 从 Nuget 拉取时无法加载文件或程序集“HttpWebAdapters”

    我正在使用 Nuget 在 ASP NET MVC 项目中获取最新版本的 SolrNET 和 StructureMap SolrNetIntegration x IncludeRegistry new SolrNetRegistry Sol
  • 如何以编程方式缩放 UIScrollView?

    我想以基类不支持的方式缩放和取消缩放 例如 在收到双击时 在玩过东西并使其正常工作后 我正在回答我自己的问题 Apple 在其有关如何处理双击的文档中提供了一个非常简单的示例 进行编程缩放的基本方法是您自己执行此操作 然后告诉 UIScro
  • 按 IN 运算符中指定的特定顺序选择 ID

    我想尝试以特定顺序选择一组特定的数字 以便与循环一起使用 SELECT ID FROM filter WHERE id in 87 97 117 52 240 76 141 137 157 255 186 196 133 175 153 2
  • 如何清除 Angular Reactive Forms 中的 FormArray

    我正在重置表单 它重置整个表单 但 FormArray 除外 创建表单并在其中声明 formArray createForm this invoiceForm this formBuilder group name Validators r
  • 未使用 setImageURI() 在 ImageView 中设置图像

    创建自己的相机 因为我需要对焦来拍照 相机工作正常 正如预期的那样 通过URI活动之间 I ve ImageView in Next Screen which i used to set the Image with imgView set
  • python 3 中随机游走的奇怪结果?

    我刚刚开始学习 python 并且在打印 3 维随机游走的新位置时遇到问题 没有弹出错误 但是很明显打印的输出 x y z 是不合理的 当逐步模拟随机游走时 我假设每次只应更改 x y z 中的一个值 但输出中似乎没有 我正在尝试调试它 但
  • 如何在 WPF 中对 DataGrid 列标题进行分组

    是否可以在 WPF 数据网格中执行此操作 A header B Header A1Header A2Header B1Header B2Header A1Data A2 Data B1 Data B2 Data A1Data A2 Data
  • 如何在 Eclipse 中使用 Antlr4 Ide 查看实时解析树?

    我是 Antlr4 的新手 但我知道 Eclipse 存在一个插件 我有一个简单的问题 创建 g4 文件后 如何可视化实时解析树以便查看输入表达式的树 谢谢 在 Eclipse 中安装 Antlr4Ide 插件后 窗口 gt 显示视图 gt
  • 从 Fiori 列表报告导航到标准应用程序(例如热点)?

    我已经根据之前创建的 CDS 视图创建了列表报告 Fiori 应用程序 是否有可能在现有和 或附加 CDS 视图中使用一些注释来创建供应商编号上的热点智能字段 IE 当我点击它时 它会将我导航到该供应商的标准 业务合作伙伴 应用程序 如果这
  • 代码优先迁移过程:我缺少哪一部分?

    我的步骤 1 使用查询在 SSMS 中创建我的数据库 Execute in SQL Server Management Studio prior to building data model s CREATE DATABASE snaked
  • Accumulo、zookeeper hadoop CENTOS 6 的安装说明、下载和版本

    我希望获得有关 Accumulo zookeeper hadoop 安装说明 下载和 CENTOS 6 版本的指导 Thanks Chris 您可以通过cloudera manager版本5进行安装 我最近使用相同的方式安装了accumul
  • GDB - 如何打破“有些东西被写入cout”?

    我想设置一个断点 每次写入内容时都会触发stdout通过cout流 但我无法找到该断点的可能位置 我怎样才能在 gdb 中做到这一点 这是一种依赖于平台的方式 如果您在 x86 64 上并使用 gcc 进行构建 则写入 std cout 会
  • 多个已排序数组的交集

    From this https stackoverflow com questions 2400157 the intersection of two sorted arrays 我们知道解决两个排序数组的交集的方法 那么如何获取多个已排序