Ulohy 1abc Riesenia

You might also like

Download as doc, pdf, or txt
Download as doc, pdf, or txt
You are on page 1of 3

Úloha 1A – Rad u lekára.

Daných je N usporiadaných dvojíc prirodzených čísel starti a endi pre i = 1, …, N, ktoré predstavujú
zjednodušené časy príchodu a odchodu pacientov od lekára. Príchody sú usporiadané podľa času príchodu
vzostupne. Predpokladajte, že všetky príchody a odchody sú rôzne čísla, a že lekár vybavuje pacientov v
poradí ako prišli, teda pacient, ktorý skôr prišiel, skôr aj odíde. Napíšte program, ktorý zistí koľko najviac
pacientov čakalo v rade u lekára v jednom okamihu.

Riešenie:

Postupne spracúvame príchody pacientov, za každý zvýšime aktuálny počet ľudí v rade o jedna. Predtým,
ako spracujeme ďalší príchod, zistíme, či niektorí pacienti od lekára odišli (mohli to byť len tí, čo prišli,
a v poradí v akom prišli) a znížime počet ľudí o príslušné číslo.

int lekar(int[] start, int[] end, int n)


{
int i, j=0, count=1, result=1;

for (i = 1; i < n; i++)


{
while (end[j] < start[i] && j < i)
{
j++;
count--;
}
count++;
if (result < count)
result = count;
}
return result-1; // jedneho pacienta lekar vysetruje ;)
}

Vo for cykle sa spracúvajú príchody pacientov postupne, a keďže sa while cyklus (spracovanie odchodu)
vykoná za celý beh programu najviac n krát je výpočtová zložitosť je O(n). Pamäťová zložitosť je
triviálne O(1).
Úloha 1B – Zásobník pomocou radov.

Dátová štruktúra rad podporuje operácie enqueue(), dequeue() a is_empty(). Implementujte


dátovú štruktúru zásobnik – operácie push() a pop() – pomocou dvoch radov.

Riešenie:

Použijeme dva rady tak, že v prvom rade (Q1) bude usporiadanie prvkov ako keby boli už v zásobníku.
Usporiadanie zabezpečíme už pri operácii push, a teda pop je len triviálne dequeue z Q1. Druhý rad (Q2)
použijeme pri operácii push ako pomocnú pamäť na dočasné presunutie všetkých prvkov.

void push(int v)
{
// presun prvky z q1 do q2
while (!q1.is_empty())
q2.enqueue(q1.dequeue());

q1.enqueue(v);

// presun prvky z q2 do q1
while (!q2.is_empty())
q1.enqueue(q2.dequeue());
}

int pop()
{
return q1.dequeue();
}

Výpočtová zložitosť operácie push je O(n), pretože prvky presúvame medzi radmi Q1 a Q2. Výpočtová
zložitosť operácie pop je konštantná O(1).
Úloha 1C – Rad pomocou zásobníkov.

Dátová štruktúra zásobník podporuje operácie push(), pop() a is_empty(). Implementujte dátovú
štruktúru rad (fronta) – operácie enqueue() a dequeue() – pomocou dvoch zásobníkov.

Riešenie:

Operáciu enqueue realizujeme ako obyčajný push na prvý zásobník (S1). Pri operácii dequeue vyberáme
prvok z druhého zásobníka (S2), v ktorom sú prvky pripravené na pop v poradí ako keby boli v rade.
Teda, pokiaľ v S2 nie sú žiadne prvky, tak tam presunieme všetky prvky z S1, čím sa samozrejme obráti
ich poradie (do želaného poradia ako v rade).

void enqueue(int v)
{
s1.push(v);
}

int dequeue()
{
if (s2.is_empty())
{
while (!s1.is_empty())
s2.push(s1.pop());
}
return s2.pop();
}

Výpočtová zložiťosť operácie enqueue je O(1), zložitosť operácie dequeue je amortizovane tiež O(1),
avšak konkrétny jeden výpočet dequeue môže trvať aj O(n). Amortizovaná zložitosť znamená zložitosť,
keď ju spriemerujeme cez všetky vykonané volania (predpokladáme, že ich bude rádovo rovnako ako
enqueue, a teda sa lineárny člen stratí).

You might also like