String Vergleichen und Differenz in prozent ausgeben

Gast #3439363
Lesenswert?

Hallo Zusammen,

ich moechte gerne 2 String aus Zahlen vergleichen und das Ergebnis in 
Prozent Ausgabe darstellen. D.h wenn beide String unterschiedlich sind, 
dann die Differenz in der Form: (strLength1 -strLength2)/100

char strLength1[]="920";
char strLength2[]="890";
char strDiffValue[]="";

if(strcmp(strLength1, strLength2) == 0)
{
  strDiffValue="0%";
}
else
{
   strDiffValue="0.3%";
}
Bitte kann jemanden mir zeigen, wie ich am besten so eine Funktion 
schreiben kann.

Danke
#3439449
Lesenswert?

Helmut Lenzen schrieb:
>> 21111 - 11211
>
> 21111
> 11211
> ^^^^^
> ||||-----gleich
> |||------gleich
> ||-------ungleich
> |--------gleich
> ---------ungleich
>
> Wuerde in dem Fall dann 60% Uebereinstimmung bedeuten

Das wirft eine interessante Fragestellung auf.
Wie gross ist die 'geeignet definierte Differenz' zwischen zb
1
      mayer
2
und   mayr

Sowas ist zb interessant, wenn es um Ähnlichkeitssuche geht. Wir alle 
kennen das Problem: Kundendatenbank. Ohne korrekte Schreibweise des 
Namens ist der Kunde nicht zu finden. Der Sachbearbeiter tippt wie ein 
wilder alle Variationen des Namens ein, die im einfallen, bis er dann 
endlich den gesuchten Kunden findet.

Ich benutz für solche Sachen einen Ähnlichkeitsvergleich, den ich mal in 
den 80-er Jahren in einer c't gefunden habe. Das Prinzip besteht darin, 
festzustellen, wieviele Operationen (verändern, vertauchen, einfügen, 
löschen) von Buchstaben man benötigt, um einen String A in einen String 
B zu überführen. Je kleiner die Zahl, desto ähnlicher.
Funktioniert erstaunlich gut.


Als ich die Überschrift des Threads gelesen hab, dachte ich, der TO 
sucht nach sowas. Mit dem Code war allerdings schnell klar, dass er das 
nicht sucht, sondern dass ihm nicht klar ist, dass "812" auch nur ein 
String ist, so wie "Charly" auch einer ist. Auch wenn ihn "812" an eine 
Zahl erinnert - es ist keine.
#3439475
Lesenswert?

Karl Heinz schrieb:
> Wie gross ist die 'geeignet definierte Differenz' zwischen zb
>       mayer
> und   mayr

Nun ja in dem Fall haengt es davon ab ob man den kuerzen oder den 
laengeren String als Basis nimmt.

Beim kuerzeren:

mayer
mayr
^^^---- ungleich
^^----- gleich
^------ gleich
------- gleich

Wuerde dann 80% entsprechen

Beim laengeren:

mayer
mayr
^^^^---- ungleich
^^^----- ungleich
^^------ gleich
^------- gleich
-------- gleich

hier halt 60%

Karl Heinz schrieb:
> Sowas ist zb interessant, wenn es um Ähnlichkeitssuche geht. Wir alle
> kennen das Problem: Kundendatenbank.

Oder auch das was wir alle immer benutzen: Suchmaschinen.
Das ist ja auch das Problem dabei. Je besser der Algo. ist umso 
treffender das Ergebnis.

Karl Heinz schrieb:
> Als ich die Überschrift des Threads gelesen hab, dachte ich, der TO
> sucht nach sowas.

Ich auch.
#3439476
Lesenswert?

Da nicht so ganz genau klar ist was der Themenersteller denn nun 
eigentlich will, interpretire ich dies halt mal so:

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4

5
int main()
6
{
7
    char strLength1[]="920";
8
    char strLength2[]="890";
9
    char strDiffValue[10];
10
    
11
    double difference;
12

13
    if(strcmp(strLength1, strLength2) == 0)
14
    {
15
        strcpy(strDiffValue, "0%");
16
    }
17
    else
18
    {
19
        difference = (atoi(strLength1) - atoi(strLength2)) / 100.0;
20
        sprintf(strDiffValue, "%.1f%\%", difference);
21
    }
22
    
23
    printf("strDiffValue: %s\n", strDiffValue);
24
    
25
    return 0;
26
}

Und wenn das falsch ist, schiebe ich es auf unklare Anforderungen. ;-)
Gast #3439493
Lesenswert?

Karl Heinz schrieb:
> as Prinzip besteht darin,
> festzustellen, wieviele Operationen (verändern, vertauchen, einfügen,
> löschen) von Buchstaben man benötigt, um einen String A in einen String
> B zu überführen.

Das nennt man dan gemeinhin auch Editierdistanz oder 
Levenshtein-Abstand.
#3439508
Lesenswert?

Sven P. schrieb:
> Das nennt man dan gemeinhin auch Editierdistanz oder
> Levenshtein-Abstand.

Genau darauf wollte ich hinaus.
Wobei der Verschiebungen und Vertauschungen nicht erkennt. Es gibt einen 
erweiterten Levensthein, der Vertauschungen erkennt.

Aber da der TO selbst Probleme hat Strings von Zahlen zu unterscheiden 
wird das wohl alles zu kompliziert.
#3439515
Lesenswert?

Helmut Lenzen schrieb:
> mayer
> mayr
> ^^^^---- ungleich
> ^^^----- ungleich
> ^^------ gleich
> ^------- gleich
> -------- gleich
>
> hier halt 60%

Falsch oder zumindest nicht die gängige Definition.
Bei der Ähnlichkeitssuche geht man im Allgemeinen davon aus, wie viele 
Einfüfeoperationen, Änderungen (eines Zeichens) oder Löschoperationen 
braucht man um einen Wert in den anderen zu überführen.

In dem Beispiel wäre das Löschen des 4. zeichens 'e' die einzige 
Operation, man hätte also den Abstand 1.
Bezogen auf die Wortlänge, besser hier das Minimum beider Wortlängen 
hätte man also einen relativen Abstand von 1/4 = 25% oder als Kehrwert 
die relative Übereinstimmung von 75%.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren