Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Nextchar Algo zu langsam (https://www.delphipraxis.net/96335-nextchar-algo-zu-langsam.html)

xtZ 22. Jul 2007 20:13


Nextchar Algo zu langsam
 
Hallo,
Ich hoffe ich bin hier richtig.

Ich habe gerade eben folgenden Algo geschrieben:
Er soll immer die nächste Zeichenkette liefern.
z.b.:
nextchar('abc','a') = b
nextchar('abc','c') = aa
nextchar('abc','ab') = ac
usw...

Delphi-Quellcode:
function nextchar(const scharset,sword:string):string;
var
  slastchar:string;
  l,f:integer;
begin
  l:=length(sword);
  f:=length(scharset);

  slastchar := sword[l];

  if stringofchar(scharset[f],l) = sword then begin
    result := stringofchar(scharset[1],l+1)
  end
  else begin
    if slastchar = scharset[f] then begin
      result := nextchar(scharset,copy(sword,1,l-1))+scharset[1]
    end
    else begin
      slastchar := copy(scharset,pos(slastchar,scharset)+1,1);
      result := copy(sword,1,l-1)+slastchar
    end;
  end;
end;
Er funktioniert soweit auch ganz gut, aber er ist mir zu langsam, wenn er oft wiederholt wird. :gruebel:
Bsp.:
Delphi-Quellcode:
var
  s:string;
  f:textfile;
begin
  AssignFile(f, 'C:\test.txt');
  ReWrite(f);

  s:='a';

  repeat
    writeln(f,s);
    s:=nextchar('abcdefghijklmnopqrstuvwxyz',s);
  until s = 'zzzzz';

  closefile(f);
Hat vll jemand ein paar Ideen, wie man ihn optimieren kann, damit er schneller läuft?
Gibt es vll einen schnelleren Ersatz für die "copy" oder "stringofchar" Funktion etc.?


Danke :)

Klaus01 22. Jul 2007 20:26

Re: Nextchar Algo zu langsam
 
Was ist der tiefere Sinn dahinter wenn

nextchar('abc','c') = aa
nextchar('abc','ab') = ac
liefert?

nextchar('abc','a') = b - das verstehe ich noch
nextchar('abc','c') = aa - das nicht mehr, nach dem c gibt es kein Zeichen mehr
nextchar('abc','ab') = ac - das verstehe ich auch nicht, denn das Zeichen nach ab ist c

Grüße
Klaus

Dax 22. Jul 2007 20:33

Re: Nextchar Algo zu langsam
 
Der dargestellte Algorithmus berechnet aus einen Zeichensatz (Parameter 1) und einer Permutation (Parameter 2) dieses Zeichensatzes die jeweils nächste. Dazu gibt's in der Codelib unter PermutationPermutation bestimmt auch was ;)

Bernhard Geyer 22. Jul 2007 20:33

Re: Nextchar Algo zu langsam
 
Const-Angabe bei Strings bringt einiges an Performance da hiermit der overhead der referenzzählung bei Strings nicht mehr nötig ist.

Delphi-Quellcode:
function nextchar(const scharset, sword:string): string;

xtZ 22. Jul 2007 20:34

Re: Nextchar Algo zu langsam
 
Zitat:

Zitat von Klaus01
Was ist der tiefere Sinn dahinter wenn

nextchar('abc','c') = aa
nextchar('abc','ab') = ac
liefert?

nextchar('abc','a') = b - das verstehe ich noch
nextchar('abc','c') = aa - das nicht mehr, nach dem c gibt es kein Zeichen mehr
nextchar('abc','ab') = ac - das verstehe ich auch nicht, denn das Zeichen nach ab ist c

Grüße
Klaus

Wieso keinen Sinn, es generiert sozusagen alle Kombinationsmöglichkeiten aus dem Charset, also so eine Art Brute Force Methode.

xtZ 22. Jul 2007 20:38

Re: Nextchar Algo zu langsam
 
Zitat:

Zitat von Bernhard Geyer
Const-Angabe bei Strings bringt einiges an Performance da hiermit der overhead der referenzzählung bei Strings nicht mehr nötig ist.

Delphi-Quellcode:
function nextchar(const scharset, sword:string): string;

Danke, werde ich gleich mal testen.

SirThornberry 22. Jul 2007 20:51

Re: Nextchar Algo zu langsam
 
du rufst zudem length mehrfach auf. Rufe es nur einmal auf und speicher dir das Ergebnis in einer Variablen.
Und bist du dir sicher das dein aktueller algorythmus funktioniert? Weder mit '1234567890' noch mit '0123456789' als scharset funktioniert es wenn ich als sword '9' übergebe.

Damit es schneller läuft würde ich an deiner Stelle auf die Funktion NextChar ganz verzichten und gleich in der Schleife hochzählen. Denn so musst du jedesmal erst die aktuelle Zahl analysieren. Wenn du gleich von Anfang an in der Schleife hochzählst geht es schneller da die analyse weg fällt.

xtZ 22. Jul 2007 21:05

Re: Nextchar Algo zu langsam
 
Zitat:

Zitat von SirThornberry
du rufst zudem length mehrfach auf. Rufe es nur einmal auf und speicher dir das Ergebnis in einer Variablen.
Und bist du dir sicher das dein aktueller algorythmus funktioniert? Weder mit '1234567890' noch mit '0123456789' als scharset funktioniert es wenn ich als sword '9' übergebe.

Hab das mit den Variablen mal geändert.

Hast Recht, wenn man als sword nicht den ersten char aus scharset übergibt, funktioniert er nicht richtig :pale:

//Edit
Ist aber nicht weiter schlimm...
Kann man den Code vll in inline asm umschreiben?

Thx.

Bernhard Geyer 22. Jul 2007 22:30

Re: Nextchar Algo zu langsam
 
Und hier die gleiche Frage bei Delphi-Forum.
Wenn schon Doppelpost dann bitte verlinken.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:42 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz