n 个向量的交集

2023-12-08

我是编程新手,最近遇到了一个问题,即查找已排序整数的 n 个向量(整数向量)的交集。我想出的方法的复杂度为 O(n^2),并且我正在使用 std::set_intersect 函数。

我想出的方法是使用两个向量:第一个向量对应于我拥有的第一个向量,第二个向量对应于第二个向量。我对两个向量调用设置交集并覆盖第一个向量,然后对第二个向量使用向量清除函数。然后,我将下一个向量覆盖为第二个向量,并重复该过程,最终返回第一个向量。

我确实相信有一种更有效的方法来解决这个问题,但目前我想不出更有效的方法。任何有关这个问题的帮助将不胜感激。


幸运的是,我认为可以对 算法的复杂性。

复杂度std::set_intersection在大小为 n1 和 n2 的输入集上是 O(n1 + n2)。 您可以采用原始向量并以单淘汰法将它们相交 锦标赛风格,即在第一轮中,第一轮和第二轮相交 向量,第3个和第4个,第5个和第6个,依此类推;在 第二轮你与第一个和第二个交叉点相交,第三个和第四个交叉点, 等等;重复直到最后一轮仅产生一个交叉点。 每轮幸存的所有向量的大小总和不超过 本轮开始时向量大小总和的一半, 所以这个算法总共需要 O(N) 时间(也是 O(N) 空间) 其中 N 是输入中所有原始向量大小的总和。 (这是 O(N),因为 N + N/2 + N/4 + ...

因此,给定一个由已排序向量组成的输入, 算法的复杂度为O(N)。

你的算法以非常不同的顺序合并向量, 虽然我不能 100% 确定它也是 O(N),但我强烈怀疑它是 O(N)。


Edit:关于如何在 C++ 中实际实现“锦标赛”算法, 这取决于你想多努力地优化它, 以及您输入的性质。

最简单的方法是创建一个新的向量列表;从旧列表中取出两个向量,将一个向量推入新列表,将两个旧向量合并到新向量上,销毁旧向量,希望库能够有效地管理内存。

如果你想减少新向量的分配,那么重新使用向量 (正如您已经想到的那样)可能会有所帮助。如果输入数据结构是 一个std::list<std::vector<int> >例如,您可以首先将一个空向量推到该列表的前面。创建三个迭代器,一个迭代器指向新向量,一个迭代器指向列表中原始的前两个向量。 取最后两个迭代器处向量的交集, 将结果写入第一个迭代器,然后清除第一个迭代器处的向量 最后两个迭代器。将最后两个迭代器各向前移动两位, 将第一个迭代器向前移动一个位置。重复。如果你达到这样的状态 最后两个迭代器之一已到达 end() 但另一个尚未到达, 删除第一个迭代器和另一个迭代器之间的所有列表元素。 现在你又得到了一个向量列表,并且只要有就可以重复 列表中存在多个向量。

如果输入是std::vector<std::vector<int> >然后推入一个元素 放在列表前面的价格相对昂贵,因此您可能想要一个 算法稍微复杂一些。有很多选择,其实没有 我能想到的明显的赢家。

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

n 个向量的交集 的相关文章

随机推荐

  • 如何在 Google Drive 上创建文件夹错误代码 17 [分辨率已被用户取消]

    我想将文件夹名称传递给我的函数并在我登录的谷歌帐户上创建该文件夹 有我的登录选项 mGoogleSignInOptions new GoogleSignInOptions Builder GoogleSignInOptions DEFAUL
  • 在 VBA 中如何使用字符串来引用变量?

    我有一个变量strFunction 然后我还有另一个字符串strName strFunction 我想知道的是如何使用 strName 获取 strFunction 的值 例如 像 getValue strName 这样的东西给我 strF
  • 基础 R 中的动态变量

    如何在 R 中创建因变量 例如 a lt 1 b lt a 2 a lt 2 b 1 2 但我期望结果4 R如何自动维护关系 非常感谢说明 我正在尝试创建带有单元格之间的关系 公式或函数 的 Excel 电子表格 例如 R 的输入是 csv
  • 获取通用枚举的描述属性

    我在尝试通用枚举方面遇到了一些困难 我读到事情没那么简单 我似乎找不到解决方案 我正在尝试创建一个通用函数 对于枚举类型将返回每个枚举值的描述 我想保持它的通用性 而不是为每个枚举类型重复这个方法 这是我到目前为止所拥有的 public s
  • 使用 SQL*Loader 控制文件将日期从一种格式转换为另一种格式

    infile 中的数据格式为MM DD YYYY我如何告诉控制文件将其加载到数据库中YYYYMM 当您在 INFILE 声明中指定列时 仅标识数据保存的格式 就像这样 load data infile whatever csv into t
  • 找不到入口模块:错误:无法解析“./src”

    我正在遵循使用 webpack 和 babel 设置 React 的教程 但出现错误 我尝试重新安装所有模块 但没有成功 我也匹配了我的配置代码仍然没有运气 电子邮件受保护 创建 C Users Gaurav Thakur Desktop
  • 在 Titan 中使用 order().by() 时索引不起作用

    泰坦文档说 混合索引支持原生且高效的排序 但是 order by 方法中使用的属性键必须事先添加到混合索引中 以支持本机结果排序 这在 order by 键与查询键不同的情况下很重要 如果属性键不是索引的一部分 则排序需要将所有结果加载到内
  • 从右侧将文本拆分为不同的列

    我在 Excel 的一个单元格中有一串字母数字文本 使用 v2016 文本类似于 ECN 6120 012 MMR 12195 201481 我使用了 搜索 查找 和 修剪 的变体将第一组 第二组 第三组和最后一组文本放入各个单元格中 我需
  • 任何 NFC 应用程序均未检测到 NFC B 型卡(例如:nfc taginfo)

    我正在开发 NEXSUS S 4 0 4 需要读取 typeB ISO 14443 卡的数据并显示卡上存储的一些信息 但是我的卡没有在我的应用程序或从 android market 下载的任何其他应用程序上检测到 例如 来自 NXP 的 N
  • 具有本地输入的 Python atof

    比如说 我有一个 德语 表达式 内容为10 401 40 in Mio EUR 我想在 Python 中将其转换为真正的浮点数 在本例中约为 100 亿 这是我到目前为止所拥有的 import re locale from locale i
  • 我是否应该使用 AutoFixture 来测试我的 Onion 的核心元素(它没有依赖项)?

    这个问题是我之前的问题的延续 如何使用OneTimeSetup 特别是其中一位回答者的回答 请看下面的代码 TestFixture public class MyFixture IProduct Product OneTimeSetUp p
  • 是否可以声明一个接受超类实例数组并返回最具体的子类类型的函数

    我正在为我的 Javascript 包编写 Typescript 声明文件 我的库有一个函数 它接受超类元素数组并返回超类 function x args SuperClass SuperClass 我想修改该方法的返回类型 以便它返回最具
  • SQLDependency 缓存不起作用

    我正在尝试使用SQLDependency Caching与我的查询通知ASP NET应用 我跟着设置 SQLDependency 缓存的步骤 我能够设置db成功地 但是 当我运行我的应用程序时 我收到以下错误 Cannot find the
  • 有没有办法使用泛型将 Maybe 构造函数应用于记录的每个字段?

    我有两种数据类型 第二个是第一个数据类型的副本 但每个字段上都有 Maybe data A a Int b String data B c Maybe Int d Maybe String 有没有办法制作一个函数 f A gt B g B
  • 如何用另一个视图的内容掩盖一个视图的图层?

    我有一个 UIImageView 和一个 UILabel 并且希望 UILabel 的内容掩盖 UIImageView 目标是文本与图像内容可见 但其他所有内容都是透明的 有没有一种简单的方法可以通过另一个视图的内容来掩盖一个视图 您可以使
  • 将信息从服务传递到活动(或片段)的最佳实践

    我正在运行一个Socket IO客户在我的Android应用程序 我在传递数据时遇到问题Service 处理套接字的连接 到其中之一Fragments 在我的一个Activities 我打开一个包含个人资料页面的片段 当配置文件片段打开时
  • 如何获取可用视频捕获设备的列表

    我正在使用 DirectShow Net 创建一个项目 该项目使用 Visual C 在 Windows 窗体中显示网络摄像头视图的预览 我想首先获取可用视频设备的集合 以便我可以在内置网络摄像头或 USB 网络摄像头之间进行选择 我见过几
  • Scala 模板设置变量

    我是 Scala 新手 Play 2 框架中的 Scala 模板 我想要执行以下操作 传递参数 isEdit 并根据此参数定义一个值 伪代码 variable myTitle if isEdit myTitle edit question
  • 将 DataFrame 拆分为多列组的字典

    我有一个像这样的数据框 df pd DataFrame Client A B C D E Revenue 100 120 50 40 30 FYoQ FY Q Q Q FY Quarter np nan 1 3 4 np nan Year
  • n 个向量的交集

    我是编程新手 最近遇到了一个问题 即查找已排序整数的 n 个向量 整数向量 的交集 我想出的方法的复杂度为 O n 2 并且我正在使用 std set intersect 函数 我想出的方法是使用两个向量 第一个向量对应于我拥有的第一个向量