php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > PHP Developer Forum
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Fragen zu Laravel, YII oder anderen PHP-Frameworks.

Antwort
 
LinkBack Themen-Optionen Thema bewerten
  #1 (permalink)  
Alt 02-09-2007, 01:55
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard 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:
(1)
  they have different names.
+ They both may be called deep and profound.
Code:
(2)
+ they have different names.
+ They both may be called deep and profound.
...
- they have different names.
(2.1)
+ The door of all subtleties!
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 | []
Mit Zitat antworten
  #2 (permalink)  
Alt 02-09-2007, 02:12
TobiaZ
  Moderator
Links : Onlinestatus : TobiaZ ist offline
Registriert seit: Jan 2001
Ort: MUC und MGL, Germany
Beiträge: 34.421
Blog-Einträge: 1
TobiaZ befindet sich auf einem aufstrebenden Ast
Standard

Anhang fehlt.
__________________
ERST LESEN: Unsere Regeln. | Ich hab schon Pferde kotzen sehn!

READ THIS: Strings richtig trennen/verbinden | JOINs, das leidige Thema | Wegwerf E-Mail Adressen

Ich werde keinen privaten 1:1 Support leisten, außer ich biete ihn ausdrücklich an.

Wenn man sich selbst als "Noob" bezeichnet, sollte man die Finger davon lassen.
Wenn man gewillt ist daran etwas zu ändern, lernt man Grundlagen!
Mit Zitat antworten
  #3 (permalink)  
Alt 02-09-2007, 02:16
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Blöde Vorschau
Angehängte Dateien
Dateityp: zip compare.zip (1,1 KB, 249x aufgerufen)
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #4 (permalink)  
Alt 02-09-2007, 02:42
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

OffTopic:
tontechniker, findest du dich in deinem code zurecht?
das sind mir eindeutig zu viele leerzeichen, aber jedem das seine.
Mit Zitat antworten
  #5 (permalink)  
Alt 02-09-2007, 02:47
ArSeN
 Registrierter Benutzer
Links : Onlinestatus : ArSeN ist offline
Registriert seit: Feb 2006
Ort: Berlin
Beiträge: 1.052
ArSeN ist zur Zeit noch ein unbeschriebenes Blatt
ArSeN eine Nachricht über ICQ schicken ArSeN eine Nachricht über AIM schicken ArSeN eine Nachricht über Yahoo! schicken
Standard

OffTopic:
dito
__________________
Nur wenige wissen, wieviel man wissen muss, um zu wissen, wie wenig man weiß.
Mit Zitat antworten
  #6 (permalink)  
Alt 02-09-2007, 02:56
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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
Dateityp: zip comparelessspace.zip (1,1 KB, 115x aufgerufen)
__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []
Mit Zitat antworten
  #7 (permalink)  
Alt 02-09-2007, 03:23
3DMax
 PHP Senior
Links : Onlinestatus : 3DMax ist offline
Registriert seit: Jan 2004
Beiträge: 1.916
3DMax ist zur Zeit noch ein unbeschriebenes Blatt
Standard

OffTopic:

Zitat:
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.
Mit Zitat antworten
  #8 (permalink)  
Alt 02-09-2007, 11:00
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
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)
Zitat:
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).
Zitat:
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 | []
Mit Zitat antworten
  #9 (permalink)  
Alt 02-09-2007, 13:05
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard Re: diff Implementation

Zitat:
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~
Mit Zitat antworten
  #10 (permalink)  
Alt 02-09-2007, 13:48
tontechniker
 PHP Senior
Links : Onlinestatus : tontechniker ist offline
Registriert seit: Jul 2005
Beiträge: 1.972
tontechniker ist zur Zeit noch ein unbeschriebenes Blatt
Standard

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:
PHP
[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:
Python
[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+1):
   for j in range(1, n+1):
PHP-Code:
for( $i=0$i $xLength$i++ ) {
   for( 
$j=0$j<$yLenght$j++ ) { 
Das Ergebnis ist folgendes:
Code:
-  they have different names.
+  they have different names.
+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.

__________________
Die Regeln | rtfm | register_globals | strings | SQL-Injections | []

Geändert von tontechniker (02-09-2007 um 14:08 Uhr)
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

Die RIGID-FLEX-Technologie
Die RIGID-FLEX-TechnologieDie sogenannte "Flexible Elektronik" , oftmals auch als "Flexible Schaltungen" bezeichnet, ist eine zeitgemäße Technologie zum Montieren von elektronischen Schaltungen.

06.12.2018 | Berni

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni


 

Aktuelle PHP Scripte

HeidiSQL - kostenloses MySQL front-end Editor für Windows ansehen HeidiSQL - kostenloses MySQL front-end Editor für Windows

HeidiSQL - ist ein Windows-Editor für die bekannt open Source Datenbank mySQL

10.12.2018 Berni | Kategorie: MYSQL/ Management
piwik Open-Source Webanalyse-Software ansehen piwik Open-Source Webanalyse-Software

piwik ist eine gute Alternative zu Google Analytics. Viele Features und ein modernes Erscheinungsbild mit aussagefähigen Statistiken in Echtzeit

10.12.2018 phpler | Kategorie: PHP/ Besucherzaehler
jQuery Mobile ansehen jQuery Mobile

Touch-Optimized Web Framework für Smartphones & Tablets

09.12.2018 phpler | Kategorie: AJAX/ Framework
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 06:56 Uhr.