PHP-তে অপ্রয়োজনীয় অ্যারে অপ্টিমাইজেশন

ধরুন একজন প্রোগ্রামারের কাছে কাজ হল ১ থেকে ১০০০০০০০ পর্যন্ত পূর্ণসংখ্যার যোগফল বের করা।

আমাদের প্রোগ্রামার এই সমস্যার একটি মার্জিত সমাধান লিখেছেন, এভাবে:

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

সুন্দর সমাধান, তাই না? এক লাইনে এবং সবকিছু। কিন্তু এটি কাজ করে না! এই কোডটি চালানোর চেষ্টা করুন এবং এটি স্ক্রিনে একটি ত্রুটি দেখাবে যে আপনি খুব বেশি র্যাম মেমরি অনুরোধ করেছেন।

হুম, ১০০০০০০০ মনে হয় তেমন বেশি নয়? নাকি বেশি? আসুন গণনা করি। ফাংশন range ১০০০০০০০ সংখ্যা সহ একটি অ্যারে তৈরি করে। ধরুন PHP একটি সংখ্যার জন্য ২ বাইট বরাদ্দ করে - তাহলে আমাদের অ্যারে সংরক্ষণের জন্য প্রয়োজন হবে ২০০০০০০০০ বাইট, যা প্রায় ২০০ মেগাবাইট র্যাম মেমরি।

কিন্তু বাস্তবে র্যাম মেমরির প্রয়োজন হবে এর চেয়ে অনেক বেশি কারণ PHP-এ অ্যারে সংরক্ষণ করার সময় খুব বড় ওভারহেড থাকে। উদাহরণস্বরূপ, আমার এখানে ত্রুটির বার্তায় বলা হয়েছে, যে আমি ৪২৯৪৯৬৭৩০৪ বাইট বরাদ্দ করার চেষ্টা করছি - যা প্রায় ৪ গিগাবাইট!

এখন বোঝা যাচ্ছে, কেন ত্রুটি ঘটছে - আমরা অনুমোদিত মেমরি সীমা ছাড়িয়ে গেছি।

আমাদের স্ক্রিপ্টটি অন্য উপায়ে পুনরায় লিখা কঠিন নয়, যা ব্যবহারিকভাবে র্যাম মেমরি ব্যবহার করবে না:

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

অথবা আরও ভাল, আমরা গাণিতিক সমাধান ব্যবহার করি:

php<?php
  $n = 1000000;
  $sum = $n * ($n + 1) / 2;
  echo $sum;
?>
Задание 1

একজন প্রোগ্রামারের কাছে কাজ ছিল একটি প্রদত্ত সংখ্যার ফ্যাক্টোরিয়াল বের করা। তিনি এটি নিম্নলিখিতভাবে সমাধান করেছেন:

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

ব্যাখ্যা করুন, এই কোডটির什么问题। কোডটিকে আরও অনুকূলভাবে পুনরায় লিখুন।

Задание 2

একজন প্রোগ্রামারের কাছে কাজ ছিল ১ থেকে ১০০০০০০ পর্যন্ত সমস্ত পূর্ণসংখ্যা লিখতে কতগুলি অঙ্ক ব্যবহার করা যায় তা বের করা। তিনি এটি নিম্নলিখিতভাবে সমাধান করেছেন:

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

ব্যাখ্যা করুন, এই কোডটির什么问题। কোডটিকে আরও অনুকূলভাবে পুনরায় লিখুন।

Задание 3

একজন প্রোগ্রামারের কাছে কাজ ছিল একটি প্রদত্ত সীমার মধ্যে ৭ দ্বারা নিঃশেষে বিভাজ্য সংখ্যার সংখ্যা বের করা। তিনি এটি নিম্নলিখিতভাবে সমাধান করেছেন:

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

ব্যাখ্যা করুন, এই কোডটির什么问题। কোডটিকে আরও অনুকূলভাবে পুনরায় লিখুন।

Задание 4

একজন প্রোগ্রামারের কাছে কাজ ছিল একটি সংখ্যার ভাজকের যোগফল বের করা। তিনি এটি নিম্নলিখিতভাবে সমাধান করেছেন:

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

ব্যাখ্যা করুন, এই কোডটির什么问题। কোডটিকে আরও অনুকূলভাবে পুনরায় লিখুন।