Minimalen Hammingabstand berechnen

Tina87

Mitglied
Hallo ihr lieben,
hab mal wieder ein problem beim programmieren.
ich soll eine methode verfassen, die den minimalen hammingabstand von zwei unterschiedlichen langen wörtern (bzw. strings) berechnet.
um die aufgabe etwas näher zu erklären, habe ich mir schon mal überlegt wie sie funktionieren soll:
wenn man die zwei wörter "anatolien" und "toll" hat, dann soll die methode das kürzere wort immer so lange eine position weiter verschieben, bis der minimale abstand gefunden wurde, also so:
anatolien
toll abstand:4
toll abstand:4
toll abstand:3
toll abstand:1
toll abstand:4
toll abstand:4

leider weiß ich nicht so wirklich wie ich das programmieren soll. Vielleicht bringt es was, wenn man sog. substrings verwendet, aber komme da irgendwie nicht weiter.

Um überhaupt einen lösungsansatz zu bieten, habe ich mir eine methode überlegt, wie man gleich lange strings vergleichen kann.

Java:
public class HammingDistance {
    static int hamming_distance (String a, String b) {
        
        int countSubstitutions = 0;
        for (int i=0; i<a.length(); i++)
        {
            if(a.charAt(i) != b.charAt(i))
            countSubstitutions++;
        }
        return countSubstitutions;
    }
    
    public static void main (String[ ] args) {
        String a = "till";
        String b = "tall";
        System.out.println(hamming_distance(a,b));
    }
}

hoffe ihr könnt mir sagen, wie ich das jetzt auf unterschiedlich lange strings übertragen kann.
lg
 

faetzminator

Gesperrter Benutzer
Du machst etwa folgendes (ungetestet):
Java:
String longStr = // hier der längere String
String shortStr = // kürzere
int distance = Integer.MAX_VALUE;
for (int i = 0; i < longStr.length - shortStr.length; i++) {
    distance = Math.min(distance, hammingDistance(longStr.substring(i, i + shortStr.length), shortStr));
}
return distance;
 

Tina87

Mitglied
also hab deinen tip mal auf mein prorgamm umgewandelt, das sieht dann so aus:
Java:
class test {
    static int hammingDistance (String a, String b) {


int distance = Integer.MAX_VALUE;
for (int i = 0; i < a.length() - b.length(); i++) {
    distance = Math.min(distance, hammingDistance(a.substring(i, i + b.length()), b));
}
return distance;
}

public static void main (String [ ] args) {
String a = "anatolien";
String b = "toll";
System.out.println(hammingDistance(a,b));
}
}

aber das funktioniert dann nicht. er gibt ne wilde zahlenfolge aus.
mein zweites problem ist, dass ich das programm nicht mal verstehe. Ich weiß nicht was Integer.max_value sein soll, oder was der befehl math.min macht. kann mir schon vorstellen, dass er wenn die einzelnen stellen durchläuft nachher die kleinste ausgeben soll, aber so etwas hatten wir noch gar nicht. stehe noch in den anfängen von java.
aber vielleicht kann man das auch noch länger, aber dafür simpler ausdrücken.
also wenn er nen abstand gefunden, soll er den mit dem vorherigen vergleichen und falls er kleiner ist, ihn in den alten abstand reinschreiben oder so.
 

Thief

Bekanntes Mitglied
Mir war grad langweilig. Ist sicher nicht die beste Lösung, aber funktioniert

Java:
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        int hamming = getHammingDistance("hallo", "hallolo");
        System.out.println(hamming);
    }

    static int getHammingDistance(String a, String b){
        String longerString;
        String shorterString;

        if(a.length() > b.length()){
            longerString = a;
            shorterString = b;
        }else{
            longerString = b;
            shorterString = a;
        }
        
        int dist = longerString.length() - shorterString.length()+1;

        int cnt = 0;
        int best = longerString.length();
        for(int i=0; i<dist; i++){
            for(int j=0; j<shorterString.length(); j++){
                if(longerString.charAt(i+j) != shorterString.charAt(j))
                    cnt ++;
            }
            if(cnt == 0) return dist-1; // besser geht nicht
            
            if(cnt < best)
                best = cnt;
            cnt = 0;
        }
        return best + dist-1;
    }
}
 

faetzminator

Gesperrter Benutzer
Eigentlich sollte meine Methode deine aufrufen (hammingDistance(...)):
Java:
public class Foo {

    public static void main(String[] args) {
        String a = "anatolien";
        String b = "toll";
        System.out.println(hammingDistance(a, b));

    }

    public static int hammingDistance(String a, String b) {
        String longStr = a.length() > b.length() ? a : b;
        String shortStr = a.length() > b.length() ? b : a;
        int distance = Integer.MAX_VALUE; // da distance sicher im 1. Schleifendurchgang gesetzt werden soll,
                                          // wird hier distance auf denn grösstmöglichen Wert gesetzt
        for (int i = 0; i < longStr.length() - shortStr.length(); i++) {
            int actDist = hammingDistanceSameLength(longStr.substring(i, i + shortStr.length()), shortStr);
            distance = Math.min(actDist, distance); // gibt die kleinere von beiden Zahlen zurück
        }
        return distance;
    }

    public static int hammingDistanceSameLength(String a, String b) {
        int countSubstitutions = 0;
        for (int i = 0; i < a.length(); i++) {
            if (a.charAt(i) != b.charAt(i)) {
                countSubstitutions++;
            }
        }
        return countSubstitutions;
    }
}
 
Zuletzt bearbeitet:

Sonecc

Gesperrter Benutzer
Java:
void hamming(String a, String b, int pos) {
		if (pos == (a.length()-b.length()+1)) {
			return;
		}
		int n = 0;
		int j = 0;
		for (int i = 0; i < b.length(); i++) {
			if (a.charAt(i+pos) != b.charAt(j)) {
				n++;
			}
			j++;
		}
		System.out.println(b + " abstand:" + n);
		hamming(a, b, (pos+1));
	}

aufruf erfolgt über :

Java:
hamming("anatolien", "toll", 0);

Ausgabe ist:

Code:
toll abstand:4
toll abstand:4
toll abstand:3
toll abstand:1
toll abstand:4
toll abstand:4
 
G

Gast2

Gast
Java:
public class Main
{

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        String a = "anatolien";
        String b = "toll";

        System.out.println("String1: " + a);
        System.out.println("String2: " + b);
        System.out.println("MinHammingabstand: " + minimumHamming(a, b));
    }

    private static int minimumHamming(String a, String b)
    {
        int lenA = a.length();
        int lenB = b.length();
        int diff = lenA - lenB;

        int minimum = Integer.MAX_VALUE;
        for (int i = 0; i <= Math.abs(diff); i++) {
            String subA = a.substring((diff >= 0) ? i : 0, (diff >= 0) ? (i + lenB) : lenA);
            String subB = b.substring((diff <= 0) ? i : 0, (diff <= 0) ? (i + lenA) : lenB);

            minimum = Math.min(minimum, hammingDistance(subA, subB));
        }

        return minimum;
    }

    private static int hammingDistance(String a, String b) throws IllegalArgumentException
    {
        if (a.length() != b.length()) throw new IllegalArgumentException("String a und b sind nicht gleich lang");

        int counter = 0;
        for (int i = 0; i < a.length(); i++) {
            if (a.charAt(i) != b.charAt(i)) counter++;
        }

        return counter;
    }

}
 

Tina87

Mitglied
Danke für eure lösungsvorschläge.
hab mich jetzt für die von "faetzminator" entschieden.
ein kleines problem hab ich da noch. wie du schon gesagt hast, greift deine methode auf meine alte zu. lieber wäre es mir aber, wenn alles nur eine methode wäre.
hat mir das dann so überlegt:
Java:
public class test {
 
    public static void main(String[] args) {
        String a = "anatolien";
        String b = "toll";
        System.out.println(hammingDistance(a, b));
 
    }
 
    static int hammingDistance(String a, String b) {
        
        int distance = Integer.MAX_VALUE; //distance auf denn grösstmöglichen Wert gesetzt
        int latestDistance = 0;
        int countSubstitutions = 0;
        for (int i = 0; i < a.length() - b.length(); i++) 
        {
            String c = String a.substring(j,j+ b.length());
            for (int j=0; j<c.length();j++)
            {
                if ( c.charAt(j) != b.charAt(j))
                {
                    countSubstitutions++;
                }
                latestDistance=countSubstitutions;
                distance = Math.min(latestDistance, distance); // gibt die kleinere von beiden Zahlen zurück
            }
        }
        return distance;
    }
}
funktioniert natürlich so nicht, aber geht das so etwa in die richtung, um die methoden zusammenzufügen?
 

Thief

Bekanntes Mitglied
Tina, das wäre exakt meine Lösung, was du da versuchst (also mit zwei for-Schleifen ineinander)... ?!

edit: der Rest war Quatsch. Hab zwei Benutzer verwechselt *g*

edit2: ach, kann sein dass das Return falsch ist. Für mich unterscheiden sich z.B. "Hallo" und "lo" an mind. 3 Stellen, da ja "lo" kürzer ist als "Hallo". Falls das egal ist, muss natürlich nur best zurück gegeben werden, und nicht best + dist-1.
 
Zuletzt bearbeitet:

faetzminator

Gesperrter Benutzer
In einer Methode würde das folgendermassen aussehen:
Java:
public class Foo {

    public static void main(String[] args) {
        String a = "anatolien";
        String b = "toll";
        System.out.println(hammingDistance(a, b));

    }

    public static int hammingDistance(String a, String b) {
        String longStr = a.length() > b.length() ? a : b;
        String shortStr = a.length() > b.length() ? b : a;
        int distance = Integer.MAX_VALUE; // da distance sicher im 1. Schleifendurchgang gesetzt werden soll,
                                          // wird hier distance auf denn grösstmöglichen Wert gesetzt
        for (int i = 0; i <= longStr.length() - shortStr.length(); i++) {
            String secondStr = longStr.substring(i, i + shortStr.length());
            int countSubstitutions = 0;
            for (int j = 0; j < shortStr.length(); j++) {
                if (shortStr.charAt(j) != secondStr.charAt(j)) {
                    countSubstitutions++;
                }
            }
            distance = Math.min(countSubstitutions, distance); // gibt die kleinere von beiden Zahlen zurück
        }
        return distance;
    }
}

Ich finde diese Methode allerdings etwas überladen... Aber ist Geschmackssache ;)
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Volatility berechnen Java Basics - Anfänger-Themen 4
P Medaillen Spiegel der Wander Teilnahmen berechnen. Java Basics - Anfänger-Themen 3
M OOP Brüche nicht richtig berechnen Java Basics - Anfänger-Themen 3
V Durchschnittliche Volatility in Prozent für 4 Stunden berechnen Java Basics - Anfänger-Themen 14
T Fibonacci mit einer Hilfsmethode berechnen Java Basics - Anfänger-Themen 10
laxla123 Quersumme berechnen Java Basics - Anfänger-Themen 1
I For Schleife Summe berechnen Java Basics - Anfänger-Themen 13
S Vollmond berechnen und ausgeben Java Basics - Anfänger-Themen 12
S Vollkommene Zahl berechnen und ausgeben Java Basics - Anfänger-Themen 16
A Berechnen Moor Nachbarschaft Java Basics - Anfänger-Themen 5
E Geburtstag im Schaltjahr berechnen Java Basics - Anfänger-Themen 24
Lion.King Schaltjahr berechnen Java Basics - Anfänger-Themen 31
E Alter (Laufzeit) berechnen Java Basics - Anfänger-Themen 11
I Zuschläge berechnen Java Basics - Anfänger-Themen 15
L mit Fakultät mathematische Formel berechnen Java Basics - Anfänger-Themen 5
TanTanIsTrying Durschnitt berechnen von eingegebener Zahl bis 1 heruntergezählt Java Basics - Anfänger-Themen 9
L Präfix berechnen Java Basics - Anfänger-Themen 33
F Abstand zwischen zwei Objekten berechnen wie? Java Basics - Anfänger-Themen 1
Aemulit Java Schaltjahr berechnen Code Java Basics - Anfänger-Themen 7
Poppigescorn Quersumme Berechnen mit einer While Schleife Java Basics - Anfänger-Themen 13
I Potenz berechnen mit for-Schleife Java Basics - Anfänger-Themen 3
A Standardabweichung in Java berechnen Java Basics - Anfänger-Themen 10
H Gesamtabweichung mit Array berechnen Java Basics - Anfänger-Themen 2
G Java Rabatt berechnen Java Basics - Anfänger-Themen 8
V Rückgeld berechnen Java Basics - Anfänger-Themen 6
eleonori Durchschnitt aller Werte eines Baums berechnen Java Basics - Anfänger-Themen 5
Ianatrix Zahlen von a bis b berechnen Java Basics - Anfänger-Themen 7
L Max, min, Summe und Durchschnitt berechnen Java Basics - Anfänger-Themen 4
L Anhalteweg berechnen Java Basics - Anfänger-Themen 6
Aeon Erste Schritte Preise berechnen mit do-while Java Basics - Anfänger-Themen 9
M Quadratwurzel berechnen Java Basics - Anfänger-Themen 8
V Wachstum berechnen und in Ist-Formel verwenden Java Basics - Anfänger-Themen 5
N Variable aus anderen Variablen in statischer Klasse berechnen/abspeichern? Java Basics - Anfänger-Themen 4
M Abschreibungsplan berechnen Java Basics - Anfänger-Themen 23
V Gehalt berechnen in Java Java Basics - Anfänger-Themen 6
justemii Gehalt berechnen - Aufgabe Java-Programm Java Basics - Anfänger-Themen 9
L Anzahl der benachbarten Minen berechnen und setzen Java Basics - Anfänger-Themen 15
J Array Speicherplatz berechnen Java Basics - Anfänger-Themen 35
H Eingabedaten berechnen Java Basics - Anfänger-Themen 9
B Tranportkosten berechnen mit unterschiedlichen MwSt Java Basics - Anfänger-Themen 9
L Anzahl der Paare deren Summe = 0 ergibt berechnen Java Basics - Anfänger-Themen 0
V Erste Schritte Berechnen von Sinus; sin(x) ohne Math.* Java Basics - Anfänger-Themen 1
J Hilfe bei Java Aufgabe (Restschuld berechnen) Java Basics - Anfänger-Themen 11
N Ein Datum berechnen Java Basics - Anfänger-Themen 3
T Sparplan berechnen Java Basics - Anfänger-Themen 4
F Abstand zum Durchschnitt von 5 Zahlen berechnen... Java Basics - Anfänger-Themen 16
B java.util.Date berechnen Java Basics - Anfänger-Themen 11
P Mittelwert Arrayelemente berechnen Fehler Java Basics - Anfänger-Themen 5
CptK Best Practice Schussparabel berechnen Java Basics - Anfänger-Themen 3
T Modulo / Pow berechnen Java Basics - Anfänger-Themen 4
E Statistische Kennzahlen berechnen Java Basics - Anfänger-Themen 2
F Switch Case Modulo berechnen Java Basics - Anfänger-Themen 12
B mehrere Werte mit scanner und while schleife einlesen, max berechnen bzw addieren Java Basics - Anfänger-Themen 2
C Preis berechnen mit Java Java Basics - Anfänger-Themen 4
B Zahl in String abspeichern und später berechnen Java Basics - Anfänger-Themen 15
N Best Practice Image recognition fuzzy Superhash berechnen Java Basics - Anfänger-Themen 1
Dawinartor Erste Schritte Schaltjahr berechnen Java Basics - Anfänger-Themen 1
L Pi berechnen Java Basics - Anfänger-Themen 1
CptK Term (als String) berechnen und ausgeben Java Basics - Anfänger-Themen 10
L Den Winkel zwischen zwei Vektoren berechnen! Java Basics - Anfänger-Themen 2
J Variablen arithmetischen Mittelwert berechnen Java Basics - Anfänger-Themen 5
K Matrixen berechnen nach Worker Master Paradigma mit Threads Java Basics - Anfänger-Themen 4
R Winkel berechnen bzw. Geraden sortieren Java Basics - Anfänger-Themen 33
I Schnittpunkt zweier Geraden berechnen Java Basics - Anfänger-Themen 25
M Erste Schritte Mittelwert berechnen -> Methode in der Methode? Java Basics - Anfänger-Themen 14
S Compiler-Fehler Schaltjahr berechnen Java Basics - Anfänger-Themen 5
B Fakultätsfunktion Rekursiv Berechnen aber mit Array Java Basics - Anfänger-Themen 10
S Durchschnitt berechnen aus zwei Textfeldern Java Basics - Anfänger-Themen 21
D Summe berechnen mit verändertem Wert aus Schleife Java Basics - Anfänger-Themen 1
R Liga Berechnen Java Basics - Anfänger-Themen 1
P Klassen Berechnen mehrerer Map-Werte Java Basics - Anfänger-Themen 13
R Fussballtabellen berechnen Java Basics - Anfänger-Themen 12
J Fibonacci -Folge rekursiv berechnen Java Basics - Anfänger-Themen 18
J Durchschnitt jeder Zeile und und Spalte in einem 2D Arrays berechnen Java Basics - Anfänger-Themen 6
F ISBN Prüfziffer berechnen Java Basics - Anfänger-Themen 17
F Die Teilersumme einer Eingabe berechnen Java Basics - Anfänger-Themen 11
S Negafibonacci Folge berechnen Java Basics - Anfänger-Themen 24
G Array Mittelwert berechnen, wie? Java Basics - Anfänger-Themen 8
S Primzahlen berechnen funktioniert nicht richtig Java Basics - Anfänger-Themen 1
N Mit LocalDate alter berechnen Java Basics - Anfänger-Themen 3
J Laufzeit berechnen/Laufzeitanalyse Java Basics - Anfänger-Themen 2
N Arrays mit Zufallzahlen füllen und Statistiken berechnen Java Basics - Anfänger-Themen 5
A Wochentag berechnen Java Basics - Anfänger-Themen 10
Ste3et_C0st Vectoren berechnen Java Basics - Anfänger-Themen 8
L Durchschnitt in der Schleife berechnen Java Basics - Anfänger-Themen 11
A Kreisumfang/-Fläche vom Kreis berechnen Java Basics - Anfänger-Themen 39
L Wochentag berechnen Java Basics - Anfänger-Themen 5
L Rekursive Methode a * b berechnen Java Basics - Anfänger-Themen 2
B OOP Summe aus verschiedenen Instanzen einer Klasse berechnen Java Basics - Anfänger-Themen 2
N Dauer zwischen zwei LocalDateTime Objekten berechnen? Java Basics - Anfänger-Themen 4
P Ausdrücke berechnen Java Basics - Anfänger-Themen 2
V Mittelwert berechnen Java Basics - Anfänger-Themen 31
H Datentypen Tage zwischen zwei Datums berechnen Java Basics - Anfänger-Themen 4
P Quadrate berechnen Java Basics - Anfänger-Themen 3
S OOP Datumsunterschied in Tagen berechnen Java Basics - Anfänger-Themen 3
M Methoden Aus Timestamp das Datum berechnen Java Basics - Anfänger-Themen 3
B Schaltjahre berechnen! Java Basics - Anfänger-Themen 1
A werte in einem String berechnen Java Basics - Anfänger-Themen 3
F Checksummen aus int-Array berechnen Java Basics - Anfänger-Themen 3
F Toto-Tipp-Reihen berechnen Java Basics - Anfänger-Themen 1

Ähnliche Java Themen

Neue Themen


Oben