Gibt es möglichkeiten eine vergleichsroutine schneller zu machen?
vorgegeben sind 2 strings zum vergleichen, bei übereinstimmung soll string 1 geändert werden.
z.b
string1 kommt aus datei1, die 1mb groß ist.
string2 kommt aus datei2, welche 50k groß ist.
jetz muss ich string1 mit JEDEM string2 vergleichen, bis etwas gefunden wird ( und wenn es der letzte string aus datei2 ist )
erst wenn string1 mit allen string2 verglichen bzw etwas gefunden wurde kommt der nächste string1.
das ganze dauert bei mir ewig, ich verwende zum vergleichen ein einfaches IF ( string1 = string2 )
gibt es möglichkeiten zb. vorheriges sortieren, arrays, hash
um dies zu beschleunigen.
wie lange dauert ein einziger vergleich?
ist es besser bei einem string mit 50 zeichen nur die ersten 3 zu vergleichen und nur wenn diese stimmen den rest zu vergleichen?
über eine antwort würde ich mich sehr freuen!
THX
User since
2003-08-04
704
Artikel
BenutzerIn
also hast du zwei for-schleifen in deinem skript?
du hast ja eine moegliche loesung schon genannt:
du kannst z.b. die strings aus datei2 als keys in einen hash packen.
dann reduziert sich die abfrage auf einen hashzugriff.
Quote%strings_aus_datei_2 = build_hash ("datei2");
foreach my $string (aus "datei1") {
if (defined $strings_aus_datei_2{$string}) {
do_stuff ();
}
}
-- stefan
User since
2003-08-04
14371
Artikel
ModeratorIn
[quote=Guest,27.07.2004, 16:02]das ganze dauert bei mir ewig, ich verwende zum vergleichen ein einfaches IF ( string1 = string2 )[/quote]
Übrigens: Strings vergleicht man mit
eq...
Also z.B.:
if('string' eq 'hallo'){
print "The strings are equal\n";
}
Ich würde es auch auf jeden Fall mit dem Hash machen...
User since
2004-01-29
828
Artikel
BenutzerIn
Edit: Ups, verlesen...\n\n
<!--EDIT|sri|1090938513-->
User since
2003-08-04
2536
Artikel
ModeratorIn
Edit: mhkay, ohne sri's beitrag macht meiner irgendwie keinen sinn ;)\n\n
<!--EDIT|jan|1090938719-->
User since
2003-08-04
704
Artikel
BenutzerIn
da fallen mir noch zwei module ein:
1.
Tree::Trie
ein trie ist ein baum, bei dem die zeichen eines strings einen pfad in einem baum bilden. das kann aber mehr als du brauchst.
2.
Set::Scalar
du kannst die strings aus datei1 als menge betrachten, da dich die reihenfolge nicht interessiert. kann ebenfalls zu viel.
der hash reicht ;-)
-- stefan