AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Erstellung einer Funktion

Ein Thema von Mo53 · begonnen am 3. Jun 2021 · letzter Beitrag vom 10. Jun 2021
 
Michael II

Registriert seit: 1. Dez 2012
Ort: CH BE Eriswil
778 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: Erstellung einer Funktion

  Alt 6. Jun 2021, 00:47
Da der zu durchsuchende String beim Aufruf der Funktion vollständig bekannt ist: Verzichte möglichst auf "teure" Additionen von Strings: Es macht zum Beispiel genau 0 Sinn, wenn du jede auftretende Ziffernfolge aufaddierst, diese abspeicherst, nur um sie später wieder zu verwerfen, wenn du eine längere Folge gefunden hast. - Stringoperationen kosten viel, Integerops wenig.

Merke dir also nur Start und Länge der jeweils "maximalen" Folge und nicht den Zeichensalat.

Beispiel:
A0022DJIOE390220DJIWOEDJ390J3

An Position i=1 liest du A und tust nix.
An i=2 liest du 0. Du merkst dir start=2, dann liest du 0, 2, 2.
Bei i=6 liest du "D"; also keine Ziffer mehr. Du hast die erste Ziffernfolge gefunden: Laenge = i-start = 6-2 = 4. Du merkst dir die momentan längste Folge, indem du maxstart=start=2 und maxlaenge=laenge=4 speicherst.

Es folgen keine Ziffern bis und mit i=10. Du tust nix.
Bei i=11 liest du eine 3. Du merkst dir start=11. Bei i=17 "D" ist die Ziffernfolge zu Ende. Die Laenge = i-start beträgt Laenge=17-11 = 6. Laenge=6 ist grösser als die bisherige maxlaenge=4 => Du merkst dir maxstart=11 maxlaenge=6 usw.

Am Ende weisst du, dass eine längste Folge bei maxstart beginnt und maxlaenge lang ist.

Auf dem zehnjährigen 2,2GHz Prozessor i7-3620QM können so 1000 1Mio Zeichen lange Strings in 4,4 Sekunden durchsucht werden.

Delphi-Quellcode:
function LaengsteZiffernFolgeDerWelt( s : string ) : string;
var
  len_s,
  maxlaenge, maxstart, laenge, start, i: Integer;

begin
  start := 0;
  maxlaenge := 0;
  maxstart := 0;
  i := 1;
  len_s := length(s);
  while i <= len_s do
  begin
    if ( s[i] in ['0'..'9'] ) then
    begin
      if start = 0 then start := i
    end
    else
    begin
      if start > 0 then
      begin
        laenge := i-start;
        if laenge > maxlaenge then
        begin
          maxlaenge := laenge;
          maxstart := start;
        end;
        start := 0;
      end;
    end;
    inc(i);
  end;

  if start > 0 then // *
  begin
    laenge := i-start;
    if laenge > maxlaenge then
    begin
      maxlaenge := laenge;
      maxstart := start;
    end;
  end;

  if maxlaenge > 0 then Result := Copy( s, maxstart, maxlaenge )
  else Result := '';
end;
* Wenn s[length(s)] eine Ziffer ist, dann müssen wir noch prüfen, ob diese letzte Ziffernfolge in s die längste ist. Du könntest auch gleich nach dem "begin" der Funktion an s ein "Nichtzifferzeichen" anhängen. Also s := s+'A'; Dann kannst du auf diesen Check (if start > 0 then begin... end) verzichten. In den allermeisten Fällen wäre das sicher auch ok...
Michael Gasser
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine 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 aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:12 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz