Processing math: 100%
Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

posted Jan 9 '15

Přepsáno do (aspoň pro mě) pohodlnějšího tvaru máme algoritmus:

j = 1;

for (i = 1; i <= n; i++) {
    j *= 2;

    for(l = i; l < j; l++)
        f();
}

Ten si lze zjednodušit na kód se složitostí 2^{n +1} -2 , kde l jde klasicky od nuly. n+1 protože část s j *= 2; je ještě před tím vnitřním cyklem. A to odečítání dvojky je tam jen pro korekci, aby mi to vycházelo :-).

j = 1;

for (i = 1; i <= n; i++) {
    j *= 2;

    for(l = 0; l < j; l++)
        f();
}

Na horní odhad by to stačilo, ale na ověření správnosti výpočtu je ještě potřeba zjistit, kolik těch vnitřních iterací vynecháme. A vychází to přesně na známou aritmetickou řadu 1 + 2 + 3 + \dots + n = \frac{n(n+1)}{2}, takže výsledná složitost je 2^{n +1} - 2 - \frac{n(n+1)}{2} = \mathcal{O}(2^{n +1})

Snad jsem nic nepřehlédl. Zkusil jsem si to otestovat a vychází...

click to hide/show revision 2
No.2 Revision

Přepsáno do (aspoň pro mě) pohodlnějšího tvaru máme algoritmus:

j = 1;

for (i = 1; i <= n; i++) {
    j *= 2;

    for(l = i; l < j; l++)
        f();
}

Ten si lze zjednodušit na kód se složitostí 2^{n +1} -2 , kde l jde klasicky od nuly. n+1 protože část s j *= 2; je ještě před tím vnitřním cyklem. A to odečítání dvojky je tam jen pro korekci, aby mi to vycházelo :-).

j = 1;

for (i = 1; i <= n; i++) {
    j *= 2;

    for(l = 0; l < j; l++)
        f();
}

Na horní odhad by to stačilo, ale na ověření správnosti výpočtu je ještě potřeba zjistit, kolik těch vnitřních iterací vynecháme. A vychází to přesně na známou aritmetickou řadu 1 + 2 + 3 + \dots + n = \frac{n(n+1)}{2}, takže výsledná složitost je $$ 2^{n +1} - 2 - \frac{n(n+1)}{2} = \mathcal{O}(2^{n +1}) \mathcal{O}(2^n) $$

Snad jsem nic nepřehlédl. Zkusil jsem si to otestovat a vychází...