使用Set In Java从给定的时间间隔创建一组大小为K的子集

时间:2011-06-20 21:08:21

标签: java

我很乐意帮助解决以下问题:

我想用Java编写一个方法,它将得到三个值:first,last和K,所以并创建有界区间内的所有大小为L的子集[first,last],

例如:如果first = 1,last = 3且K = 2,那么结果将是{1,2},{1,3},{2,3}。

好的,所以我决定函数的结果值是Set<Set<Integer>>,但是我不确定我究竟需要做什么,算法和编写它的正确方法是什么。

public static Set<Set<Integer>> generateKsubsets( 
int first, int last, int K){
Set<Set<Integer>> result = new HashSet<Set<Integer>>(); 
问题1:在这种情况下,这是正确的实施吗? 说实话,我不知道为什么我在这里使用它。我可以在这里使用HasgTree吗?在这种情况下主题之间有什么区别吗?

If(K==0) {
问题2:    所以在这里我想返回一个我定义的类型的空集,  我该怎么做?可以 我在结果集中添加一个空集?

return result;
}

现在主要问题(3):我无法理解我的算法应该如何工作以及如何使用这个集合来编写它。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

这听起来像家庭作业(如果是,请将其标记为这样),所以我只会给出一些提示:

  1. HashSet应该做的。但是,请注意,为了使HashSet像数学集一样工作(即它不能包含同一元素的多次出现),元素类型(在本例中为Set<Integer>)必须具有{{1 }}和equals()实现,当两个元素相等时告诉hashCode()。大多数HashSet实现没有按照您期望的方式实现这些方法,但您可能不需要它。请记住不要多次添加相同的设置。
  2. Set 是一个空集。如果你为它添加一个集合,它就不再是空的。
  3. 一组可以被认为是二进制数。如果您的范围是2-5,则可以选择的元素是new HashSet<Set<Integer>>()。该集合的任何子集都可以表示为具有四个数字的二进制数,每个数字对应于主集合中的元素,如果元素在子集中则为1,如果不在,则为0。因此,子集{2, 3, 4, 5}{3, 5}(2不存在,3存在,4不存在,5存在),0101{2, 3, 4}。因此,如果你能找到一种方法来创建具有正确位数的所有二进制数,以及如何根据每个数字创建一个子集,那么你就拥有了算法。