【问题标题】:Logical Error in finding subsets查找子集的逻辑错误
【发布时间】:2012-04-21 16:19:09
【问题描述】:

我正在尝试将代码概括为 find all subsets of a given string(重复的元素将被视为不同),使其适用于任何列表。

public class Subsets{
private static <T> void RecursiveSubsets(List<List<T>> list, ArrayList<T> soFar, List<T> rest)
{
if(rest.isEmpty())
{
  list.add(soFar);
}
else
{
  List<T> remaining;
  if(rest.size() == 1)
  {
    remaining = new ArrayList<T>();
  }
  else
  {
    remaining = rest.subList(1, rest.size() - 1);
  }
  //include the element
  ArrayList<T> includeFirst = new ArrayList<T>(soFar);
  includeFirst.add(rest.get(0));
  RecursiveSubsets(list, includeFirst, remaining);
  //exclude the element
  RecursiveSubsets(list, soFar, remaining);
 }
}

public static <T> List<List<T>> getAllSubsets(List<T> set)
{
List<List<T>> subsets = new ArrayList<List<T>>();
RecursiveSubsets(subsets,new ArrayList<T>(),set);
return subsets;
}

public static void main(String [] args)
{
List<Integer> ints = new ArrayList<Integer>(){
  {
    add(0);add(1);add(2);add(3);
  }
};

List<List<Integer>> allSubsets = getAllSubsets(ints);
System.out.println("Total Subsets returned : " + allSubsets.size());
for(int i=0; i<allSubsets.size(); ++i)
  {
  for(int j=0; j<allSubsets.get(i).size(); ++j)
  {
    System.out.print(allSubsets.get(i).get(j) + " ");
  }
  System.out.println();
  }
 }
}

经过几次尝试,我能够编译它,但这就是我得到的输出。 即使我有更多的整数,它仍然会返回这个。我无法弄清楚我错过了什么,需要帮助才能找到它。

$ java Subsets
Total Subsets returned : 4
0 1
0
1

【问题讨论】:

  • 哦,对不起,我读错了问题:)

标签: java generics subset


【解决方案1】:

您的程序实际上几乎是正确的,只是子列表逻辑有点错误。

List.sublist 的 javadoc 说

返回此列表在指定 fromIndex(包括)和 toIndex(不包括)之间部分的视图。

这里的“独家”二字很关键。

如果你只是改变

remaining = rest.subList(1, rest.size() - 1);

remaining = rest.subList(1, rest.size());

您的代码有效。

【讨论】:

  • 非常感谢您花时间帮助我。真的很感激。
【解决方案2】:

这个(在伪代码中)的逻辑通常是:

List<List<T>> subsets( List<T> list ){

    if( list is empty ) return a list containing the empty list;

    // else:

    subsetsWithout = subsets( list w/o 0th element );

    result.addAll(subsetsWithout);

    for( subset in subsetsWithout )
        result.add( subset + list[0] )

    return result;
}

看起来你正在做的事情不同,而且你试图通过函数参数返回东西的事实使它更加混乱。

【讨论】:

    猜你喜欢
    • 2021-06-16
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多