2016-06-14 16 views
-1

Ich habe diese Frage Ich habe Probleme,Finden Sie Überlappungsbereich in mehreren Regionen

Ich habe eine Maschine, Aufgaben treten nacheinander in die Maschine.

Jede Aufgabe hat eine Aufgaben-ID, Startnummer und Anzahl der angeforderten Einheiten.

Für jede Aufgabe muss ich prüfen, ob der Bereich der Aufgabe [Startnummer, Startnummer + Anforderungseinheiten] einen der vorherigen Aufgabenbereiche überlappt, wenn dies der Fall ist, wird es nicht ausgeführt.

Es gibt 32 Aufgaben-ID, die Maschine kann nicht die gleiche Aufgaben-ID gleichzeitig halten (Wenn sich die Aufgaben-ID 2 in der Maschine befindet, muss sie vor dem erneuten Betreten der Maschine mit anderen Parametern ausgeführt werden)

Die Grundidee ist, einen Kontrollblock mit den Bereichen aller Aufgaben, die in der Maschine (bis zu 32) sind, zu halten und diese Struktur für jede neue Aufgabe zu scannen, jedoch nicht die beste Idee für die Leistung.

Irgendeine Idee Leute?

Dies ist aus einer realen Welt Produktentwicklung genommen, ich habe es dieses Modell wegen vereinfacht. Außerdem muss ich die Lösung in C schreiben, also kann ich keine komplexen mathematischen Theorien haben :)

+0

Sie haben die Maschine nicht gut genug definiert, z. B. den Zahlenbereich, und Sie sagen nicht, was passiert, wenn eine neue Aufgabe nicht bearbeitet werden kann. Werden alle neuen Anfragen zu diesem Zeitpunkt ausgesetzt oder sollten sie in eine Warteschlange gestellt werden, während andere neue Anfragen verarbeitet werden? Es könnte ziemlich kompliziert sein, da neue Anfragen kontinuierlich einen in der Warteschleife blockieren könnten. Wenn beispielsweise eine laufende Aufgabe die Einheiten 1-4 verarbeitet und eine neue Aufgabe für die Einheiten 3-6 in die Warteschlange gestellt wird und dann eine neue Aufgabe an die Verarbeitungseinheiten 5-8 eintrifft, könnte dies zugelassen werden, die Aufgabe jedoch in der Warteschlange ist immer noch blockiert. –

Antwort

0

Erstellen Sie eine Tasksteuerblockstruktur (TCB_t), um die Parameter und Informationen über die Aufgabe zu halten. Erstellen Sie ein Array von TCB_t * currentTasks [32] = {0} und initialisieren Sie die Zeiger auf null. Überprüfen Sie in Ihrer addTask (...) - Routine, ob currentTasks [newTaskID] == NULL ist und ob es eine neue TCB_t zugewiesen und dort zugewiesen wird. Sie können Aufgaben aus der currentTasks-Liste bearbeiten, sie nach Abschluss freigeben und auf NULL zurücksetzen. Da es nur 32 Tasks gibt, können Sie eine direkte Hash-Funktion verwenden, die TCB_t direkt einem Eintrag im Array currentTasks zuordnet. Sie müssen auch eine separate Liste von Regionen erstellen. Sie können jede Region in eine sortierte verknüpfte Liste einfügen, um leichter feststellen zu können, ob sich die hinzuzufügende Aufgabe mit einer anderen Aufgabe überschneidet.

+0

Ich muss immer noch die Liste der Einträge für jede neue Aufgabe scannen, nein? – user2102697

+0

Kennen Sie im Voraus etwas über startNumber oder requestUnits? – cleblanc

+0

Nein, diese Parameter können alles sein – user2102697

Verwandte Themen