Delphi-PRAXiS
Seite 2 von 4     12 34      

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)

Zacherl 11. Mai 2015 15:12

AW: Wo binäre Suche schneller, mit Array oder StringList?
 
Nach gefilterter SQL Abfrage noch 100-1000? :shock:

Naja, solange es nicht über 100.000 werden, würde ich einfach alles in ein Array packen und danach immer sequenziell suchen. Wenn du deine SQL Abfrage nämlich so formulierst, dass die Termine nach Zeit sortiert zurückgegeben werden, dürfte die Suche schon nach sehr wenigen Elementen entweder die gesuchte Zeit gefunden haben, oder aber an einem Element angelangt sein, dessen Zeit größer der aktuellen Zeit ist (an dieser Stelle kannst du die Iteration dann abbrechen).

Immer wenn du einen Termin erfolgreich gefunden und abgearbeitet hast, erhöhst du einen internen Zähler um 1. Diesen Zähler nimmst du jeweils als Start-Index der Array Suche.

bernau 11. Mai 2015 15:13

AW: Wo binäre Suche schneller, mit Array oder StringList?
 
Müsstest du nicht auch berücksichtigen, daß neue Termine in die Datenbanke eingetragen werden? Kann das passieren? Wenn ja, dann müsstest du sowiso die Datenbank sekündlich abfragen.

Wenn du nicht damit rechnen musst, daß jemand anderes einen Termin einträget, dann könntest du ja die Termine der nächsten 60 Sekunden abfragen und dann nach 60 Sek. wieder. Wieviel Termine könnten in 60 Sek vorkommen?

AlexII 11. Mai 2015 15:14

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

Zitat von Neutral General (Beitrag 1301051)
Es ist doch trotzdem am einfachsten sich von der DB eine sortierte Liste aller (bzw. der ersten N) Termine ausgeben zu lassen.
Die kannst du dann ggf. einfach in dieser Reihenfolge in eine Liste schreiben und bei jedem Tick durchläufst
du die Liste von 0 bis zum ersten Termin der noch nicht eingetreten ist, tust was du tun musst für diese Termine
und löschst die abgearbeiteten Termine aus der Liste (und der DB).

Wie schon oben angedeutet: Du musst nicht jede Sekunde die DB abfragen. Wenn du dir alle (oder zumindest nen guten Vorrat) der
nächsten Termine zurückgeben lässt brauchst du nur am Anfang 1x oder ggf. nach ein paar Minuten/Stunden wenn die Liste leer ist/wird
deine Liste mit neuen Terminen auffüllen.

Meine Idee war so ähnlich... wollte nur wissen in welche Liste ich die sortierte Abfrage packen soll? TList vielleicht? Welche passt dazu am besten?

Zacherl 11. Mai 2015 15:16

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

Zitat von bernau (Beitrag 1301054)
Wieviel Termine könnten in 60 Sek vorkommen?

Unendlich viele, wenn man mehrere Termine zur selben Zeit anlegen kann :twisted:

Zitat:

Zitat von AlexII (Beitrag 1301055)
wollte nur wissen in welche Liste ich die sortierte Abfrage packen soll? TList vielleicht? Welche passt dazu am besten?

Ich würde ein Array of TMyRecord nehmen. TList geht natürlich auch, aber dann musst du alle deine Records/Objekte zur Laufzeit noch Heap-allocen, während du beim Array direkt den kompletten Speicherbereich in einem Rutsch reservierst.

AlexII 11. Mai 2015 15:16

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

Zitat von bernau (Beitrag 1301054)
Müsstest du nicht auch berücksichtigen, daß neue Termine in die Datenbanke eingetragen werden? Kann das passieren. Wenn ja, dann müsstest du sowiso die Datenbank sekündlich abfragen.

Das muss ich natürlich auch beachten. Neue Termine können jede Zeit neu angelegt werden. Heißt also doch die DB jede Sekundlich abfragen! Oder nach Schreibvorgängen schauen, falls ein Schreibvorgang stattfindet die Termine neu laden.

Zacherl 11. Mai 2015 15:20

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

Zitat von AlexII (Beitrag 1301058)
Zitat:

Zitat von bernau (Beitrag 1301054)
Müsstest du nicht auch berücksichtigen, daß neue Termine in die Datenbanke eingetragen werden? Kann das passieren. Wenn ja, dann müsstest du sowiso die Datenbank sekündlich abfragen.

Das muss ich natürlich auch beachten. Neue Termine können jede Zeit neu angelegt werden. Heißt also doch die DB jede Sekundlich abfragen! Oder nach Schreibvorgängen schauen, falls ein Schreibvorgang stattfindet die Termine neu laden.

Wenn du eh sekündlich ne Query raushauen musst, dann kannst du die Ergebnisse ja sogar ganz konkret bis auf die Sekunde genau filtern lassen. In dem Falle brauchst du gar nichts in ein Array oder eine Liste zuwischenspeichern.
Du weißt ja in diesem Falle genau, dass alle zurückgelieferten Einträge genau jetzt in diesem Moment ein Ereignis auslösen müssen. Dazu iterierst du dann einfach über das SQLResult.

AlexII 11. Mai 2015 15:22

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

Zitat von Zacherl (Beitrag 1301061)
Zitat:

Zitat von AlexII (Beitrag 1301058)
Zitat:

Zitat von bernau (Beitrag 1301054)
Müsstest du nicht auch berücksichtigen, daß neue Termine in die Datenbanke eingetragen werden? Kann das passieren. Wenn ja, dann müsstest du sowiso die Datenbank sekündlich abfragen.

Das muss ich natürlich auch beachten. Neue Termine können jede Zeit neu angelegt werden. Heißt also doch die DB jede Sekundlich abfragen! Oder nach Schreibvorgängen schauen, falls ein Schreibvorgang stattfindet die Termine neu laden.

Wenn du eh sekündlich ne Query raushauen musst, dann kannst du die Ergebnisse ja sogar ganz konkret bis auf die Sekunde genau filtern lassen. In dem Falle brauchst du gar nichts in ein Array oder eine Liste zuwischenspeichern.
Du weißt ja in diesem Falle genau, dass alle zurückgelieferten Einträge genau jetzt in diesem Moment ein Ereignis auslösen müssen. Dazu iterierst du dann einfach über das SQLResult.

Aber macht da die SQlite DB mit? Schafft sie überhaupt in der einen Sekunde die ganze Abfrage und Ausgabe?

AlexII 11. Mai 2015 15:26

AW: Wo binäre Suche schneller, mit Array oder StringList?
 
Obwohl... es reicht ja auch ein Mal pro Minute die DB abzufragen, die Sekunden werden beim Termineintrag ignoriert. Also nur 1x pro Minute, und das muss kein Problem sein! :thumb:

Zacherl 11. Mai 2015 15:28

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

Zitat von AlexII (Beitrag 1301062)
Zitat:

Zitat von Zacherl (Beitrag 1301061)
Zitat:

Zitat von AlexII (Beitrag 1301058)
Zitat:

Zitat von bernau (Beitrag 1301054)
Müsstest du nicht auch berücksichtigen, daß neue Termine in die Datenbanke eingetragen werden? Kann das passieren. Wenn ja, dann müsstest du sowiso die Datenbank sekündlich abfragen.

Das muss ich natürlich auch beachten. Neue Termine können jede Zeit neu angelegt werden. Heißt also doch die DB jede Sekundlich abfragen! Oder nach Schreibvorgängen schauen, falls ein Schreibvorgang stattfindet die Termine neu laden.

Wenn du eh sekündlich ne Query raushauen musst, dann kannst du die Ergebnisse ja sogar ganz konkret bis auf die Sekunde genau filtern lassen. In dem Falle brauchst du gar nichts in ein Array oder eine Liste zuwischenspeichern.
Du weißt ja in diesem Falle genau, dass alle zurückgelieferten Einträge genau jetzt in diesem Moment ein Ereignis auslösen müssen. Dazu iterierst du dann einfach über das SQLResult.

Aber macht da die SQlite DB mit? Schafft sie überhaupt in der einen Sekunde die ganze Abfrage und Ausgabe?

Das WHERE Statement gibt es auch bei SQLite und wenn du einen entsprechenden Index setzt, wird die Abfrage auch in ordentlicher Zeit durchlaufen. Kommt halt auf die Größe der Datenbank an.
Müsstest du dir auch überlegen, ob es sinnvoll ist die vergangenen Termine wieder aus der Datenbank zu löschen.

AlexII 11. Mai 2015 15:32

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

Zitat von Zacherl (Beitrag 1301065)
... und wenn du einen entsprechenden Index setzt, wird die Abfrage auch in ordentlicher Zeit durchlaufen.

Was meinst Du mit dem Index?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.
Seite 2 von 4     12 34      

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