⊗ppSpOtAU 82 of 83 menu

PHPде керексиз массивдерди оптималдаштыруу

Кандайдыр бир программисттин алдына 1дон 100000000го чейинки бүтүн сандардын суммасын табуу милдети коюлсын.

Биздин программист бул маселени чечүү үчүн кооз чечим жазды, мындай:

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

Кооз чечим, туурабы? Бир сапта жана башка сыяктуу. Бирок ал иштебейт! Бул кодду иштетип көрүңүз, ал сизге оперативдүү эстен ашыкча өтө көп талап кылып жатканы жөнүндө катаны чыгарат.

Хмм, 100000000 анча деле көп эмес сыяктуу? Же көпбү? Эсептейли. Функция range 100000000 сандары бар массив түзөт. PHP бир сан үчүн 2 байт бөлсүн дейли - анда биздин массивибизди сактоо үчүн 200000000 байт, башкача айтканда болжол менен 200 мегабайт оперативдүү эс керек болот.

Бирок чындыгында оперативдүү эс азыраак эмес, көп керек болот, анткени PHPде массивди сактоодо өтө чоң кошумча чыгымдар бар. Мисалы, менин ката текстімде, мен 4294967304 байт бөлүп алгысы келе жатканым көрсөтүлдү - болжол менен 4 гигабайт!

Катанын эмне үчүн пайда болгону түшүнүктүү болду - биз рұқсат этилген эс чегинен алыстап кеттик.

Биздин скрипти башкача, практикалык түрдө оперативдүү эсти керектөөгөн вариантта кайра жазуу оор эмес:

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

Жана дагы жакшысы, биз математикалык чечимди колдонобуз:

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

Кандайдыр бир программисттин алдына берилген сандын факториалын табуу милдети коюлду. Ал аны төмөнкүдөй чечти:

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

Бул коддо эмне туура эмес экенин түшүндүрүңүз. Кодду дагы оптималдуураак кылып өзгөртүңүз.

Кандайдыр бир программисттин алдына 1дон 1000000го чейинки бардык бүтүн сандарды жазуу үчүн канча цифра керек экенин табуу милдети коюлду. Ал аны төмөнкүдөй чечти:

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

Бул коддо эмне туура эмес экенин түшүндүрүңүз. Кодду дагы оптималдуураак кылып өзгөртүңүз.

Кандайдыр бир программисттин алдына берилген аралыкта жайгашкан, калдыксыз 7ге бөлүнгөн сандардын санын табуу милдети коюлду. Ал аны төмөнкүдөй чечти:

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

Бул коддо эмне туура эмес экенин түшүндүрүңүз. Кодду дагы оптималдуураак кылып өзгөртүңүз.

Кандайдыр бир программисттин алдына сандын бөлүүчүлөрүнүн суммасын табуу милдети коюлду. Ал аны төмөнкүдөй чечти:

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

Бул коддо эмне туура эмес экенин түшүндүрүңүз. Кодду дагы оптималдуураак кылып өзгөртүңүз.

Кыргызча
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어LietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
Биз сайттин иштөөсү, аналитика жана персонализация үчүн cookie файлдарын колдонобуз. Маалыматтарды иштетүү Маалыматты коргоо саясаты боюнча жүргүзүлөт.
баарын кабыл алуу ыңгайлаштыруу четке кагуу