AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

Ein Thema von Getox · begonnen am 3. Sep 2018 · letzter Beitrag vom 4. Sep 2018
Antwort Antwort
Seite 1 von 2  1 2   
Getox

Registriert seit: 28. Dez 2012
155 Beiträge
 
Delphi XE3 Professional
 
#1

Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 16:22
Hallo,

ich muss ein Problem lösen, wo ich auf keine schöne Lösung komme. Ich schiebe das jetzt schon seit Wochen vor mir her, denke zwischendurch drüber nach und schiebe es wieder nach hinten.

Ich habe einen Terminkalender. Dort will ich einen Termin anlegen. Es können aber nur X Termine gleichzeitig stattfinden, wobei X ziemlich variabel sein kann. Jetzt muss ich prüfen ob in dem Zeitraum des neuen Termins zu irgendeinem Zeitpunkt bereits X Termine zeitgleich laufen. ist dem nicht so, darf der neue Termin angelegt werden und sonst nicht.

Bei zwei Zeiträumen ist so eine Überprüfung ja noch einfach. Aber bei 3, 4 oder noch mehr Terminen, die zur gleichen Zeit stattfinden dürfen, ist das irgendwie schwerer

Danke
Ist ein Nilpferd ein Pferd, das nicht vorhanden ist?
  Mit Zitat antworten Zitat
Papaschlumpf73

Registriert seit: 3. Mär 2014
Ort: Berlin
429 Beiträge
 
Delphi 12 Athens
 
#2

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 17:45
Es geht bestimmt auch eleganter… Ich würde eine Schleife erstellen, die vom Startzeitpunkt bis zum Endzeitpunkt des neuen Termins durchläuft. Wenn es sich um ganz normale Termine handelt, würden wohl Minutenschritte ausreichen. Dann würde ich bei jedem Schritt prüfen, wie viele Termine in dieser Minute stattfinden.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.685 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 18:08
Eventuell auch "schmutzig" numerisch lösbar, wenn man voraussetzen kann, dass ein Termin garantiert eine gewisse Länge nicht überschreitet: (Ich gehe mal davon aus, dass ein Termin durch Start- und Endzeitpunkt definiert wurde.)

Vom neuen Terminzeitpunkt ausgehend die maximale Termindauer zurückrechnen, und von da an alle Termine bis zum neuen durchgehen. Wenn ein Termin anfängt einen Zähler erhöhen, wenn einer endet einen weiteren Zähler erhöhen - dieser kann aber niemals größer als der dann gerade aktuelle Start-Zähler sein (passiert wenn man End-Zeiten von Terminen erreicht, die zum Durchlaufanfangszeitpunkt schon liefen.) Diesen also begrenzen.
Die Differenz der zwei Zähler ist dann die Anzahl der aktiven Termine zum Zeitpunkt des neuen Termins.

Man kann noch weiter gehen, denn es könnten ja Termine SPÄTER anfangen als der neue, und der neue würde dann das Limit sprengen, wenn der neue dann noch läuft. Daher also das obige bis zum ENDE des neuen Termins laufen lassen, und wenn die Differenz in diesem Schritt jemals größer wird als die maximale Terminanzahl, dann ist der Zeitraum abzuweisen.

Das zumindest wäre mein ad hoc Gedanke dazu.

Einzige Hürde: Man muss die Termin-Start- und Endzeitpunkte des Suchzeitraums in eine gemeinsame chronologische Liste bringen, und dort auch markieren was ein Start- und was ein Endpunkt ist. Das sollte sich aber relativ einfach machen lassen und kostet auch nicht arg viel Rechenleistung.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)

Geändert von Medium ( 3. Sep 2018 um 18:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
675 Beiträge
 
Delphi 10.4 Sydney
 
#4

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 18:34
Kannst du denn nicht alles in eine Tabelle schreiben und dann einfach mit SQL fgragen, welche überlappend sind und wieviele es gibt ? Da kommt es dann drauf an, wie du überlappened definierst, reicht es, wenn das Enddatum des einen Termins im Bereich des neuen Termins ist ?

Code:
SELECT * FROM Termine WHERE (Startdate BETWEEN :NewStartDate AND :NewEndDate) -- Alle die im neuen Terminbereich auch anfangen
                         OR (Enddate BETWEEN :NewStartDate AND :NewEndDate)  -- Alle die im neuen Bereich aufhöhren
                         OR (:NewStartDate BETWEEN StartDate AND EndDate)    -- Alle wo der anfang des neuen zwischen start und ende eines vorhanden ist
Denke mal, das sollte alles abdecken

Wenn du da noch einen "Select Count()" drumherum machst, weisst, wieviele bei rumkommen
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.434 Beiträge
 
Delphi 12 Athens
 
#5

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 18:42
Denke mal, das sollte alles abdecken
Leider nicht. Nehmen wir folgendes Beispiel:

Termin A geht von 8:00 - 10:00
Termin B geht von 10:00 - 12:00

Der neue Termin C geht von 9:00 - 11:00 und es sind maximal zwei überlappende Termine erlaubt. Die simple Range-Betrachtung liefert zwei überlappende Termine mit C, aber immer nur einer (A oder B) fällt auf einen beliebigen Zeitpunkt vom C-Bereich.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#6

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 19:07
Der Ansatz von MyRealName ist schon richtig. Man darf aber nicht die Gesamtsumme der Überschneidungen zählen, sondern muss dies für Beginn und Ende separat.

Hat man dann für den Beginn oder für das Ende mehr als die maximal zulässigen Überschneidungen, dann gehts nicht. Sonst schon.

Nur hingedaddelt und nicht getestet:
SQL-Code:
select Sum(Start) as Start, Sum(End) As End from (
  select count(*) as Start, 0 As End from Termine
  where StartDate between :NewStartDate and :NewEndDate
  union all
  select 0 as Start, Count(*) As End from Termine
  where EndDate between :NewStartDate and :NewEndDate
)
Wenn nun Start >= maximale Terminzahl ist oder End >= maximale Terminzahl ist, muss die Terminablage abgelehnt werden. Andernfalls müsste es gehen (sofern ich da jetzt keinen Denkfehler gemacht gabe, was ich nicht ausschließen will).

Bei dem Beispiel von Uwe Raabe müsste eine Terminanlage erfolgen können.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.434 Beiträge
 
Delphi 12 Athens
 
#7

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 20:00
Der Ansatz von MyRealName ist schon richtig. Man darf aber nicht die Gesamtsumme der Überschneidungen zählen, sondern muss dies für Beginn und Ende separat.

Hat man dann für den Beginn oder für das Ende mehr als die maximal zulässigen Überschneidungen, dann gehts nicht. Sonst schon.
...
Wenn nun Start >= maximale Terminzahl ist oder End >= maximale Terminzahl ist, muss die Terminablage abgelehnt werden. Andernfalls müsste es gehen (sofern ich da jetzt keinen Denkfehler gemacht gabe, was ich nicht ausschließen will).
Termin A geht von 8:00 - 9:30
Termin B geht von 9:45 - 10:15
Termin C geht von 10:30 - 12:00

Neuer Termin von 9:00 - 11:00

Die Abfrage ergibt für den neuen Terminzeitraum 2x Start und 2x End.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.490 Beiträge
 
Delphi 7 Professional
 
#8

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 21:18
ok, erwischt.

War wohl deutlich zu kurz gesprungen ;-(
  Mit Zitat antworten Zitat
TigerLilly

Registriert seit: 24. Mai 2017
Ort: Wien, Österreich
1.195 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 3. Sep 2018, 22:22
Ich würde eine Liste aller Termine an dem Tag des neuen Termins erstellen + für jeden prüfen, ob er mit dem neuen Termin überlappt.
Überlappen kann sein:
- bestehender Termin beginnt nach, aber vor dem Ende des neuen Termins
- bestehender Termin endet nach dem Beginn, aber vor dem Ende des neuen Termins
- bestehender Termin beginnt vor und endet nach dem neuen Termin

Die Überlappungen werden mitgezählt. ist das Ergebnis < X --> zulassen.

Wenn die Termine über mehrere Tage gehen können, wird das Erstellen der Liste etwas aufwändiger, aber die Idee bleibt die gleiche.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.273 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Größte Menge von parallelen Zeiträumen in einem Zeitraum ermitteln

  Alt 4. Sep 2018, 08:04
Hallo,
ich hatte das damals umgedreht, nicht auf Überlappung testen, sondern auf Nichtüberlappung.
S1, E1, S2, E2 (S=Start, E=Ende)

Termin2 überlappt nicht mit Termin1, wenn er davor liegt (E2<=S1) oder dahinterliegt (S2>=E1).
Heiko
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 15:41 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