Delphi-PRAXiS
Seite 4 von 4   « Erste     234   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   FreePascal Wo binäre Suche schneller, mit Array oder StringList? (https://www.delphipraxis.net/185048-wo-binaere-suche-schneller-mit-array-oder-stringlist.html)

AlexII 12. Mai 2015 08:11

AW: Wo binäre Suche schneller, mit Array oder StringList?
 
Zitat:

Zitat von Perlsau (Beitrag 1301093)
Zitat:

Zitat von AlexII (Beitrag 1301039)
Ok... also es ist folgendes, es geht um einen Wecker. Dieser soll nach mehreren (Hunderte, oder Tausende) Terminen "Ausschau" halten, und bei angegebener Zeit Alarm schlagen. Das heißt, dass ich jede Sekunde die aktuelle Uhrzeit mit der in der DB vergleichen muss. Nun suche ich wie ich das am besten mache. Eine binäre Suche wäre schon sinnvoll, oder?

In meiner Terminverwaltung mache ich das so, daß ich im Datenmodul eine Public-Methode bereitstelle. Beim Programmstart wird der nächste Termin in einer Variablen gespeichert:
Delphi-Quellcode:
Function DatMod.GetNextAlarmDate : TDateTime;
Begin
  Query.Active := False;
  Query.SQL.Clear;
  Query.SQL.Append('select TERMINDATUM, ALARM from TERMINE');
  Query.SQL.Append('where ALARM = 1'); // Boolsche Variablen werden z.B. in Firebird als 0 und 1 gespeichert
  Query.SQL.Append('order by TERMINDATUM'); // das "kleiste" Datum steht am Anfang
  Query.Open;
  Query.Last; // an das "größte" Datum springen
  Result := Query.FieldByName('TERMINDATUM').AsDateTime;
  Query.Active := False;
  Query.SQL.Clear;
End;
Dieses Resultat speichere ich nun in einer Variablen, die in der Ereignisbehandlung vom Timer mit der aktuellen Uhrzeit verglichen wird. Ist das Datum erreicht, klingelts und in der Alarm-Methode wird dann wieder der nächste Termin in diese Variable gesetzt. Empfehlenswert ist auch eine Spalte, die angibt, wieviele Sekunden oder Minuten vor dem eigentlichen Termin der Alarm losgehen soll oder auch eine Variable, die diese Zeit für alle Termine gleich behandelt.

Cool, danke für das Beispiel... ich schaue es mir an. :thumb:

Dejan Vu 12. Mai 2015 12:41

AW: Wo binäre Suche schneller, mit Array oder StringList?
 
Das sollte auch so gehen
Code:
select min (TERMINDATUM) from Termine where Alarm=1
oder
Code:
select first 1 TERMINDATUM from Termine where Alarm=1 order by TERMINDATUM
Vorteil: Beide liefern nur einen Datensatz zurück, anstatt alle.
Die erste Variante ist eigentlich so, "wie man es macht".

Aber wenn Du alle Termine eh benötigst, ist natürlich Perlsau's Variante vorzuziehen (bis auf die letzten Zeilen natürlich),

Mavarik 12. Mai 2015 16:02

AW: Wo binäre Suche schneller, mit Array oder StringList?
 
Code:
Select ID FROM Termine order by ID,DESC LIMIT 1;
Delphi-Quellcode:
if ID > LastID then
Code:
Select ID,AlarmTime FROM Termine Where (ALARM=1) and (AlarmTime > "+FormatDateTime('yyyy-mm-dd hh:nn:ss',[NOW]+'")' order by AlarmTime,ASC LIMIT 10;
hmm


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:25 Uhr.
Seite 4 von 4   « Erste     234   

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