tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
11
ZUGRIFFE
389
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    3abd 3abd ist offline Rookie
    Registriert seit
    Jan 2012
    Beiträge
    6
    Hallo zusamen
    ich habe ein Algorithmus Boyer Moore in java der lauffähig ist. für den text Eingabe möchte ich nicht immer manuell eingeben, sondern nur als textdatei der mir halt liest und vergleicht mit Muster das ich möchte. Hat jemand eine Idee vielen dank im Vorraus
    den Code sieht so aus:
    import java.util.Map;

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    
     public class BoyerMoore {
        public static List<Integer> match(String pattern, String text) {
            List<Integer> matches = new ArrayList<Integer>();
            int m = text.length();
            int n = pattern.length();
            
     
            Map<Character, Integer> rightMostIndexes = preprocessForBadCharacterShift(pattern);
        
            int alignedAt = 0;
            while (alignedAt + (n - 1) < m) {
     
                for (int indexInPattern = n - 1; indexInPattern >= 0; indexInPattern--) {
                    int indexInText = alignedAt + indexInPattern;
                    char x = text.charAt(indexInText);
                    char y = pattern.charAt(indexInPattern);
     
                    if (indexInText >= m)
                        break;
     
                    if (x != y) {
     
                        Integer r = rightMostIndexes.get(x);
     
                        if (r == null) {
                            alignedAt = indexInText + 1;
                        }
     
                        else {
                            int shift = indexInText - (alignedAt + r);
                            alignedAt += shift > 0 ? shift : 1;
                        }
     
                        break;
                    }
                    else if (indexInPattern == 0) {
                        matches.add(alignedAt);
                        alignedAt++;
                    }
     
                }
            }
            return matches;
        }
        private static Map<Character, Integer> preprocessForBadCharacterShift(
                String pattern) {
            Map<Character, Integer> map = new HashMap<Character, Integer>();
            for (int i = pattern.length() - 1; i >= 0; i--) {
                char c = pattern.charAt(i);
                if (!map.containsKey(c)) map.put(c, i);
            }
     
            return map;
        }
        public static void main(String[] args) {
            List<Integer> matches = match("abb", "bacbabcababcabb");
            for (Integer integer : matches) System.out.println("Match at: " + integer);
            System.out.println((matches.equals(Arrays.asList(1, 3)) ? "OK" : "Failed"));
     
        }
     }
    Geändert von sheel (27.01.12 um 01:41 Uhr) Grund: Codetags
     

  2. #2
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Hi und Willkommen bei tutorials.de,

    bitte beschreib dein Problem genauer.
    Hab keine Ahnung, was du willst.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  3. #3
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Moin und auch von mir ein Herliches Willkommen

    Wo ist denn das Problem? Du musst doch dann einfach nur eine Datei einlesen und den eingelesenen Inhalt an die Methode match übergeben.
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  4. #4
    3abd 3abd ist offline Rookie
    Registriert seit
    Jan 2012
    Beiträge
    6
    Hi sheel,
    Wie man sieht ganz unten ich habe Muster : abb und Text : bacbabcababcabb ich möchte halt eine methode implementieren, die mir egal welchen Textdatei ich habe und bis 2 Gb groß ist, mit mein Muster abb vergleichen kann und schaue, ob da ein match gibt oder nicht
    d.h. ob "abb" in diesem Text vorkommt oder nicht.
     

  5. #5
    Avatar von Akeshihiro
    Akeshihiro Akeshihiro ist offline Mitglied Platin
    Registriert seit
    Aug 2008
    Ort
    Kirchlengern (NRW)
    Beiträge
    647
    Und wo ist dabei das Problem oder die Schwierigkeit?
    Zitat Zitat von Akeshihiro
    Du musst doch dann einfach nur eine Datei einlesen und den eingelesenen Inhalt an die Methode match übergeben.
    Einfach eine Methode implementieren, die die Datei stumpf einliest und den Inhalt zurückgibt. Den übergibst du dann an deine Methode und gut is.

    Ich hab ein bisschen das Gefühl, dass du gar nicht weißt, wie man mit Dateien arbeitet oder?
     
    Man sagt, das Schwert eines Samurai sei seine Seele ...

    Mit den Beiträgen ist es wie mit Schwertern: Je besser die Rohstoffe sind und je öfter man diese bearbeitet, desto hochwertiger sind sie.

    Das Schmieden ist eine Kunst; Das Schreiben auch ;)

  6. #6
    3abd 3abd ist offline Rookie
    Registriert seit
    Jan 2012
    Beiträge
    6
    Hi Akeshihiro,
    ich habe keine Ahnung.
    ich habe´s versucht mit BufferReader und anderen Methoden aber wie ich das um setze konnte ich nicht, deswegen bitte um die Hife
     

  7. #7
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    (Hab die PN bekommen, aber du kannst ruhig im Thread weiterschreiben)

    Also...Eine Datei einfach nur einlesen dürfte mit "Filestream Java" in Googe nicht so schwer fallen.

    2GB kannst du aber nicht in einem Stück einlesen, um die Datei als String zu haben.
    Auch, wenn du den GC danach manuell leerst (was nicht unbedingt empfehlenswert ist,
    falls Java das überhaupt mitmacht).
    (Und nein, nur weil man 4GB RAM hat, bekommt Java davon nicht automatisch alles.).

    Du musst dein match so umschreiben, dass es immer einen Teil der Datei im Speicher hat,
    und bei Bedarf den nächsten Block einliest.

    Und was ist mit Userzeit/Systemzeit?
    Wenn du die Dauer berechnen willst, musst du nur
    -Am Anfang die Zeit ermitteln
    -am Ende die Zeit ermitteln
    -Subtrahieren.

    PS:
    @Akeshihiro: Laut PN ist die Datei 2GB groß,
    sollte also mit einem Schritt problematisch werden.
    @3abd: Bitte Forumsuche und Google.
    Es gibt so viele Seiten, auf denen das schon ausführlich erklärt ist.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  8. #8
    3abd 3abd ist offline Rookie
    Registriert seit
    Jan 2012
    Beiträge
    6
    Mit user zeit und system zeit ist Cpu zeit, damit ich eine genau zeit der bearbeitung bekomme ohne nebenläufige prozesse die die CPU zeit beeinträchtigen.
     

  9. #9
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    Das ist mit Java und/oder Windows generell unmöglich.

    Zitat Zitat von 3abd Beitrag anzeigen
    Mit user zeit und system zeit ist Cpu zeit
    Und Grammatik würde wirklich beim verstehen helfen.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  10. #10
    3abd 3abd ist offline Rookie
    Registriert seit
    Jan 2012
    Beiträge
    6
    Ich bemühe mich die frage richtig zu stellen.kann man was mit
    cpuStart = threadMX.getCurrentThreadCpuTime();
    userStart = threadMX.getCurrentThreadUserTime();
    was anfangen?
    komme ich nicht weiter
    danke im Vorraus!
     

  11. #11
    Avatar von sheel
    sheel sheel ist gerade online Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.504
    "...may choose any time..."
    Genau ist das auch nicht.
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  12. #12
    3abd 3abd ist offline Rookie
    Registriert seit
    Jan 2012
    Beiträge
    6
    ich muss so wieso mehrere Male jeden Text mit Algorithmus laufen lassen und notiere mir halt die beste Zeit.
     

Ähnliche Themen

  1. Aus Textdatei lesen verschieben
    Von klanawagna im Forum .NET Datenverwaltung
    Antworten: 1
    Letzter Beitrag: 11.08.09, 18:22
  2. [c++] Variablen aus Textdatei lesen
    Von guddy im Forum C/C++
    Antworten: 5
    Letzter Beitrag: 23.07.08, 15:58
  3. Zufallszeile aus Textdatei lesen
    Von Mailyn im Forum Visual Basic 6.0
    Antworten: 2
    Letzter Beitrag: 10.08.06, 08:39
  4. Zeilenweise aus Textdatei lesen
    Von DanielBodensee im Forum PHP
    Antworten: 2
    Letzter Beitrag: 17.06.04, 07:09
  5. aus textdatei lesen und schreiben
    Von Mr.Fies im Forum PHP
    Antworten: 2
    Letzter Beitrag: 18.06.02, 21:00