创建算法来确定幂集中子集的大小

Posted

技术标签:

【中文标题】创建算法来确定幂集中子集的大小【英文标题】:Creating algorithms to determine the size of subsets in a power set 【发布时间】:2012-10-19 16:15:25 【问题描述】:

我在为此作业创建算法时遇到问题。如果我能得到一些关于谁从第一个算法开始的提示,我将不胜感激。

本次作业的目标是实现和比较各种算法,以计算给定集合的每个可能大小的子集数。请记住,具有 n 个元素的集合有 2^n 个子集。其中两种算法将用于实际生成子集。 您的程序将能够要求用户做出选择,直到他/她希望退出。您的程序的 GUI 是允许的,但不是必需的。选择应允许以下内容:

    运行一个算法,该算法的工作原理是计算从 0 开始的所有 2^n 个整数(您可能无法使用 C/C++/Java int 数据类型)并确定每个数字对应的子集的大小。该算法必须以某种方式使用整数除法和模数。它需要返回一个数组,其中包含每个可能大小的子集的数量。显示每个可能大小的子集数。 n 的值将由用户输入确定。应在 n 上执行错误检查。

    运行一个算法,该算法基于计算从 0 开始的所有 2^n 个整数(您可能无法使用 C/C++/Java int 数据类型)并确定对应于的子集的大小每个数字。该算法必须以某种方式使用位级操作(逻辑与移位)。它需要返回一个数组,其中包含每个可能大小的子集的数量。显示每个可能大小的子集数。 n 的值将由用户输入确定。应该对n进行错误检查。

    运行一个算法,为 0 到 n(含)之间的所有 k 值生成 C(n,k),其中 n 由用户输入确定。该算法需要利用递归阶乘函数。它需要返回一个数组,其中包含每个可能大小的子集的数量。显示每个可能大小的子集数。应该对n进行错误检查。

    运行一个算法,为 0 到 n(含)之间的所有 k 值生成 C(n,k),其中 n 由用户输入确定。该算法需要利用迭代阶乘算法。它需要返回一个数组,其中包含每个可能大小的子集的数量。显示每个可能大小的子集数。应该对n进行错误检查。

【问题讨论】:

噢耶!亲爱的,你用的是哪本教科书? @Vincenzo Sanchez 如果在将家庭作业复制粘贴到 SO 中时“说明来源”已成为一种普遍做法,这难道不是一个令人愉快的讽刺吗? 如果我们做功课,你将一无所获;)如果你想了解很多关于算法的知识,我建议你阅读算法设计手册. @WeirdlyCheezy 是的,那会很愉快 :) 【参考方案1】:

我发现您的所有问题都与一个主题有关:递归回溯

生成集合 S 的幂集:

function rec( i )
      if i == S.length
         print choocen elements of S
         return
      else
         do not chooce element i of S
         rec(i + 1)
         choose element i of S
         rec(i + 1)

C(n, k)的问题也是类似的,一旦你理解了递归的概念。我不会为你的任务提供解决方案:)

【讨论】:

以上是关于创建算法来确定幂集中子集的大小的主要内容,如果未能解决你的问题,请参考以下文章

是否有一种快速算法可以将集合的所有分区生成为大小为 2 的子集(和一个大小为 1 的子集)?

算法:并查集

回溯法

幂集合[集合论]

谁能告诉我一个算法来创建一个函数,该函数将数组的所有可能分区返回到 n 个子集中,同时保持数组的顺序?

快速幂算法