PHP में अनावश्यक ऐरे का ऑप्टिमाइजेशन

मान लीजिए कि एक प्रोग्रामर के सामने कार्य है 1 से 100000000 तक पूर्णांकों का योग ज्ञात करना।

हमारे प्रोग्रामर ने इस कार्य का एक सुरुचिपूर्ण समाधान लिखा, इस प्रकार:

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

सुंदर समाधान है, है ना? एक ही पंक्ति में और सब कुछ। लेकिन यह काम नहीं करता! कोशिश करें इस कोड को चलाने की और यह स्क्रीन पर एक त्रुटि दिखाएगा कि आपने बहुत अधिक रैम मांग ली है।

हम्म, 100000000 बहुत अधिक नहीं लगता? या फिर अधिक है? आइए गणना करें। फ़ंक्शन range 100000000 संख्याओं वाला एक ऐरे बनाता है। मान लें कि PHP एक संख्या पर 2 बाइट आवंटित करता है - तो हमारे ऐरे को संग्रहीत करने के लिए 200000000 बाइट की आवश्यकता होगी, यानी लगभग 200 मेगाबाइट रैम।

लेकिन वास्तव में, रैम की आवश्यकता इससे कहीं अधिक होगी क्योंकि PHP में ऐरे संग्रहीत करते समय बहुत अधिक ओवरहेड होता है। उदाहरण के लिए, मेरे यहाँ त्रुटि संदेश में बताया गया है कि मैं 4294967304 बाइट आवंटित करने का प्रयास कर रहा हूँ - यानी लगभग 4 गीगाबाइट!

अब समझ आ गया कि त्रुटि क्यों आती है - हमने अनुमत मेमोरी सीमा से कहीं अधिक का उपयोग कर लिया है।

हमारी स्क्रिप्ट को दूसरे तरीके से लिखना मुश्किल नहीं है, जो व्यावहारिक रूप से रैम का उपयोग नहीं करता:

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

एक प्रोग्रामर के सामने यह ज्ञात करने का कार्य था कि 1 से 1000000 तक सभी पूर्णांकों को लिखने के लिए कितने अंकों की आवश्यकता होगी। उसने इसे निम्नलिखित तरीके से हल किया:

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

समझाइए कि इस कोड में क्या गलत है। कोड को अधिक ऑप्टिमल बनाइए।

Задание 3

एक प्रोग्रामर के सामने किसी दिए गए अंतराल में 7 से बिना शेषफल विभाजित होने वाली संख्याओं की संख्या ज्ञात करने का कार्य था। उसने इसे निम्नलिखित तरीके से हल किया:

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);
?>

समझाइए कि इस कोड में क्या गलत है। कोड को अधिक ऑप्टिमल बनाइए।