当前位置: 首页 > 知识库问答 >
问题:

查找一组值的所有唯一子集

任绪
2023-03-14

我有个算法问题。我试图从一个更大的值集合中找到所有唯一的值子集。

例如,假设我有{1,3,7,9}集。我能用什么算法找到3的这些子集?

{1,3,7}
{1,3,9}
{1,7,9}
{3,7,9}

子集不应重复,且顺序不重要,因此集{1,2,3}与集{3,2,1}相同。鼓励使用Psudocode(或常规类型)。

for i = 0 to size
  for j = i + 1 to size
    for k = j + 1 to size
      subset[] = {set[i],set[j],set[k]}

共有1个答案

韦胜泫
2023-03-14

一些使用递归的Java代码。

基本思想是尝试用当前位置交换每个元素,然后在下一个位置上递归(但我们还需要startpos来指示我们交换的最后一个位置是什么,否则我们将得到一个简单的置换生成器)。一旦我们有足够的元素,我们打印所有这些并返回。

static void subsets(int[] arr, int pos, int depth, int startPos)
{
   if (pos == depth)
   {
      for (int i = 0; i < depth; i++)
         System.out.print(arr[i] + "  ");
      System.out.println();
      return;
   }
   for (int i = startPos; i < arr.length; i++)
   {
      // optimization - not enough elements left
      if (depth - pos + i > arr.length)
         return;

      // swap pos and i
      int temp = arr[pos];
      arr[pos] = arr[i];
      arr[i] = temp;

      subsets(arr, pos+1, depth, i+1);

      // swap pos and i back - otherwise things just gets messed up
      temp = arr[pos];
      arr[pos] = arr[i];
      arr[i] = temp;
   }
}

public static void main(String[] args)
{
   subsets(new int[]{1,3,7,9}, 0, 3, 0);
}

打印:

1  3  7  
1  3  9  
1  7  9  
3  7  9  

还要注意,在每一步,我们还原所有的交换。

假设我们输入了1、2、3、4、5,我们想要找到大小为3的子集。

首先,我们使用前3个元素-1、2、3

现在,我们交换24以获得1 4 3 2 5。但是我们希望跳过32,所以我们从5开始。我们交换35,前3个元素给我们1 4 5

等等。

在这里跳过元素可能是最复杂的部分。请注意,每当我们跳过元素时,它只涉及从我们交换的位置之后继续(当我们交换24时,我们从4之后继续)。这是正确的,因为没有经过处理的元素不可能到达我们交换的位置的左边,也没有经过处理的元素到达那个位置的右边,因为我们从左到右处理所有的元素。

从for循环的角度来考虑算法可能是最简单的。

for i = 0 to size
  for j = i + 1 to size
    for k = j + 1 to size
      subset[] = {set[i],set[j],set[k]}

每个递归步骤都表示一个for循环

startpos分别为0i+1j+1

 类似资料:
  • 问题内容: 我有这个桌子; 我希望选择这样的行: 任一或= 。 另一个字段应该是唯一的。 即我想从表中选择唯一,或者我需要以下结果: 怎么做? 为什么?因为我希望构建一个类似于Facebook的收件箱,在该收件箱中,已发送和已接收的消息将被聚合,而此查询是迄今为止的瓶颈。 我正在使用Rails 3.2和Postgres 9.3。 问题答案: (not )从结果中删除重复项,从而不必要。您可能希望在

  • 我有一个包含以下列的表:id、col1、col2、col3、col4、col5、col6。 约束表示至少有3列被填充(所以最多3个NULs)。(列不按顺序填充,所以可以有col1、col2、col5被填充,col3、col4、col6是NULs) 如何确保当该列不为NULL时,它在此行的其他列中是唯一的?如何确保非空值的组合在所有行中都是唯一的? 我目前添加了以下约束(以确保至少3个非空):

  • 我有以下格式的配子数据: 数据输出: 我需要对它们进行配对和组合,所以我参考一对中的位置得到所有可能的唯一组合。我有另一个数据文件,其中包含对的信息,它们是参考Place配对的。所以在这个文件中,我可以看到Place 19 Place 33是一对,我想要以下结果: 在这种情况下,“唯一”表示A1:A2等于A2:A1。我之所以想这样做,是因为我想对这对字母进行四配子测试,看看是否所有可能的字母组合都

  • 问题内容: 在处理从YQL返回的JSON时,我发现自己正在寻找一种从数组中提取所有唯一值的方法。 代码看起来有点“忙”,我想知道是否有更优雅的方法从数组中提取唯一值。 问题答案: 您可以使用indexOf来检查元素是否在数组中。 或者如果您具有唯一的ID或名称,则使用对象而不是数组:var output = {}

  • 我正在使用LinkedHashSet从ArrayList中获取所有唯一值。 我的代码如下所示:

  • 问题内容: 在最近的一次采访中有人问我这个问题。 您将获得一个包含一百万个元素的数组。除了一个元素外,所有元素都是重复的。我的任务是找到独特的元素。 我的做法是要经过在整个数组循环,然后创建一个索引作为数组中和的数组中出现的次数。然后再次遍历我们的地图,并返回值为1的索引。 我说我的方法会花费时间。面试官告诉我要以低于复杂度的方式对其进行优化。我说过,我们不能,因为我们必须遍历具有一百万个元素的整