NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
Avatar
Tomas
Člen
Avatar
Tomas:18.12.2017 17:14

Zdravím,
potřeboval bych poradit, jaká je výsledná asymptotická složitost. Máme zde for, který by nám měl udávat lineární složitost, ale jaká je výsledná složitost, pokud ve foru ještě využíváme funkci se složitosti lineární.

Díky

Př.

for (int i = 0; i < x; i++)
        // Zde nějaká funkce s lineární složitostí O(n)
 
Odpovědět
18.12.2017 17:14
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Tomas
David Hartinger:18.12.2017 17:19

Vždycky, když máš cyklus v cyklu, tak je to O(n2). Samozřejmě předpokládám, že ta funkce s lineární složitostí souvisí s tím samým počtem prvků (n) jako tento cyklus.

Editováno 18.12.2017 17:19
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
18.12.2017 17:19
New kid back on the block with a R.I.P
Avatar
Tomas
Člen
Avatar
Tomas:18.12.2017 17:27

Děkuji za odpověď, byl jsem trošku zmatený, nebo-li jsem si nebyl jistý :)

 
Nahoru Odpovědět
18.12.2017 17:27
Avatar
brevnovak
Člen
Avatar
brevnovak:18.12.2017 17:30

otázka je, jestli je to opravdu cyklus v cyklu. muzes konkretne napsat, o jakou fci se jedna..?

 
Nahoru Odpovědět
18.12.2017 17:30
Avatar
Tomas
Člen
Avatar
Tomas:18.12.2017 17:42

Samozřejmě jak tu již David psal, mělo by se jednat o funkci, která by byla závislá na prvku (n), což by byla, neboť jsem potřeboval v kolekci o délce (n) najít určitý prvek, což je již samo o sobě lineární hledání a mělo by to vyjít v tom foru na těch O(n2),

 
Nahoru Odpovědět
18.12.2017 17:42
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Tomas
Martin Dráb:18.12.2017 19:32
  1. n zde značí délku vstupních dat (v bitech). Pokud bych měl třeba program, který obsahuje třeba
for (i = 0; i < 20; ++i)
for (j = 0; j < 20; ++j)
  proved_nejakou_konstantni_operaci();

tento kus kódu nebude nijak ovlivňovat asymptotickou složitost programu, protože počet operací, které provede, nezávisí na délce vstupních dat. Asymptotická složitost tohoto kusu je tedy O(1).

  1. i kdyby ta funkce v tom cyklu nebyla lineární, ale lepší než lineární (např. logaritmická), pořád můžeš tvrdit, že tvůj program má složitost O(n2) a budeš mít pravdu. Když totiž řekneš, že asymptotická složitost tvého programu je O(n2), ve skutečnosti říkáš, že pro vstupní data větší než malá a nějakou pevnou kladnou hodnotu c platí, že složitost tvého programu je <= c*n2. Samozřejmě, je rozumné se snažit udávat asymptotické složitosti co nejpřesněji (tzn. když ta funkce uvnitř toho cyklu bude mít logaritmickou složitost, tak je lepší říci, že celý cyklus/program má složitost O(n*log n), ne O(n2) či něco ještě většího).

Zároveň je třeba mít na paměti, že asymptotická složitost obvykle nefunguje na malých vstupních datech. Pokud budeš třeba chtít seřadit 3-5 čísel, nemá smysl na tento úkol používat některý ze sofistikovaných třídících algoritmů ((randomizovaný) quicksort, heapsort), protože než se rozjedou, primitivní třídění založené na manuálním porovnávání je porazí.

Je to prostě jen takový horní odhat, kterým říkáš, že tvůj program pro rozumně velká vstupní data nepoběží pomaleji než ten výraz v závorce za O.

Editováno 18.12.2017 19:33
Nahoru Odpovědět
18.12.2017 19:32
2 + 2 = 5 for extremely large values of 2
Avatar
Tomas
Člen
Avatar
Odpovídá na Martin Dráb
Tomas:18.12.2017 19:50

Děkuji za velice srozumitelnou odpověď, která mě zase obohatila o znalosti a pár věcí vysvětlila :) Díky

 
Nahoru Odpovědět
18.12.2017 19:50
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.