Manera rápida de comparar dos listas e identificar los elementos poco comunes¿Alguien conoce una forma rápida de comparar dos listas e identificar elementos de lista diferentes (es decir, elementos poco comunes)?Puedo hacer esto usando dos bucles anidados, pero como muchas cosas en JSL, esperaba que hubiera alguna forma más sencilla y oscura. DJ
Mis listas son mucho más grandes que esto, por supuesto:
list1={"manzana","pera","naranja","kiwi","sandía"};
list2={"manzana","pera","naranja","kiwi","fresa","sandía"};
Busque elementos diferentes o poco comunes, en este caso "fresa".
Re: ¿Forma rápida de comparar dos listas (elementos poco comunes)?Tendría que compararlo para diferentes tamaños y para diferentes enfoques de bucle JSL. Supongo que entre 2 y 10 elementos del conjunto serían más rápidos con la matriz asociativa. En tamaño 1, la matriz asociativa es excesiva, pero aún así se construye bastante rápido... alrededor de un millón por segundo...
start = tickseconds();
for(i=1,i<=1e6,i++,
a=associativearray({"a","b"});
b=associativearray({"a","b"});
c=associativearray({"a","b"});
d=associativearray({"a","b"});
e=associativearray({"a","b"});
);
stop=tickseconds();
aatime=(stop-start);
write("\!ntime for 5,000,000 associative arrays:",aatime);
start = tickseconds();
for(i=1,i<=1e6,i++,
a=1;
b=2;
c=3;
d=4;
e=5;
);
stop=tickseconds();
satime=(stop-start);
write("\!ntime for 5,000,000 simple assingments:",satime);
write("\!nsimple/associative=", satime/aatime);
/*:
time for 5,000,000 associative arrays:5.8166666666657
time for 5,000,000 simple assingments:0.283333333325572
simple/associative=0.0487106017178716
Probablemente no pueda ejecutar más de 20 a 30 declaraciones JSL simples para cada matriz asociativa que cree.
Re: ¿Forma rápida de comparar dos listas (elementos poco comunes)?Pregunta rápida para esto: ¿el tiempo que se ahorra al usar la matriz asociativa versus el bucle es casi siempre mayor que la sobrecarga que se necesita para crear la matriz asociativa versus la lista?
Re: ¿Forma rápida de comparar dos listas (elementos poco comunes)?Y el método poco común no requiere encontrar primero la intersección. Es sólo la diferencia.
set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
uncommon1 = set1; uncommon1<<REMOVE></REMOVE>Re: ¿Forma rápida de comparar dos listas (elementos poco comunes)?Además: si los miembros del conjunto se nombran con números enteros consecutivos, comenzando en 1, este problema se podría resolver de manera muy eficiente con una matriz. Pero, tal como se presenta con los miembros del conjunto con nombre, una matriz asociativa es probablemente mejor que ordenar, y definitivamente mejor que un par N^2 de bucles anidados.
Re: ¿Forma rápida de comparar dos listas (elementos poco comunes)?set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
set3=associativearray({"apple","pear","watermelon"});
intersection=set1;intersection<<INTERSECT></INTERSECT>
"common (intersection) items:"
{"apple", "kiwi", "orange", "watermelon"}
"all (union) items"
{"apple", "grape", "kiwi", "orange", "pear", "strawberry", "watermelon"}
set1HasSet3 << Contains(set3) = 0;
set2HasSet3 << Contains(set3) = 1;
Las matrices asociativas son muy buenas para millones de valores, especialmente en comparación con escribir un script JSL que recorre millones de valores.
El índice de secuencias de comandos tiene los detalles de la matriz asociativa que se utiliza como conjunto. Aquí están los elementos poco comunes:
set1=associativearray({"apple","grape","orange","kiwi","watermelon"});
set2=associativearray({"apple","pear","orange","kiwi","strawberry","watermelon"});
intersection=set1;intersection<<INTERSECT></INTERSECT>
Re: ¿Forma rápida de comparar dos listas (elementos poco comunes)?@EM :
Esta solución que me ha ofrecido me ha sido de gran ayuda de muchas maneras diferentes hasta ahora y primero quiero agradecerle por ello.
También me gustaría preguntar si cuando trabajamos con conjuntos de datos realmente grandes (por ejemplo, un par de millones de elementos cada uno), este enfoque requerirá grandes cantidades de memoria e insertar los elementos en una nueva tabla no parece eficiente. ¿Existe una manera más efectiva de identificar elementos poco comunes entre dos columnas en dos tablas de datos? Es decir, si la columna 1 en la tabla de datos 1 (dt1) y la columna 1 en la tabla de datos 2 (dt2) tienen una lista grande de números, ¿podemos compararlos en ¿Una forma más efectiva?
Mejor
hoy
Re: ¿Forma rápida de comparar dos listas (elementos poco comunes)?<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />Me gustaría saber eso también. Los elementos comunes se pueden encontrar con Intersect() (ver más abajo), pero no conozco una función correspondiente para elementos poco comunes.
Hay más opciones para tablas de datos que para listas. El siguiente script identifica los elementos poco comunes a través de una tabla de datos temporal. Puede que sea más rápido que recorrer listas largas, pero no lo he comparado
lista1 = { "manzana" , "pera" , "naranja" , "kiwi" , "sandía" , "mango" } ;
lista2 = { "manzana" , "pera" , "kiwi" , "naranja" , "fresa" , "sandía" , "melón" } ;
dt = Nueva mesa ( "temperatura" ,
Nueva columna ( "gramo" , personaje , valores establecidos ( lista1 || lista2 ) ) ,
Nueva columna ( "nº" , numérico , fórmula ( 1 ) , fórmula de evaluación ) ,
invisible
) ;
Resumir ( gramo = por ( dt : gramo ) , norte = Contar ( dt : n° ) ) ;
no_en_común = gramo [ ubicación ( Como lista ( norte ) , 1 )] ;
común = Matriz asociativa ( lista1 ) << intersecarse ( Matriz asociativa ( lista2 ) ) << obtener llaves ;
Espectáculo ( común , no_en_común ) ;
Cerca ( dt , guardar ) ;