¿Cuál es la mejor manera de detectar conjuntos similares de flotadores de 0 a 1?

El problema en esta pregunta es que los flotantes no son fáciles de comparar por su representación binaria.

Lo que todo informático debe saber sobre la aritmética de coma flotante

Si para una intención similar tiene una matriz con los mismos elementos pero mezclada, esto se puede hacer en [math] O (n) [/ math] con un Set simple y con una redefinición de igualdad para float con un error aceptable.

Si por similitud, tiene la intención de elemento con aproximadamente el mismo valor, entonces todavía puede utilizar la primera solución, pero tiene que decidir contra qué nivel de precisión dos números son similares. La solución será nuevamente [matemática] O (n) [/ matemática] pero almacenará diferentes elementos en la matriz.

En ambos casos, debe asegurarse de comparar los flotadores correctamente. La solución anterior sigue siendo [matemática] O (n) [/ matemática], utiliza un conjunto y una clase personalizada para almacenar el valor redondeado flotante con un valor anulado igual.

clase pública CompareFloatSimilarity {

clase estática pública RoundedFloat {

valor privado final BigDecimal;

public RoundedFloat (float fValue, int decimalPlace) {

valor = BigDecimal.valueOf (fValue) .setScale (decimalPlace,
BigDecimal.ROUND_HALF_UP);
}

public Float getFloat () {

devolver nuevo Float (value.floatValue ());
}

@Anular
public int hashCode () {
final int primo = 31;
int resultado = 1;
result = prime * result + ((value == null)? 0: value.hashCode ());
resultado de retorno;
}

@Anular
public boolean equals (Object obj) {
if (esto == obj)
volver verdadero;
if (obj == nulo)
falso retorno;
if (getClass ()! = obj.getClass ())
falso retorno;
RoundedFloat other = (RoundedFloat) obj;
if (valor == nulo) {
if (otro.valor! = nulo)
falso retorno;
} else if (Float.compare (getFloat (), other.getFloat ()) == 0) {
volver verdadero;
}
falso retorno;
}

@Anular
public String toString () {
return Float.toString (getFloat ());
}
}

/ *
* (no Javadoc)
* *
* @ver java.lang.Object # hashCode ()
* /

public static boolean areSimilar (float [] first, float [] second,
int precisión) {
Establezca rounded = new HashSet ();
para (flotante f: primero) {
rounded.add (nuevo RoundedFloat (f, precisión));
}

para (flotante f: segundo) {

if (! rounded.contains (new RoundedFloat (f, precision))) {
System.out.println (f);
falso retorno;
}

}
volver verdadero;
}

/ **
* @param args
* /
public static void main (String [] args) {
float [] first = new float [] {2, 33f, 5, 4500000f, 5, 123.200000f, 1f};
float [] second = new float [] {2, 33f, 5, 4500000f, 5, 123.203f, 1f};

System.out.println (areSimilar (primero, segundo, 2));
System.out.println (areSimilar (primero, segundo, 3));

}
}

Como su pregunta carece de algunos detalles, solo enumeraré pequeños pasos específicos.

Compara el tamaño de la matriz.

Calcule un promedio de todos los valores y compárelo con el promedio de otras matrices, dependiendo de cómo se aporten los números, esto puede o no dar una pista para la similitud de las matrices (también puede usar la varianza como segunda propiedad).

Ahora que resolvió los que no encajan, puede ordenar y comparar los números.

More Interesting

¿Cómo podemos calcular el factorial de los primeros N números naturales usando la metaprogramación de plantilla en C ++?

¿Cuál de los enfoques (conexionismo, evolutivo, bayesiano, etc.) tendrá la mejor oportunidad de desarrollar un algoritmo maestro de IA?

¿Alguien puede compartir el conocimiento sobre el algoritmo de Monte Carlo que recoge datos al azar?

¿Qué algoritmo se usa en WhatsApp?

¿Qué prueba de primalidad se usa en las aplicaciones de software convencionales?

Teoría de conjuntos: ¿un subconjunto es un tipo de intersección?

¿Qué curso de Udemy es mejor para aprender estructuras de datos si ya he aprendido los conceptos básicos (matrices, estructuras, punteros, listas enlazadas)?

¿Cómo funciona el algoritmo iPod shuffle?

Es un método de retroceso para imprimir permutaciones de cadena. No entiendo de qué manera se produce el flujo de control, como después de encontrar el intercambio, el intercambio se llama luego permutar y luego nuevamente. ¿Esto no se me viene a la cabeza?

¿Abusaron los escritores de los límites de la ecuación 3.10 del CLRS?

¿Qué estructura de datos usaría para diseñar un programa de planificación de producción?

¿En qué situaciones alguien usaría Dijkstra sin un montón sobre Dijkstra con un montón?

¿Cuál es la complejidad temporal del algoritmo de búsqueda binaria?

¿Cómo podemos encontrar la segunda ruta más pequeña entre dos nodos en un gráfico ponderado / no ponderado de manera eficiente?

¿Cuál es el algoritmo para expulsar a los pasajeros del avión si está sobrevendido?