2012-05-15 24 views
5

Realmente es bastante difícil de describir:
Quiero implementar un algoritmo que compare figura por figura de la misma posición (como hago mis cálculos en un sistema basado en 10 es más o menos el mismo "poder de diez") de dos números enteros dados (con la misma "longitud"). Se debe devolver el grado de la igualdad de la siguiente manera:¿Cómo calculo la similitud de dos enteros?

  • 4491 y 1020 = 0
  • 4491 y 4123 = 1
  • 4491 y 4400 = 2
  • 4491 y 4493 = 3
  • 4491 y 4491 = 4
  • 4491 y 4091 = 1

no quiero hacer mis cálculos basados ​​en una cadena de un borrador Arison, como haré esto en una situación mucho más grande :)

+2

di cuenta de que esto es ambigua ... qué 4491 y 4091 dan 1 o 3? – Rawling

+0

@Rawling acaba de actualizar mi pregunta! –

+0

Excelente, suertudo conjeturo de mi parte entonces :) – Rawling

Respuesta

3
public static int Compare(int i1, int i2) 
{ 
    int result = 0; 
    while(i1 != 0 && i2 != 0) 
    { 
     var d1 = i1 % 10; 
     var d2 = i2 % 10; 
     i1 /= 10; 
     i2 /= 10; 
     if(d1 == d2) 
     { 
      ++result; 
     } 
     else 
     { 
      result = 0; 
     } 
    } 
    if(i1 != 0 || i2 != 0) 
    { 
     throw new ArgumentException("Integers must be of same length."); 
    } 
    return result; 
} 

Nota: no maneja números enteros negativos

Actualización: fijo después de la actualización pregunta

+0

Me gusta esto (después de que mi solución se incendió ...) ¿Qué hace si los números son de diferentes longitudes? – Rawling

+2

Bueno, no se maneja (aunque es muy fácil de agregar).OP no definió ningún comportamiento para este caso, así que lanzaré una excepción. – max

+0

Bueno, tienes mi +1. Con suerte, algunos de los demás también tomarán nota. – Rawling

0

Parece que el Levenshtein Distance sería apropiado. Esta es una forma estándar de medir la diferencia entre dos cadenas. En su caso, las cadenas son las representaciones decimales de los números.

+0

Creo que levenshtein no se aplica a este problema – Jorge

1

See the Answer to this SO Question

Puede dividir los dígitos por el primer método y obtener la similitud de la Segunda Método:

int[] GetIntArray(int num) 
{ 
    List<int> listOfInts = new List<int>(); 
    while(num > 0) 
    { 
     listOfInts.Add(num % 10); 
     num /= 10; 
    } 
    listOfInts.Reverse(); 
    return listOfInts.ToArray(); 
} 

int GetSimilarity(int firstNo, int secondNo) 
{ 
    int[] firstintarray = GetIntArray(firstNo) 
    int[] secondintarray = GetIntArray(secondNo) 
    if (firstintarray.Count != secondintarray.Count) 
    { 
     throw new ArgumentException("Numbers Unequal in Length!"); 
    } 
    int similarity = 0; 
    for(i = 0; i < firstintarray.Count; i++) 
    { 
     if (secondintarray[i] = firstintarray[i]) 
     { 
      similarity++; 
      continue; 
     } 
     break; 
    } 
} 

Ahora usted ca n Comparar los las dos matrices int como esto:

int Similarity = GetSimilarity(4491, 4461);// Returns 2 
+0

interesante ... pero demasiada manipulación de matrices que está en el lado del rendimiento hacia abajo ... –

1

Para todos los casos en los que X e Y no son iguales:

Length - Math.Floor(Math.Log10(Math.Abs(X - Y)) + 1) 

4491 y 1020

4 - Math.Floor(Math.Log10(Math.Abs(4491 - 1020)) + 1) = 0 

4491 y 4493

4 - Math.Floor(Math.Log10(Math.Abs(4491 - 4493)) + 1) = 3 
+0

principalmente lo mismo que http://stackoverflow.com/a/10601394/57508, pero con la corrección de 'log (1, 10) ':) –

+0

Aún falla con' 4489' y '4491', sin embargo. – Rawling

1

Sólo para intentar salvag e algo de esta pregunta después de mi último intento ...

int Compare(int x, int y) 
{ 
    int pow10 = (int)Math.Pow(10, Math.Floor(Math.Log(Math.Max(x, y), 10))); 
    int matches = 0; 
    while(pow10 > 0 && (x/pow10) == (y/pow10)) 
    { 
     matches++; 
     pow10 /= 10; 
    } 
    return matches; 
} 
-1

I cosa que la mejor manera de calcularlo es el uso de Similitud euclidiana.

Por favor, vea este enlace: http://stackoverflow.com/questions/11555355/calculating-the-distance-between-2-points

+1

Si bien este enlace puede responder a la pregunta, es mejor incluir las partes esenciales de la respuesta aquí y proporcionar el enlace de referencia. Las respuestas de solo enlace pueden dejar de ser válidas si la página vinculada cambia. - [De la opinión] (/ reseña/mensajes de baja calidad/18304470) –

Cuestiones relacionadas