PHP-də lazımsız massivlərin optimallaşdırılması
Tutaq ki, bir proqramçının qarşısında 1-dən 100000000-dək tam ədədlərin cəmini tapmaq vəzifəsi qoyulub.
Bizim proqramçı bu problemi incə bir həll etdi, belə:
<?php
echo array_sum(range(1, 100000000));
?>
Gözəl həll, elə deyilmi? Bir sətirdə və s. Amma bu işləməz! Bu kodu işə salmağa cəhd edin və ekrana çoxlu operativ yaddaş istədiyiniz haqqında səhv göstərəcək.
Hmm, 100000000 elə də çox deyil? Yoxsa çoxdur? Gəlin hesablayaq. range funksiyası 100000000 ədədi olan massiv yaradır. Fərz edək ki, PHP bir ədəd üçün 2 bayt ayırır - onda bizim massivi saxlamaq üçün 200000000 bayt, yəni təxminən 200 meqabayt operativ yaddaş lazımdır.
Əslində, PHP-də massiv saxlamaq zamanı çox böyük əlavə xərclər olduğundan, daha çox operativ yaddaş tələb olunacaq. Məsələn, mənim səhvimdə deyilir ki, mən 4294967304 bayt - təxminən 4 gigabayt ayırmağa çalışıram!
İndi aydın oldu ki, niyə səhv baş verir - biz icazə verilən yaddaş limitini xeyli aşdıq.
Skriptimizi demək olar ki, heç bir operativ yaddaş istifadə etməyən başqa birinə yenidən yazmaq o qədər də çətin deyil:
<?php
$sum = 0;
for ($i = 1; $i <= 100000000; $i++) {
$sum += $i;
}
echo $sum;
?>
Ya da daha yaxşısı, riyazi həll istifadə edək:
<?php
$n = 1000000;
$sum = $n * ($n + 1) / 2;
echo $sum;
?>
Bir proqramçının qarşısında verilmiş ədədin faktorialını tapmaq vəzifəsi qoyulmuşdu. O, bunu aşağıdakı kimi həll etdi:
<?php
$n = 100;
echo array_product(range(1, $n));
?>
Bu kodda nəyin səhv olduğunu izah edin. Kodu daha optimal olaraq yenidən yazın.
Bir proqramçının qarşısında 1-dən 1000000-dək bütün tam ədədləri yazmaq üçün istifadə oluna biləcək rəqəmlərin sayını tapmaq vəzifəsi qoyulmuşdu.
O, bunu aşağıdakı kimi həll etdi:
<?php
echo strlen(implode('', range(1, 1000000)));
?>
Bu kodda nəyin səhv olduğunu izah edin. Kodu daha optimal olaraq yenidən yazın.
Bir proqramçının qarşısında verilmiş intervalda qalıqsız 7-ə bölünən ədədlərin sayını tapmaq vəzifəsi qoyulmuşdu.
O, bunu aşağıdakı kimi həll etdi:
<?php
$arr = [];
for ($i = 0; $i <= 1000; $i++) {
if ($i % 7 == 0) {
$arr[] = $i;
}
}
echo count($arr);
?>
Bu kodda nəyin səhv olduğunu izah edin. Kodu daha optimal olaraq yenidən yazın.
Bir proqramçının qarşısında ədədin bölənlərinin cəmini tapmaq vəzifəsi qoyulmuşdu. O, bunu aşağıdakı kimi həll etdi:
<?php
$num = 320;
$divs = [];
for ($i = 0; $i <= $num; $i++) {
if ($num % $i == 0) {
$divs[] = $i;
}
}
echo array_sum($divs);
?>
Bu kodda nəyin səhv olduğunu izah edin. Kodu daha optimal olaraq yenidən yazın.