PHP တွင် မလိုအပ်သော array များကို အိုက်တီမိုက်ဆေးရှင်းခြင်း
ဆော့ဝဲရေးသားသူတစ်ဦးသည် 1 မှ 100000000 အထိ ကိန်းပြည့်များ၏ ပေါင်းလဒ်ကို ရှာရန်တာဝန် ရှိတယ်ဆိုပါစို့။
ကျွန်ုပ်တို့၏ ဆော့ဝဲရေးသားသူသည် ဤပြဿနာကို အောက်ပါအတိုင်း ကျွမ်းကျင်စွာ ဖြေရှင်းခဲ့သည်။
<?php
echo array_sum(range(1, 100000000));
?>
လှပသောဖြေရှင်းချက် မဟုတ်လား? စာကြောင်းတစ်ကြောင်းတည်းနဲ့ အရာအားလုံးပါဝင်တယ်။ သို့သော် ၎င်းသည် အလုပ်မလုပ်ပါ။ ဤကုဒ်ကို လက်တွေ့အလုပ်လုပ်ကြည့်ပါက မှတ်ဉာဏ်အလွန်အကျွံတောင်းဆိုမှုအတွက် အမှားကို ဖော်ပြလိမ့်မည်။
ဟမ်၊ 100000000 ဆိုတာ အများကြီးမဟုတ်ဘူးလား? သို့မဟုတ် အများကြီးလား? တွက်ကြည့်ရအောင်။ range function သည် 100000000 ကိန်းများပါသော array တစ်ခုကို ဖန်တီးပေးသည်။
PHP သည် ကိန်းတစ်ခုအတွက် 2 ဘိုက်နေရာယူမည်ဟု ဆိုကြပါစို့ - ထို့နောက် ကျွန်ုပ်တို့၏ array ကိုသိမ်းဆည်းရန် 200000000 ဘိုက်၊ ဆိုလိုသည်မှာ RAM မီဂါဘိုက် 200 ခန့် လိုအပ်မည်။
သို့သော် တကယ်တော့ PHP တွင် array သိမ်းဆည်းရာတွင် အလွန်ကြီးမားသော စရိတ်စကများ ရှိနေသောကြောင့် RAM ကို ပိုမိုလိုအပ်မည်ဖြစ်သည်။
ဥပမာအားဖြင့်၊ အမှားစာသားတွင် ကျွန်ုပ်သည် 4294967304 ဘိုက် - ဂီဂါဘိုက် 4 ခန့် ခွဲဝေရန် ကြိုးစားနေကြောင်း ဖော်ပြထားသည်။
ယခု အမှားဖြစ်ရသည့် အကြောင်းရင်းကို နားလည်ပါပြီ - ကျွန်ုပ်တို့သည် ခွင့်ပြုထားသော မှတ်ဉာဏ် ကန့်သတ်ချက်ကို သိသိသာသာ ကျော်လွန်နေသည်။
ကျွန်ုပ်တို့၏ စကရစ်ကို RAM ကို သိပ်မသုံးသော အခြားစနစ်သို့ ပြန်ရေးရန် မခက်ခဲပါ။
<?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);
?>
ဤကုဒ်တွင် မှားယွင်းနေသည်ကို ရှင်းပြပါ။ ပိုမိုကောင်းမွန်သောကုဒ်သို့ ပြောင်းလဲပါ။