2016-08-02 26 views
0

Ich mag die Saiten passen und eine Punktzahl in der folgenden Art und Weise zu erhalten,Bestellen sequenzieller Text passend

string 1: 4556677, string 2: 2556677, score: 0 
    string 1: 123345873009, string 2: 123345873112, score: 9 
    string 1: 22334567, string 2: 22334500, score: 6 

So ist die Punktzahl ist gemeinsame erste n Ziffern, von links nach rechts.

Ich habe eine Liste von 100K String 1 und 30M String 2, ich möchte alle Paare (String 1 und 2) mit einem Ergebnis größer als 'x' filtern.

Gibt es einen Algorithmus, der diese Aufgabe anstelle der sequenziellen Suche nach brutaler Kraft erfüllt? Ich habe Tabellen in Apache Hive/HBase gespeichert und möchte den Ansatz entweder in Spark oder Java MapReduce implementieren. Jede Hilfe wird sehr geschätzt.

Antwort

0

Ich schließe, dass Ihre "score" die Zeichenposition ganz links darstellt, an der sich die Saiten unterschieden.

Egal "mapreduce", plain-Jane Java kann das sehr leicht machen.

**

public int score (String string1, String string2) {
        char sbuf1 [] = string1.toCharArray();
        Zeichen sbuf2 [] = string2.toCharArray();

        int complen = sbuf1.length;

        if (sbuf2.length < complen) {
                complen = sbuf2.length;
       }
        für ( int i = 0; i < complen; i ++) {
                if (sbuf1 [i]!= sbuf2 [i]) {
                        return i;
               }
       }
return -1; // zeigt keine erkannt Mismatch vor einer Zeichenfolge
erschöpft }

**

+0

Schätzen Sie Ihre Sich Zeit nehmen, zu diesem Thema. Aber dies ist ein Brute-Force-Eins-zu-Eins-Vergleich, dies würde die Anzahl der zu prüfenden Paare als "100k * 30M" machen, was nicht effizient ist, selbst wenn die Paare eliminiert werden, die nicht die gleiche erste Ziffer haben. Ich muss wissen, ob es eine Datenstruktur (baumähnlich) gibt, die eine schnelle Implementierung dieses Abgleichs ermöglicht. – Mike