Einzelnen Beitrag anzeigen

Amateurprofi

Registriert seit: 17. Nov 2005
Ort: Hamburg
1.041 Beiträge
 
Delphi XE2 Professional
 
#47

AW: Erstellung einer Funktion

  Alt 6. Jun 2021, 16:37
Nicht "oder so", sondern nur so wie Profi .
Es gibt allerdings einen Unterschied: #37 liefert wie in #26 verlangt den String, #38 die Position.
Zeitlich bewegen wir uns im gleichen Rahmen. Profi nutzt aus, dass Strings Null-terminiert sind, muss aber die =#0 Abfrage bei jedem Zeichen ausführen, #37 "einmal" am Schluss *.
Hallo Michael,
Zu "#37 liefert wie in #26 verlangt den String, #38 die Position"
Nee, #28 liefert die Länge der Ziffernfolge
Um die Ziffernfolge selbst zu liefern, bedarf es einiger kleiner Änderungen.
Hier die Funktion, die die Ziffernfolge liefert
Delphi-Quellcode:
FUNCTION LongestCipherSequence(const S:String):String;
var MaxLen:Integer; P,PS,PSMax,PStart:PChar;
begin
   MaxLen:=0;
   PStart:=PChar(S);
   P:=PStart;
   if P<>Nil then
      repeat
         case P^ of
            #0 : Break;
            '0'..'9' : begin
                           PS:=P;
                           Inc(P);
                           while P^ in ['0'..'9'] do Inc(P);
                           if P-PS>MaxLen then begin
                              MaxLen:=P-PS;
                              PSMax:=PS;
                           end;
                        end;
            else Inc(P);
         end;
      until False;
   if MaxLen=0 then Result:=''
      else Result:=Copy(S,PSMax-PStart+1,MaxLen);
end;
Zu "muss aber die =#0 Abfrage bei jedem Zeichen ausführen, #37 "einmal" am Schluss"
Nee, stimmt nicht.
Beim While wird ebenfalls bei jedem Zeichen geprüft, ob I >= len_s ist.
Vom Zeitaufwand her macht das keinen Unterschied.

Ich habe mal kurz das Zeitverhalten getestet. Gleiche Größenordung bei beiden Funktionen.
Ergebnis siehe Anhang:

Man könnte das Zeitverhalten noch optimieren:
Wenn bereits eine Ziffernfolge gefunden wurde, kann man beim Finden der nächsten Ziffer prüfen, ob das Zeichen an P+Maxlen eine Ziffer ist.
Wenn nicht, kann die Ziffernfolge nicht länger sein, als die bisher längste.
Dann kann man P = P+MaxLen setzen, muss also nicht jedes Zeichen separat prüfen.
Das lohnt sich aber nur, wenn wirklich lange Strings mit vielen Ziffern geprüft werden sollen, ansonsten wird das eher zu einem höheren Zeitbedarf führen.


Delphi-Quellcode:
PROCEDURE TMain.Test;
const Lines=10000; MaxLen=200; Rnd=12; Count=1000;
var I,J,Len:Integer; T0,T1,T2:Cardinal; S:String; List:TStrings;
begin
   List:=TStringList.Create;
   for I:=1 to Lines do begin
      Len:=Random(MaxLen);
      SetLength(S,Len);
      for J:=1 to Len do
         S[J]:=Char(Random(Rnd)+Ord('0'));
      List.Add(S)
   end;
   T0:=GetTickCount;
   for I:=1 to Count do
      for J:=0 to List.Count-1 do
         LongestCipherSequence(List[J]);
   T1:=GetTickCount;
   for I:=1 to Count do
      for J:=0 to List.Count-1 do
      LaengsteZiffernFolgeDerWelt(List[J]);
   T2:=GetTickCount;
   ShowMessage(IntToStr(T1-T0)+' LongestCipherSequence'#13+
               IntToStr(T2-T1)+' LaengsteZiffernFolgeDerWelt');
   List.Free;
end;
Miniaturansicht angehängter Grafiken
unbenannt.jpg  
Gruß, Klaus
Die Titanic wurde von Profis gebaut,
die Arche Noah von einem Amateur.
... Und dieser Beitrag vom Amateurprofi....
  Mit Zitat antworten Zitat