Ta odpowiedź ma na celu jedynie ukierunkowanie rozwiązania dla części harmonogramu, a nie 100% fajne rozwiązanie:
To, co stworzyłeś, wymaga pętli, aby były w stanie spełnić wszystkie warunki.
Aby szybciej rozwiązać taki przypadek, praktyczna może być praca na wektorach, w których wszystkie pozycje są reprezentowane przez 0 (dostępne) i 1 (zajęte).
Więc problem studenta/matematyki-1:
Załóżmy, że są 2 pokoje i 3 godziny:wektor matematyczny 1 na pomieszczenie to:
Room 1: [0 0 0]
Room 2: [0 0 0]
Zasadniczo (przynajmniej ja) nie dbam o to, czy określony pokój jest dostępny, o ile jest dostępny 1:Więc AND na indeks może być w tym przypadku odpowiedzią na dostępność (pamiętaj:0 jest dostępne):
Pokój 1:[1 0 0]Pokój 2:[0 0 0]Wynik dotyczący pokoju:[1 0 0] AND [0 0 0]=[0 0 0]
Więc AND może powiedzieć, czy pierwsza godzina jest nadal dostępna.
Jeśli teraz połączysz to z uczniem z dostępnymi godzinami (również tylko 3 w tym przykładzie):
Uczeń A:[0 0 1]Wynik sali:[0 0 0]Uczeń pasuje do sali za pomocą OR dla tej operacji:[0 0 1] OR [0 0 0]=[0 0 1]
Więc uczeń A pasuje do wyniku pokoju.
W języku SQL:Model danych (część:Brak jest dopasowania kursu):Sala stołowa:
CREATE TABLE room(
room_id INT,
space TINYINT DEFAULT 0,
hour INT DEFAULT 1
);
CREATE TABLE student(
student_id INT,
space TINYINT DEFAULT 0,
hour INT DEFAULT 1
)
Wszystkie dane zostały wstawione do tabel w całości:w tym przypadku 1 pokój, 3 godziny, 3 wolne miejsca.
INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,1);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,2);
INSERT INTO room VALUES (1,0,3);
INSERT INTO room VALUES (1,0,3);
INSERT INTO room VALUES (1,0,3);
Student ma:
INSERT INTO student VALUES(1,0,1);
INSERT INTO student VALUES(1,0,2);
INSERT INTO student VALUES(1,1,3);
Więc uczeń jest dostępny tylko przez pierwsze dwie godziny.
Aby teraz uzyskać wynik zapytania:
SELECT room_id
FROM room a
INNER JOIN student b ON a.space=b.space AND a.hour=b.hour;
Ten wynik musi być tylko podzielony na grupy po maksymalnie 8, w których jest to koniec części SQL i czas dla innego języka programowania.
Ten model można rozszerzyć o datę, jednak działa najlepiej, gdy używa się tylko godzin i dni tygodnia (dostępność w dni powszednie ponownie wynosi 0 lub 1).
Jak powiedziałem:jest to koncepcja/pomysł, a nie 100% rozwiązanie, więc wymaga pracy, zanim będzie można go użyć.....