2012-12-07 52 views
1

我有三组数字,我想比较一组中的数字与另一组数字。即,第一组中的每个数字小于另一组中的至少一个数字。需要注意的是,第一组中的下一个数字必须小于第二组中的不同的号码(即{6,1,6}对{8,8,2}有效,但{6,2 ,6}对{8,8,2}不会)。我有一个工作方法,但它是蛮力和丑陋的。我怎样才能(更)轻松地比较两组数字?

如果我们有组A和组B,而且每个都有元素,b和c:

if(setB.a < setA.a) 
    if(setB.b < setA.b) 
     if(setB.c < setA.c) 
      return true; 
    else if(setB.b < setA.c) 
     if(setB.c < setA.b 
      return true; 

等等...

+2

你能张贴当前的方法? (以获得你想要做这件事更容易的感觉) – irrelephant

+0

发布了一个示例。这是漫长而丑陋的,令人尴尬的。但你明白了。 – eagerbeaver

回答

1

编辑:我只是意识到,你说的这些组在3个值硬编码。这是任何大小的集合的超级通用算法。

对于3值集合,可以执行一组元素的相同的倾销和分选,然后执行:

if(setB.a < setA.a) 
    if(setB.b < setA.b) 
     if(setB.c < setA.c) 
      return true; 
return false; 

================ ======================================

的一般算法:

这是我可以立即想到的最有效的方法。

伪代码(比Java更Python,sorry--希望注释说明):

list l1 = set1.items() //get the items out 
list l2 = set2.items() 

l1 = sort(l1) 
l2 = sort(l2) //sort the lists 

int set2idx1 = l1[0].find_closest_greater_than_value(l2) //binary search or something 
if set2idx1 exists: 
    l2 = l2[set2idx1+1:] //in python this means l2 is reassigned to a subarray of l2 starting at set2idx1+1 going to the end of l2 
else: 
    return false 

for(int i=1; i<l1.len; i++) 
    int set2idxi = l1[i].find_closest_greater_than_value(l2) //binary search or something 
    if set2idxi exists: 
     l2 = l2[set2idxi+1:] 
    else 
     return false 

return true 

评论,如果任何事情没有意义

编辑编辑:一般的

解释算法:

  1. 将设置的元素转储到数组中
  2. 对这些数组进行排序
  3. 遍历第一个数组,查看第二个数组中是否存在大于当前值的值。如果是这样,获取该值的索引并删除之前包含该索引的所有内容,并将第二个数组变量重新分配给剩下的内容。
  4. 如果没有这样的值(或者因为它不存在或者您已经用完了测试值,则返回false)。否则,最后,返回true。

这里的想法是,因为数组是排序的,所以任何大于第二个数组中匹配元素的元素都会大于第一个数组中的元素。所以你可以砍掉较低的值,因为你不想使用相同的值,所以你也可以砍掉你找到的那个值。如果您返回false,则知道这是因为没有更大的值,或者是因为array1中的数字全部大于array2中的数字,或者是因为array2中的数字不够大于array1中的数字。

+0

我不认为我是这样理解的:/ – eagerbeaver

+0

我会用一般的解释来编辑。 – Colleen

+0

也用我的认识编辑,你的设置大小是固定的。我需要学习更仔细地阅读问题。 – Colleen

0

什么下面的伪代码?

Condition(A : Set, B : Set) : Bool = 
    Let a := max(A), b := min(B) In 
     // Namely, that each number in the first set is less than at least one number in the other set 
     If a <= b Then 
      // the next numbers in the first set must be less than a different number in the second set 
      Condition(without(A, a), without(B, b)) 
     Else 
      False 
     EndIf 

凡未经(A,a)指集合A减去集合{A}

0

看起来List会比Set做得更好,因为您的示例包含重复的元素。简单地说:

1)对这两个列表进行排序。

2)删除第二个列表中的前几个元素,直到第一个和第二个列表的大小相等。

3)直接比较list1[i]list2[i]每个i

代码:

import java.util.*; 
class Main { 
    public static void main (String[] args) { 
     List<Integer> list1 = new ArrayList<Integer>(); 
     List<Integer> list2 = new ArrayList<Integer>(); 
     list1.add(3); list1.add(7); list1.add(7); 
     list2.add(8); list2.add(8); list2.add(2); list2.add(1); list2.add(5); 
     //algorithm: 
     Collections.sort(list1); 
     Collections.sort(list2); 
     List<Integer> list3 = list2.subList(list2.size() - list1.size(), list2.size()); 
     System.out.println(list1.size() + " " + list3.size()); 
     boolean pass = true; 
     for(int i = 0; pass && i < list1.size(); i++) 
      if(list1.get(i) >= list3.get(i)) 
       pass = false; 
     System.out.println(pass); 
    } 
} 
+0

对不起,我不是故意用Set对象。你的解决方案和科琳的想法是一样的,但她是第一个。谢谢你:) – eagerbeaver

+0

@eagerbeaver哦,开玩笑吧。但是我的'subList'实现与她的实现不同,因为您最多只需要list2中的'size(list1)'元素就可以将它与list1进行比较。 – irrelephant

相关问题