⊗ppSpOtAU 82 of 83 menu

PHP-da keraksiz massivlarni optimallashtirish

Faraz qilaylik, bir dasturchi 1 dan 100000000 gacha bo‘lgan butun sonlar yig‘indisini topish vazifasiga ega.

Bizning dasturchimiz bu masalani juda nafis hal qildi, mana shunday:

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

Chiroyli yechim, shunday emasmi? Bir qatorda va hammasi shu. Lekin u ishlamaydi! Ushbu kodni ishga tushirib ko‘ring va u sizga juda ko‘p operativ xotira so‘raganingiz haqida xatolik chiqaradi.

Xm, 100000000 juda ko‘p emasdek? Yoki ko‘pmi? Keling, hisoblaylik. range funksiyasi 100000000 ta sonli massiv yaratadi. Faraz qilaylik, PHP har bir son uchun 2 bayt ajratadi - unda bizning massivimizni saqlash uchun 200000000 bayt, ya'ni taxminan 200 megabayt operativ xotira kerak bo‘ladi.

Ammo aslida operativ xotira ancha ko‘proq talab qilinadi, chunki PHPda massivlarni saqlashda juda katta qo‘shimcha xarajatlar bor. Misol uchun, mening xatolik matnimda, men 4294967304 bayt ajratishga harakat qilayotganim haqida xabar beriladi - bu taxminan 4 gigabayt!

Endi nima uchun xatolik yuzaga kelayotgani aniq - biz ruxsat etilgan xotira chegarasidan ancha chiqib ketdik.

Bizning skriptimizni boshqasiga, deyarli operativ xotira talab qilmaydiganiga o‘zgartirish qiyin emas:

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

Yoki matematik yechimdan foydalansak yanada yaxshi bo‘ladi:

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

Bir dasturchi berilgan sonning faktorialini topish vazifasiga ega edi. U uni quyidagicha hal qildi:

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

Ushbu kodda nima noto‘g‘ri ekanligini tushuntiring. Kodni yanada optimalroq qilib o‘zgartiring.

Bir dasturchi 1 dan 1000000 gacha bo‘lgan barcha butun sonlarni yozish uchun ishlatiladigan raqamlar sonini topish vazifasiga ega edi. U uni quyidagicha hal qildi:

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

Ushbu kodda nima noto‘g‘ri ekanligini tushuntiring. Kodni yanada optimalroq qilib o‘zgartiring.

Bir dasturchi berilgan oraliqda joylashgan, 7 ga qoldiqsiz bo‘linadigan sonlar sonini topish vazifasiga ega edi. U uni quyidagicha hal qildi:

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

Ushbu kodda nima noto‘g‘ri ekanligini tushuntiring. Kodni yanada optimalroq qilib o‘zgartiring.

Bir dasturchi sonning bo‘luvchilari yig‘indisini topish vazifasiga ega edi. U uni quyidagicha hal qildi:

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

Ushbu kodda nima noto‘g‘ri ekanligini tushuntiring. Kodni yanada optimalroq qilib o‘zgartiring.

Oʻzbek
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語ქართულიҚазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекTiếng Việt
Biz sayt ishlashi, tahlil qilish va shaxsiylashtirish uchun cookie-fayllardan foydalanamiz. Ma'lumotlarni qayta ishlash Maxfiylik siyosatiga muvofiq amalga oshiriladi.
hammasini qabul qilish sozlash rad etish