2012-05-12 17 views
16

¿Cómo puedo verificar si una matriz es un subconjunto de otra matriz, independientemente del orden de los elementos?Compruebe si una matriz es un subconjunto de otra matriz en Ruby

a1 = [3, 6, 4] 
a2 = [1, 2, 3, 4, 5, 6, 7, 8, 9] 

...? 

a1 is a subset of a2 
+0

¿Realmente significa estructura de datos? – Flexoid

+0

Quizás. Arrays y Hashes son estructuras de datos ¿verdad? – MxyL

+0

Oh, * qué estructura. Lo mejor es, probablemente, los conjuntos, ya que los conjuntos son buenos, pero como muestra la variedad de respuestas (y hay aún más opciones), puede que no importe, dependiendo de sus necesidades. –

Respuesta

26

Use los juegos. Entonces puede usar set.subset?. Ejemplo:

require 'set' 

a1 = Set[3,6,4] 
a2 = Set[1,2,3,4,5,6,7,8,9] 

puts a1.subset?(a2) 

Salida:

 
true 

ver su funcionamiento en línea: ideone

+0

+1, mejor que la mía. –

+1

Otra ventaja de Set es que también puede verificar otras propiedades, como 'proper_subset?' Si no desea que los conjuntos idénticos devuelvan verdadero. –

30

más fácil puede ser:

(a1 - a2).empty? 
+0

Esto es rubí puro y no need 'require" set "' –

+0

'set' es stdlib, por lo que es discutible decir que es menos puro que usar las diferencias de listas. – rewritten

+0

@DaveNewton oh, lo siento, debo haber volcado accidentalmente los argumentos en mi sesión local de IRB. Claro, tienes razón. Eliminaré mis comentarios para no confundir a los demás con mi error. Gracias por seguirme ;-) –

17

La estructura de datos que ya tiene es perfecto, simplemente marque la intersección:

(a1 & a2) == a1 

Actualización: El comentario discutiendo p las modificaciones son interesantes y creativas, pero bastante incorrectas ya que los implementadores de Ruby anticiparon esta preocupación y especificaron que el orden del resultado es el orden de a1. Entonces esto funciona, y continuará funcionando en el futuro. (Las matrices son estructuras de datos ordenadas, no conjuntos. No se puede simplemente permutar el orden de una operación de matriz.)

Me gusta más la respuesta de Dave Newton para la frialdad, pero esta respuesta también funciona, y como la de Dave, es también núcleo Ruby.

+1

+1, también mejor que el mío. –

+1

Oh, solo toma la intersección y mira. No pensé en esa lol. – MxyL

+0

No estoy seguro de si la mía es realmente mejor, ya que depende de que la implementación sea estable. (También en ningún duplicado, pero la definición de la pregunta como una operación establecida parece implicar que. Supongo que se podrían clasificar ambos términos). – DigitalRoss

1

Tal vez no es rápido, pero bastante legible

def subset?(a,b) 
    a.all? {|x| b.include? x} 
end 
Cuestiones relacionadas