Autor Zpráva
Tori
Profil
Pěkný večer. Mohli byste mi, prosím, poradit vhodný postup?

Mám pole max. deseti objektů, každý má nějaké časové rozpětí (vlastnosti začátek a konec). Na začátku může být pole i prázdné. Můžu přidávat další objekty, mazat existující anebo měnit jejich začátek / konec. Potřebovala bych zachytit přidání/změnu objektu, jehož (změněné) časové rozpětí se překrývá s jiným. Jak byste to udělali?


Napadlo mne při každém přidání/změně objektu zkontrolovat překrývání proti všem existujícím. To by ale vyhodilo chybu v tomto případě, který chci, aby prošel:
    původní    |          změna
 9:00 - 10:00  | -> změnit na 9:00 - 12:00
11:00 - 11:30  | -> smazat


Další možnost - nejdřív provést všechny změny a pak zkontrolovat každý objekt proti každému jinému - tuhle chybu nemá, ale (n^2 - n) iterací mi připadá moc.
Anebo mít jeden postup, pokud je na začátku pole prázdné a jiný, pokud už obsahuje objekty termínů?

Díky moc za radu, bohužel jsem nestudovala nic o algoritmech, takže dosti tápu.
Alphard
Profil
Jak je řešená práce s těmi objekty? Neměl by se ten 11:00 - 11:30 prvně smazat a až pak umožnit změnu do tohoto intervalu?
Jiný postup bude zanášet nekonzistence - v určitém časovém okamžiku budou v paměti kolizní data. Nevím, jestli jestli je to nějaké ORM nad databází, kde by se v případě pádu zachoval bordel v databázi, nebo ne, ale je to docela jedno...

Nebo možná stačí upozornit na kolize. Víc informací prosím.
Tori
Profil
Souvisí to s tímto dotazem.
Je nějaká událost (třeba zkouška z pedagogiky), k ní je vypsaných n termínů (rozpětí času od-do). Jde o to, aby vyučující mohl měnit/mazat/přidávat termíny z události, za následujících podmínek:
- termíny se nesmí překrývat, ale mohou navazovat.
- není možné smazat termín, v němž je zapsaný nějaký student.
- začátek i konec termínu je možné libovolně měnit, pokud to nezasáhne čas, na nějž je nějaký student zapsaný

Máte pravdu, že by bylo lépe nejdřív smazat termíny, které se mají zrušit. Ale když pak bude vyučující měnit či přidávat nové, stejně musím ověřit, jestli se některé nepřekrývají. Možná, že při tom nízkém počtu prvků v poli ani kontrola všech proti všem nebude trvat dlouho, ale stejně hledám lepší variantu.
Kajman_
Profil *
Když by ty začátky a konce byly v db, tak se dá dotazem zjistit počet kolizí se zrovna přidávaným termínem.
http://diskuse.jakpsatweb.cz/?action=vthread&forum=28&topic=69880#2
Ale při měnění by tam musela být podmínka, že se nám brát v potaz měněný řádek.

Jinak v php by se to výsledné pole mohlo seřadit podle od. A pak by se nemuselo porovnávat každé s každým (když není začátek dalšího menší než konec kontrolovaného objektu, tak další seřazené už taky nemá cenu kontrolovat).
Tori
Profil
Alphard:
Jiný postup bude zanášet nekonzistence - v určitém časovém okamžiku budou v paměti kolizní data.
Vadilo by to i v případě, že všechny kontroly kolizí proběhnou v PHP a do databáze by se ukládalo pouze v případě, že jsou data v pořádku?

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: