C++ 集合覆盖问题2025 年 2 月 11 日 | 3 分钟阅读 引言集合覆盖问题 是计算机科学和优化领域中的一个经典问题,属于 NP-hard 问题范畴。它是一个组合优化问题,目标是找到给定的一组集合(或宇宙)的最小子集,使得宇宙中的每个元素至少被所选子集中的一个集合覆盖。 程序输出 Minimum number of subsets required: 2 说明
集合覆盖问题涉及从给定集合中选择最小子集,以便宇宙中的每个元素至少被所选子集中的一个集合覆盖。例如,如果你的宇宙元素为 {1, 2, 3, 4, 5},子集为 {{1, 2, 3}, {2, 4}, {3, 5}, {1, 4, 5}},目标是找到覆盖宇宙中所有元素所需的最少子集数量。
所实现的算法采用贪婪方法。它迭代选择覆盖当前未覆盖元素数量最多的子集,直到所有元素都被覆盖。
vector<unordered_set<int>> subsets:此向量存储子集,其中每个子集表示为整数的无序集合。无序集合用于高效的成员检查。 unordered_set<int> universe:此无序集合表示需要被所选子集覆盖的元素宇宙。
int setCover(const vector<unordered_set<int>>& subsets, const unordered_set<int>& universe):此函数接受子集和宇宙作为输入,并返回覆盖宇宙所需的最少子集数量。 unordered_set<int> elementsCovered:此集合跟踪目前已覆盖的元素。 vector<int> selectedSets:此向量存储所选子集的索引。
算法迭代直到宇宙中的所有元素都被覆盖。 在每次迭代中,它评估每个子集,以找到覆盖当前未覆盖元素数量最多的子集。 它选择此子集并将其索引添加到 selectedSets 中。 然后将覆盖的元素添加到 elementsCovered 中。
覆盖宇宙中的所有元素后,函数返回 selected 的大小,这表示覆盖宇宙所需的最少子集数量。
在 main() 函数中,定义了一个示例子集和宇宙。 使用这些输入调用 setCover() 函数,并打印结果(所需的最少子集数量)。 复杂度分析时间复杂度 所实现算法的时间复杂度取决于宇宙的大小和子集的数量。
空间复杂度 算法的空间复杂度主要取决于子集、宇宙元素、已覆盖元素和所选集合的存储。
|
在本文中,我们将通过不同的例子讨论 C++ 中的波动数。什么是波动数?“波动数”是指数字交替递增和递减的整数。例如,数字 131 在递增、递减和递增的序列中交替,这使其成为波动数……
5 分钟阅读
简介:Sleep Sort 算法是一种非传统且富有创意的排序数字的方法,它依赖于系统计时来间接实现所需的顺序。Sleep Sort 的基本思想是,较大的数字可以“睡眠”或延迟更长的时间...
阅读 10 分钟
在开发 Web 应用程序时,在本地测试 API 端点是确保功能和调试的常用做法。Postman 等工具通过允许开发人员向托管在 localhost 上的 API 端点发送 HTTP 请求来促进此过程。localhost API 请求是那些发送到本地主机端点的请求...
阅读 16 分钟
在本文中,我们将讨论 C++ 中的 Enneacontahexagon 数及其特性、公式和示例。Enneacontahexagon 数 96 边形(称为 Enneacontahexagon)由一类独特的图形整数表示,称为 Enneacontahexagon 整数。这些数字代表一种模式,其中每个连续……
阅读 4 分钟
在本文中,我们将讨论如何在 C++ 中最小化数组之间对应索引处不相等元素的数量。引言 在 C++ 编程中,我们处理一个适用于许多不同场景的主题,从竞争性编程到需要关键数据对齐和减少的现实世界情况...
7 分钟阅读
CSV 文件格式,即“逗号分隔值”,通常用于存储和交换已使用的表格数据。CSV 文件中的数据以纯文本形式组织成行和列。CSV 文件由组织成行和列的纯文本数据组成。每行代表一个...
阅读 4 分钟
Jump Pointer 算法是一种先进的方法,用于优化树结构中的祖先查询。该算法提高了查找两个节点最低公共祖先 (LCA) 等操作的效率。通过预处理树,它为每个节点分配一组“跳转...
18 分钟阅读
引言 在黄金比例之后,Wythoff 序列是组合博弈论中用于玩家移动的数学组合。它以 Willem Abraham Wythoff 的名字命名,他根据具有与黄金分割的奇特关系的斐波那契数列创建了一个序列。在这个...
阅读 15 分钟
揭示凸包算法的优雅:全面探索 凸包算法是计算几何领域的支柱,为解决一个基本问题提供了高效的解决方案:找到包含平面上给定点集的最小凸多边形。这个问题...
18 分钟阅读
在本文中,我们讨论了 . 旋转向量包括循环移动每个元素,向左或向右。在此,我们重点介绍右旋转,它将元素移动到更高的索引,并将最后一个元素循环到第一个...
阅读 6 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India