C++ 幂集算法2024 年 8 月 28 日 | 阅读 6 分钟 幂集是所有子集的集合,包括空集和原始集。可以使用递归方法或涉及位操作的迭代方法来构建一个集合的幂集。集合是一组独特的元素。空集是没有元素的集合;幂集是给定集合所有可能子集的集合。 理解问题我们得到一个包含 'N' 个元素的数组,具体为 [a, b, c]。我们需要为这个数组创建一个幂集,其中幂集的每个子集都按升序排序。必须返回子集数组。每个子集的成员应按升序排列。子集在答案数组中的顺序无关紧要。 示例:[a, b, c] 假设我们从集合 [a, b, c] 开始。该集合的不同子集如下: [ ] [a] [b] [a, b] [c] [a, c] [b, c] [a, b, c] 现在,幂集就是所有这些子集的集合。 [ [], [a], [b], [a, b], [c], [a, c], [b, c], [a, b, c] ] 方法 1:暴力枚举法我们将从空子集开始,并以 'N' 步遍历它们,其中 'N' 是初始数组大小 [a, b, c]。每一步我们都有两种可能性:包含 或 排除 当前选定的元素。 让我们使用一个例子来演示这种方法,其中 'N' 设置为 3,输入数组的内容为 [a, b, c]。
如果我们想生成幂集,此方法仔细检查在数组 [a, b, c] 中包含和排除每个元素(a、b 和 c)的所有可能排列。每一步都有效地使幂集中的子集总数加倍,从而产生所有可能子集的完整集合。 示例我们来看一个例子来说明 C++ 中的幂集算法。 输入 输出 a b a b c a c b c a b c 复杂度 时间复杂度 O(N * (2^N)),其中 'N' 是数组 'ARRAY' 的元素数量。 外层循环迭代 'N' 次,对于外层循环的每次迭代 'i',内层循环迭代 2^i 次,在该范围内,我们在每个子集末尾复制长度至多为 N 的列表。 因此,总时间复杂度为 N * (20 + 21 + ... + 2N-2 + 2N-1) = O(N * 2N)。 空间复杂度: O(1)。 不需要额外的空间。 方法 2:递归方法我们将编写一个递归函数 (solve) 来在此策略中生成子集。 将向递归函数提供以下四个参数:
每一步我们都有两个选项:将元素添加到选定的子集。此外,如果当前选定元素的索引大于或等于给定数组的大小,则递归函数将终止。 终止条件 如果 IDX >= ANSWER.size(),则将 'CURRENT' 推入 'ANSWER' 并返回。 递归调用
现在,让我们研究算法的源代码。 文件名:Power_set.c 输入 输出 3 2 2 3 1 1 3 1 2 1 2 3 复杂度 时间复杂度 O(2^N),其中 'N' 是数组 'ARR' 的长度。 与递归函数一样,我们在每个阶段进行两次调用,共进行 2^N 次调用。因此,总时间复杂度为 O(2^N)。 空间复杂度 O(N),其中 'N' 是数组的大小,'ARRAY' 是数组的长度。 在最坏的情况下,递归树的深度将为 'N'。因此,递归调用堆栈的总空间复杂度为 O(N)。 方法 3:位掩码方法我们可以使用位来指示关联元素是否是当前子集的一部分,因为它可能是 0 或 1。因此,每个位模式都代表整个集合的一个子集。通过这种方式,我们可以获取所有子集,而无需占用任何额外的空间。 假设我们有 'ARRAY' 数组。 假设我们的响应是 'ANSWER' = [[]]。 迭代 0 <= I <= 2^N 次并执行以下操作:
文件名:Powerset3.cpp 输入 输出 1 2 1 2 3 1 3 2 3 1 2 3 下一个主题C++ 中检测到栈溢出 |
一个简单的控制台应用程序或一个名为 C 语言吃豆人游戏的快速剪辑游戏是为了娱乐而制作的。与贪吃蛇游戏类似,吃豆人需要移动,使其沿着预定义的蓝色路径移动,然后它被吃豆人擦除或吃掉。...
阅读 23 分钟
在 C 和 C++ 中,字符算术涉及使用字符和符号的算术运算。尽管字符通常用于文本,但它们的底层就像数字一样。这意味着有有趣的方式来处理字符以及添加和减去它们。在这篇文章中...
阅读 3 分钟
C++ 是一种强大而通用的编程语言。它支持广泛的编程范式,包括并发。并发是指程序中同时执行多个执行线程的能力。它能提高性能和响应能力,尤其是在涉及 I/O 绑定或……的应用程序中。
阅读 6 分钟
插值搜索是一种算法,用于在排序数组中有效地搜索目标值。与总是检查搜索区间中间元素的二分搜索相反,插值搜索根据...的值更明智地估计目标的位置。
18 分钟阅读
哈希表链式处理到底是什么?链式处理是一种哈希表冲突避免技术。当哈希表中的两个键被哈希到同一个索引时,就会发生冲突。冲突是一个问题,因为哈希表中的每个槽都应该只包含一个元素。...
阅读9分钟
在组合数学和计算机科学中,稳定婚姻问题是一个著名的谜题。它涉及在两组元素(例如男性和女性)之间建立稳定匹配,其中每个人对构成另一组的个体都有不同的偏好。如果...
阅读 4 分钟
“Char”数据类型或字符数据类型用于存储字母,不像数字和整数存储在整数和浮点数中,或者布尔值中存储真/假值。字符本质上是整数类型,大小为 1 字节,可打印字符为(空格)、!,"...
阅读 4 分钟
在本文中,您将了解为什么全局变量在 C++ 中是邪恶的:全局变量在任何程序函数之外定义和声明。在程序的整个生命周期中,它们都保持其理想。在程序的执行过程中,它们是可用的。非 `const` 的全局变量...
阅读 3 分钟
在本文中,您将学习如何在 C++ 中按排序顺序打印所有排列,并附有示例。但在开始实现之前,您必须了解 C++ 中的排列和字典序。什么是排列?排列是计算机科学和组合学中的一个基本概念...
阅读 4 分钟
在概率和记录、知识和分布建模的领域中,这些都至关重要。C++ STL 为构建者提供了强大的工具,其中之一就是 beta 分布功能:“beta()”、“betaf()”和“betal()”。这些函数为比较 beta 分布概率提供了计算框架……
阅读 4 分钟
我们请求您订阅我们的新闻通讯以获取最新更新。
我们提供所有技术(如 Java 教程、Android、Java 框架)的教程和面试问题
G-13, 2nd Floor, Sec-3, Noida, UP, 201301, India