2016-11-18 1 views
2

J'utilise la classe BitSet en Java pour traiter un ensemble de bits. Lors de la comparaison de deux BitSet je dois faire une distinction claire entre la notion de sous-ensemble et la notion de intersection.Java BitSet, sous-ensemble vs intersection

Voyons voir un exemple avec l'opérateur pour obtenir le sous-ensemble:

BitSet bits1 = new BitSet(); 
    BitSet bits2 = new BitSet(); 
    bits1.set(0,2,true); //110 
    bits2.set(1);  //010 
    //010 is a SUBSET of 110 
    bits1.and(bits2); //bits1 became the result of the and operator 
    if(bits1.equals(bits2)) 
    { 
     System.out.println(bits2 + " is a subset of " + bits1); 
    } 
    //PRINT 

    BitSet bits4 = new BitSet(); 
    bits4.set(0,2,true); //110 
    BitSet bits3 = new BitSet(); 
    bits3.set(1,3,true); //011 
    bits4.and(bits3); 
    //011 is NOT a subset of 110 
    if(bits4.equals(bits3)) 
    { 
     System.out.println(bits4 + " is a subset of " + bits3); 
    } 
    //NO PRINT 

Le sous-ensemble est assez clair que j'utilise l'opérateur de vérifier est un BitSet est le sous-ensemble de l'autre.

Le même exemple avec l'opérateur d'intersection intégré:

BitSet bits1 = new BitSet(); 
    BitSet bits2 = new BitSet(); 
    bits1.set(0,2,true); //110 
    bits2.set(1);  //010 
    //010 intersect 110, but is also a subset of 110 
    System.out.println("Intersection? " + bits2.intersects(bits1)); 

    BitSet bits3 = new BitSet(); 
    bits3.set(1,3,true); //011 
    //011 VS 110 intersection only 
    System.out.println("Intersection? " + bits3.intersects(bits1)); 

Voilà mon problème: l'intersection de l'opérateur à la fois sous-ensemble et détecter intersection. Mon but est de ne détecter que les intersections à l'exclusion de celles qui sont aussi le sous-ensemble, comme bits1 vs bits2 dans le second exemple. Donc cet opérateur ne convient pas à mon cas car c'est trop général. Existe-t-il un moyen de détecter cette propriété?

Répondre

2

Prenez la cardinalité des bits1 bits2 et bits1.and (bits2). Si la cardinalité est différente de zéro, les ensembles se croisent. Si elle est égale à la cardinalité bits1, alors bits1 est un sous-ensemble de bits2 et vice versa. Ainsi, en utilisant la cardinalité, vous pouvez vérifier la relation du sous-ensemble comme vous le souhaitez (mais cela ne semble pas beaucoup plus rapide que les vérifications que vous avez déjà mentionnées dans votre réponse et que vous pouvez combiner).