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);
?>
Бул коддо эмне туура эмес экенин түшүндүрүңүз. Кодду дагы оптималдуураак кылып өзгөртүңүз.