Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Výpočet časové složitosti

Dobrý den,
prosím potřeboval bych pomoc, dostali jsme zadaný příklad na složitost a já si s ním vůbec nevím rady.

1. Nechť t-čas vykonání metody vykonej(). Odvoďte čas výpočtu programu T v závislosti na n a t v nejhorším případě. Dosaďte t=2 a vyjádřete čas T jako funkci n. Dokažte asymptotickou složitost O(n2) pro T(n)
Pomůcka: Napište definice, zvolte n0 a najděte hodnoty konstant c1 a c2.

for (int i =n-1; i>=1; i--)
for (int j=0; j<=i-1; j++)
if(a[j] > a[j+1]){
vykonej();
}

Předmět Autor Datum
Nějak jsi neuvedl, co je a[].
Wikan 29.02.2012 18:26
Wikan
Tam je uvedené že ostatní časy zanedbáme.Jinak a[] uvedeno není.
Wajzy 29.02.2012 18:34
Wajzy
Dobře. A v čem máš tedy problém?
Wikan 29.02.2012 18:35
Wikan
Mno já si napíšu definici ale už nevím jak zvolit n0 a celkově nevím jak se to dělá. Pročetl jsem už…
Wajzy 29.02.2012 18:41
Wajzy
Stačí si logicky odůvodnit kolikrát to celé proběhne v závislosti na n.
Wikan 29.02.2012 18:42
Wikan
takže ten vnější proběhne (n-1) (n-2) ..... (n-n)? a vnitřní (n-2) (n-3) .... (n-(n+1))? a jak to bu…
Wajzy 29.02.2012 18:47
Wajzy
Protože a[] neznáme, tak musíme předpokládat, že to proběhne pokaždé.
Wikan 29.02.2012 18:51
Wikan
Takze ten if proběhne n-krát? A ty for cykli by taky meli tedy probehnout n-krat ne?
Wajzy 29.02.2012 18:54
Wajzy
Vnější proběhne (n-1)krát, vnitřní 0 až (n-1)krát. If vždy. Takže složitost n^2.
Wikan 29.02.2012 18:57
Wikan
a ten vypočet je (n-1)*0+(n-1)*n?
Wajzy 29.02.2012 19:01
Wajzy
(0 + n-1)/2 * (n-1) Ale konstanty můžeme ignorovat. Takže n*n.
Wikan 29.02.2012 19:03
Wikan
a kde se vzalo to /2?
Wajzy 29.02.2012 19:06
Wajzy
Průměr z 0 až n-1.
Wikan 29.02.2012 19:07
Wikan
jop. mám tu ještě jeden příklad. for(int i =0; i<=2*n-1; i++){ vykonej1(); } for (int i=0; i<=n-1;…
Wajzy 29.02.2012 19:17
Wajzy
Tak výsledek by tu měl být n^2+3n ale to mi rozhodně nevyšlo nejak furt nevím jak poznat kolikrát to…
Wajzy 29.02.2012 20:35
Wajzy
Neni to nahodou asymproticky n^2 - stejne se to +3n zanedbá, tak proc se s tim handrkovat?
AZOR 29.02.2012 20:49
AZOR
for(int i =0; i<=2*n-1; i++){ vykonej1(); } i tohodle? Nna2 prece nemuze byt vysledek ani omylem -…
AZOR 29.02.2012 20:51
AZOR
První proběhne 2n-krát. Druhý n * (1 + n) = n^2 + n. n^2 + n + 2n = n^2 + 3n
Wikan 29.02.2012 21:07
Wikan
děkuji. akorát jak to že první proběhne 2n-krát?
Wajzy 29.02.2012 21:13
Wajzy
i<=2*n-1
Wikan 29.02.2012 21:16
Wikan
aha moc děkuji
Wajzy 29.02.2012 21:20
Wajzy
v tom pripade se omlouvam, muj post je spatne ;) bral jsem to jako mocninu a ono jen to jen nasobeni… poslední
AZOR 29.02.2012 21:27
AZOR
ono je prece fuk kolikrat to probehne, protoze IF muze rozhodnout ANO NE pokud ANO v 70% pripadu, pa…
AZOR 29.02.2012 20:47
AZOR
ono takhle já pak mám dokázat tu asymptotickou složitost takže v podstatě je jedno jestl ido definic…
Wajzy 29.02.2012 21:15
Wajzy
U velkých n je nějakých 3n oproti n^2 zanedbatelné.
Wikan 29.02.2012 21:19
Wikan

jop. mám tu ještě jeden příklad.

for(int i =0; i<=2*n-1; i++){
vykonej1();
}

for (int i=0; i<=n-1; i++){
for (int j=0; j<=i; j++){
vykonej2();
}
}

Takže ten první proběhne (n-1)-krát a u druhýho vnější (n-1)-krát a ten vnitřní 0 až (n-1)-krát.
takže výpočet je : (n-1)+(n-1)*(0+(n-1))/2=(n^2-1)/2 takže složitost je zase n^2?

for(int i =0; i<=2*n-1; i++){
vykonej1();
}

i tohodle? Nna2 prece nemuze byt vysledek ani omylem - je to 2naN - nekoliv čtvercově ale exponenciálně složité.

ono je prece fuk kolikrat to probehne, protoze IF muze rozhodnout ANO NE pokud ANO v 70% pripadu, pak se to vykona 0,7x vnitřní LOOP, jenže 0,7 je konstanta a na konstanty se v asymptotice mrdá

Z asypmtotického pohledu neni třeba předpokládat nic - včetně toho kdyby to pokaždé bylo nesplnitelné - ten IF stejně proběhne vnitřní LOOPkrát.

Zpět do poradny Odpovědět na původní otázku Nahoru