diff Implementation

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • diff Implementation

    Ich bastel gerade an einem kleinen Skript was diff in PHP implementiert (Prinzip der längsten zusammenhängenden Teilfolge, Implementationen in C#. Python, Java und C++). Die Basis funktioniert einwandfrei (und produziert die gleichen Ergebnisse wie GNU-diff auf der Konsole).
    PHP-Code:
    // Diese Funktion erstellt aus der Tabelle von _longestCommonSubsequence
    // einenen diff.
    private static function _createDiff $table$x$y$i$j ) {
        
    // Die Ergebnisse werden in ein Array geschrieben welches (je nach Typ)
        // dann eine Zeile ergibt, none heißt keine Änderungen,
        // add heißt hinzufügen, remove Zeile löschen
        
    if ( $i and $j and $x $i ] == $y $j ] ) {
            
    self :: _createDiff $table$x$y$i 1$j );
            
    self :: $_result [ ] = array ( 'text' => $x $i ],
                
    'type' => self :: typeNone'line' => array ( $i$j ) );
        } else {
            if ( 
    $j and ( $i == or
                    ( !empty ( 
    $table $i ] [ $j ] ) ? $table $i ] [ $j ] : ) >=
                    ( !empty ( 
    $table $i ] [ $j ]  ) ? $table $i ] [ $j ] : ) ) ) {
                
    self :: _createDiff $table$x$y$i$j );
                
    self :: $_result [ ] = array ( 'text' => $y $j ],
                    
    'type' => self :: typeAdd'line' => $j );
            } elseif ( 
    $i and ( $j == or
                    ( !empty ( 
    $table $i ] [ $j ] ) ? $table $i ] [ $j ] : ) <
                    ( !empty ( 
    $table $i ] [ $j ]  ) ? $table $i ] [ $j ] : ) ) ) {
                
    self :: _createDiff $table$x$y$i 1$j );
                
    self :: $_result [ ] = array ( 'text' => $x $i ],
                    
    'type' => self :: typeRemove'line' => $i );
            }
        }
        
    }
    // Diese Funktion erstellt eine Tabelle in der die längsten zusammenhängenden Teilfolgen
    // makiert werden.
    private static function _longestCommonSubsequence$x$y ) {
        
    // _getLength gibt die Länge der Variable zurück
        //(Unterscheidung zwischen String und Array)
        
    $xLength self :: _getLength $x );
        
    $yLenght self :: _getLength $y );
        
    $table = array ( );
        
        for ( 
    $i 0$i $xLength$i ++ ) {
            for ( 
    $j 0$j $yLenght$j ++ ) {
                if ( 
    $i != and $j != and
                        
    trim $x [ ( $i ) ? $i ] ) ==
                        
    trim $y [ ( $j ) ? $j ] ) ) {
                    
    $table $i ] [ $j ] = $table [ ( $i ) ? $i ]
                        [ ( 
    $j ) ? $j ] + 1;
                } else {
                    
    $table $i ] [ $j ] = max ( ( $j == ) ? $table $i ] [ $j ],
                        ( 
    $i == ) ? $table $i ] [ $j ] );
                }
            }
        }
        
        return 
    $table;
        

    Bei (gleichen) Zeilen vor einer neuen Zeile gibt es allerdings ein Problem:
    Code:
    [i](1)[/i]
      they have different names.
    [COLOR=skyblue]+ They both may be called deep and profound.[/COLOR]
    Code:
    [i](2)[/i]
    [COLOR=red]+ they have different names.[/COLOR]
    [COLOR=skyblue]+ They both may be called deep and profound.[/COLOR]
    ...
    [COLOR=red]- they have different names.[/COLOR]
    [i](2.1)[/i]
    [COLOR=skyblue]+ The door of all subtleties![/COLOR]
    Statt wie erwartet (1) ohne Änderung wird die Zeile an der entsprechenden Stelle hinzugefügt (2) und vor der letzten neuen Zeile (2.1) wieder hinzugefügt. Da der Code vom Prinzip her den Implementationen entspricht kann ich das nicht nachvollziehen. Im Anhang die komplette Klasse zum Testen.
    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

  • #2
    Anhang fehlt.

    Kommentar


    • #3
      Blöde Vorschau
      Angehängte Dateien
      Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

      Kommentar


      • #4
        OffTopic:
        tontechniker, findest du dich in deinem code zurecht?
        das sind mir eindeutig zu viele leerzeichen, aber jedem das seine.

        Kommentar


        • #5
          OffTopic:
          dito
          Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.

          Kommentar


          • #6
            OffTopic:
            Also ich finde, dass es mit mehr Leerzeichen schöner aussieht ... und bei solchen integrierten If-Konstrukten ist es sowieso egal - die sind eigentlich immer unübersichtlich. Aber gerne auch nochmal ohne Leerzeichen ...
            Angehängte Dateien
            Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

            Kommentar


            • #7
              OffTopic:

              Original geschrieben von tontechniker
              ... und bei solchen integrierten If-Konstrukten ist es sowieso egal - die sind eigentlich immer unübersichtlich.
              wenn man die so schreibt wie du, gebe ich dir recht.

              schreib' einfach eine zuweisungs-zeile mehr, anstatt alles gleich in eine bedingung zu pressen.
              für dich mag vielleicht z.z. alles klar sein, aber verstehst du deinen code auch noch in x wochen, wenn du etwas ändern möchtest?
              ich habe auch schon öfter den fehler gemacht

              sorry, das hilft dir jetzt bei deinem problem nicht weiter, aber ich finde deine code-schreibweise einfach nur unübersichtlich.

              Kommentar


              • #8
                schreib' einfach eine zuweisungs-zeile mehr, anstatt alles gleich in eine bedingung zu pressen.
                OffTopic:
                In diesem Fall sind die Überprüfungen ja nur dazu da Zugriffe auf nichtexistierende Array Indizies zu verhindern (nicht geschachtelt oder so) - ich finde es wesentlich praktischer weil man zum einen auf zusätzliche Variablen verzichteten kann (wenn man für jedes Argument eine neue Variable schreibt fördert das denn Überblick meine Meinung nach nicht sonderlich). Diese Algorithmen zu implementieren ist sowieso ein Problem, entweder man hält den Code so das er auf den ersten Blick übersichtlich ist oder man verändert die Struktur so stark das man nicht mehr den gesamten Ablauf überblicken kann ... (in diesem Fall die Struktur x=y x>y x<y)
                für dich mag vielleicht z.z. alles klar sein, aber verstehst du deinen code auch noch in x wochen, wenn du etwas ändern möchtest?
                OffTopic:
                Ist ein Argument, aber bisher haben wir uns eigentlich gut darin zurechtgefunden (die ersten Zeilen im Projekt sind schon neun Monate alt).
                sorry, das hilft dir jetzt bei deinem problem nicht weiter
                OffTopic:
                Naja, es kann ja auch schon helfen die Formatierung zu Überdenken, bei diesen Tabellen kann es sein das irgendwo nur zwei Zahlen durch eine falsche Prüfung vertauscht werden. Ansonsten kannst du dir ja den Code ohne zusätzliche Leerzeichen anschauen, hab extra mal einen Regex drüberlaufen lassen.
                Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                Kommentar


                • #9
                  Re: diff Implementation

                  Original geschrieben von tontechniker
                  Da der Code vom Prinzip her den Implementationen entspricht kann ich das nicht nachvollziehen.
                  Hast es denn mit dem Code mal ausprobiert? Vielleicht besteht das Problem da ja auch schon~

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    Das Python Skript gibt wie erwartet den richtigen Code aus:
                    Code:
                        they have different names.
                    + They both may be called deep and profound.
                    + Deeper and more profound,
                    + The door of all subtleties!
                    Die erzeugten LCS Tabellen sehen allerdings ganz anders aus:
                    Code:
                    [i]PHP[/i]
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
                    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
                    [0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2]
                    [0, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3]
                    [0, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4]
                    [0, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5]
                    [0, 1, 1, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6]
                    [0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7]
                    Code:
                    [i]Python[/i]
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
                    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
                    [0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
                    [0, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2]
                    [0, 1, 1, 1, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3]
                    [0, 1, 1, 1, 2, 3, 4, 4, 4, 4, 4, 4, 4, 4]
                    [0, 1, 1, 1, 2, 3, 4, 5, 5, 5, 5, 5, 5, 5]
                    [0, 1, 1, 1, 2, 3, 4, 5, 6, 6, 6, 6, 6, 6]
                    [0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7]
                    [0, 1, 1, 1, 2, 3, 4, 5, 6, 7, 8, 8, 8, 8]
                    Bei Python wird eine Zeile mehr erzeugt.
                    EDIT:
                    Erstes Problem gelöst: Die Schleifen liefen jeweils um einen kürzer:
                    Code:
                    for i in range(1, m[b]+1[/b]):
                       for j in range(1, n[b]+1[/b]):
                    PHP-Code:
                    for( $i=0$i $xLength$i++ ) {
                       for( 
                    $j=0$j<$yLenght$j++ ) { 
                    Das Ergebnis ist folgendes:
                    Code:
                    [COLOR=deeppink]-  they have different names.
                    +  they have different names.[/COLOR]
                    +They both may be called deep and profound.
                    +Deeper and more profound,
                    +The door of all subtleties!
                    Die Ordnung stimmt jetzt, llerdings wird die Zeile immernoch gelöscht und wieder hinzugefügt.

                    Zuletzt geändert von tontechniker; 02.09.2007, 12:08.
                    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                    Kommentar

                    Lädt...
                    X