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));
?>
Бу кодда нима но tugri эканлигини тушантиринг. Кодни янада оптималроқ қилиб ёзинг.
Бир программистнинг олдига 1 дан 1000000 гача бўлган
барча бутун сонларни ёзиш учун ишлатиладиган
рақамлар сонини топиш вазифаси қўйилган эди.
У уни қуйидагича ечди:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Бу кодда нима но tugri эканлигини тушантиринг. Кодни янада оптималроқ қилиб ёзинг.
Бир программистнинг олдига берилган
оралиқда жойлашган, 7 га бўлинғанда
қолдиқ қолдирмайдиган сонларнинг сонини топиш
вазифаси қўйилган эди. У уни қуйидагича ечди:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Бу кодда нима но tugri эканлигини тушантиринг. Кодни янада оптималроқ қилиб ёзинг.
Бир программистнинг олдига соннинг бўлувчиларининг йиғиндисини топиш вазифаси қўйилган эди. У уни қуйидагича ечди:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Бу кодда нима но tugri эканлигини тушантиринг. Кодни янада оптималроқ қилиб ёзинг.