⊗ppSpOtAU 82 of 83 menu

Felesleges tömbök optimalizálása PHP-ban

Tegyük fel, hogy egy programozó előtt az a feladat áll, hogy keresse meg az egész számok összegét 1-től 100000000-ig.

Programozónk elegáns megoldást írt erre a feladatra, így:

<?php echo array_sum(range(1, 100000000)); ?>

Szép megoldás, nem igaz? Egy sorban és minden. De nem működik! Próbáld meg futtatni ezt a kódot, és hibát fog kiírni arról, hogy túl sok memóriát igényeltél.

Hmm, 100000000 nem tűnik olyan soknak? Vagy mégis? Számoljunk. A range függvény létrehoz egy tömböt 100000000 számmal. Tegyük fel, hogy a PHP 2 bájtot foglal le egy számra - ekkor a tömbünk tárolásához 200000000 bájtra, azaz kb. 200 megabájt memóriára lesz szükség.

Valójában jóval több memóriára lesz szükség amiatt, mert a PHP-ban nagyon nagyok a tömbök tárolásának rezsiköltsége. Például nálam a hibaüzenet szerint 4294967304 bájtot próbáltam lefoglalni - ez kb. 4 gigabájt!

Most már világos, miért jön a hiba - jóval túlléptük a megengedett memórialimitust.

Nem olyan nehéz átírni a szkriptünket egy másikra, amely gyakorlatilag nem fogyaszt memóriát:

<?php $sum = 0; for ($i = 1; $i <= 100000000; $i++) { $sum += $i; } echo $sum; ?>

Vagy még jobb, ha matematikai megoldást használunk:

<?php $n = 1000000; $sum = $n * ($n + 1) / 2; echo $sum; ?>

Egy programozó előtt az a feladat állt, hogy keresse egy adott szám faktoriálisát. Ő a következőképpen oldotta meg:

<?php $n = 100; echo array_product(range(1, $n)); ?>

Magyarázd meg, mi a baj ezzel a kóddal. Írd át a kódot optimalizáltabb verzióra.

Egy programozó előtt az a feladat állt, hogy keresse meg azon számjegyek számát, amelyekkel le lehet írni az összes egész számot 1-től 1000000-ig. Ő a következőképpen oldotta meg:

<?php echo strlen(implode('', range(1, 1000000))); ?>

Magyarázd meg, mi a baj ezzel a kóddal. Írd át a kódot optimalizáltabb verzióra.

Egy programozó előtt az a feladat állt, hogy keresse a maradék nélkül 7-tel osztható számok számát egy adott intervallumban. Ő a következőképpen oldotta meg:

<?php $arr = []; for ($i = 0; $i <= 1000; $i++) { if ($i % 7 == 0) { $arr[] = $i; } } echo count($arr); ?>

Magyarázd meg, mi a baj ezzel a kóddal. Írd át a kódot optimalizáltabb verzióra.

Egy programozó előtt az a feladat állt, hogy keresse egy szám osztóinak összegét. Ő a következőképpen oldotta meg:

<?php $num = 320; $divs = []; for ($i = 0; $i <= $num; $i++) { if ($num % $i == 0) { $divs[] = $i; } } echo array_sum($divs); ?>

Magyarázd meg, mi a baj ezzel a kóddal. Írd át a kódot optimalizáltabb verzióra.

Magyar
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
A weboldal működéséhez, elemzéshez és személyre szabáshoz sütiket használunk. Az adatfeldolgozás a Adatvédelmi irányelvek szerint történik.
összes elfogadása beállítás elutasítás