2012-05-15 23 views
5

Eigentlich ist es ziemlich schwer zu beschreiben:
Ich möchte einen Algorithmus implementieren, der Zahl für Zahl der gleichen Position vergleicht (wie ich meine Berechnungen in einem 10-basierten System ist es eher die gleiche "Macht der Zehn") von zwei gegebene Integer/Zahl (mit der gleichen "Länge"). Es sollte den Grad der Gleichheit zurückkehren, wie folgend:Wie berechne ich die Ähnlichkeit zweier Ganzzahlen?

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

ich will nicht meine Berechnungen tun, basierend auf einem String-comp Arison, wie ich dies in einem größeren Szenario tun werde :)

+2

Gerade bemerkte dies nicht eindeutig ist ... nicht 4491 und 4091 geben 1 oder 3? – Rawling

+0

@Rawling hat gerade meine Frage aktualisiert! –

+0

Excellent, glücklich raten von mir dann :) – Rawling

Antwort

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; 
} 

Hinweis: es behandelt nicht negative ganze Zahlen

Update: Fest nach Frage Update

+0

Ich mag dies (nachdem meine Lösung in Flammen aufging ...) Was macht es, wenn die Zahlen unterschiedliche Längen sind? – Rawling

+2

Nun, es wird nicht behandelt (obwohl es sehr einfach hinzuzufügen ist).OP hat für diesen Fall kein Verhalten definiert, also werde ich einfach eine Ausnahme auslösen. – max

+0

Nun, du hast meine +1. Hoffentlich werden einige der anderen auch Notiz nehmen. – Rawling

0

Es klingt wie die Levenshtein Distance wäre angemessen. Dies ist eine Standardmethode, um den Unterschied zwischen zwei Strings zu messen. In Ihrem Fall sind die Zeichenfolgen die Dezimaldarstellungen der Zahlen.

+0

Ich denke, dass Levenshtein gilt nicht für dieses Problem – Jorge

1

See the Answer to this SO Question

Sie die Ziffern nach der ersten Methode Split und die Ähnlichkeit aus dem Zweiten Get Methode:

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; 
    } 
} 

Jetzt können Sie ca Vergleichen n die die beiden int Arrays wie folgt aus:

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

interessant ... aber zu viel Array-Handling, die auf der Performance-Down-Seite ist ... –

1

Für alle Fälle, in denen X und Y nicht gleich sind:

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

4491 und 1020

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

4491 und 4493

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

hauptsächlich das gleiche wie http://StackOverflow.com/A/10601394/57508, aber mit der Festsetzung von 'log (1, 10) ':) –

+0

Scheitert immer noch mit' 4489' und '4491'. – Rawling

1

Nur um zu versuchen, salvag e etwas von dieser Frage nach meinem letzten Versuch ...

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

ich, was der beste Weg, es zu berechnen, mit euklidischer Ähnlichkeit.

Sehen Sie bitte diesen Link: http://stackoverflow.com/questions/11555355/calculating-the-distance-between-2-points

+1

Während dieser Link die Frage beantworten kann, ist es besser, die wesentlichen Teile der Antwort hier aufzunehmen und den Link als Referenz bereitzustellen. Nur-Link-Antworten können ungültig werden, wenn sich die verknüpfte Seite ändert. - [Aus Bewertung] (/ review/low-quality-posts/18304470) –

Verwandte Themen