Diferente pentru algoritmi-de-baleiere intre reviziile #9 si #10

Nu exista diferente intre titluri.

Diferente intre continut:

Sa analizam acum problema din perspectiva tehnicii pe care dorim sa o folosim. Evenimentele sunt, in acest caz, capetele stangi si cele drepte ale segmentelor orizontale. O alta observatie importanta este aceea ca, parcurgand o fasie cu linia de baleiere verticala, niciun segment nu este adaugat sau eliminat din multimea obiectelor intersectate.
Inainte de a parcurge lista de evenimente, o vom sorta crescator in functie de abscisele capetelor segmentelor orizontale. Apoi, la fiecare pas, vom procesa toate evenimentele cu aceeasi abscisa. In ce consta acest lucru? Mai intai interogam structura de date continand obiectele deja intersectate si il alegem pe cel cu ordonata maxima $Y$. Aria ultimei fasii din stanga liniei de baleiere poate fi calculata usor cu formula $Y * D$, unde $D$ este distanta pana la pozitia precedenta a liniei de baleiere. Apoi vom insera sau, dupa caz, vom sterge din structura de date evenimentele de la abscisa curenta. Asadar, vom avea nevoie de inserari, stergeri si interogari rapide. Putem alege un 'arbore de intervale':arbori-de-intervale (fiind necesara, inainte de toate, o normalizare a tuturor ordonatelor) sau un arbore binar de cautare in care ordonarea cheilor sa se faca dupa ordonata. Aveti, totusi, grija la duplicate: pot exista mai multe segmente orizontale cu aceeasi ordonata $Y$, ceea ce inseamna ca structura noastra de date trebuie sa gestioneze corect inserarea unei ordonate deja existente sau stergerea acesteia.
Inainte de a parcurge lista de evenimente, o vom sorta crescator in functie de abscisele capetelor segmentelor orizontale. Apoi, la fiecare pas, vom procesa toate evenimentele cu aceeasi abscisa. In ce consta acest lucru? Mai intai interogam structura de date continand obiectele deja intersectate si il alegem pe cel cu ordonata maxima $Y$. Aria ultimei fasii din stanga liniei de baleiere poate fi calculata usor cu formula $Y * D$, unde $D$ este distanta pana la pozitia precedenta a liniei de baleiere, si adaugata la aria reuniunii dreptunghiurilor. Apoi vom insera sau, dupa caz, vom sterge din structura de date evenimentele de la abscisa curenta. Asadar, vom avea nevoie de inserari, stergeri si interogari rapide. Putem alege un 'arbore de intervale':arbori-de-intervale (fiind necesara, inainte de toate, o normalizare a tuturor ordonatelor) sau un arbore binar de cautare in care ordonarea cheilor sa se faca dupa ordonata. Aveti, totusi, grija la duplicate: pot exista mai multe segmente orizontale cu aceeasi ordonata $Y$, ceea ce inseamna ca structura noastra de date trebuie sa gestioneze corect inserarea unei ordonate deja existente sau stergerea acesteia.
Sa vedem acum analiza complexitatii. Avem nevoie de un timp $O(N * log N)$ pentru sortarea listei de evenimente dupa abscisa, $O(log N)$ (sau chiar $O(1)$ la $set$-urile din STL) pentru alegerea obiectului cu ordonata maxima, $O(log N)$ pentru inserare si stergere in structura de date aleasa. Intrucat sunt $2*N$ evenimente (cate 2 capete pentru fiecare segment), complexitatea finala va fi $O(N * log N) + O(N) * (O(log N) + O(log N)) = O(N * log N)$.

Nu exista diferente intre securitate.

Topicul de forum nu a fost schimbat.