اذهب إلى المحتوى

السؤال

نشر

السلام عليكم ورحمة الله تعالى وبركاته.

أثناء لحلي لمشكلة في هاكر رانك صادفني مشكل غريب وهو عندما أشتغل بهذا الكود

def arrayManipulation(n, queries):
    arr= [0]*n
    for i in queries:
        arr[i[0]-1]+=i[2]
        if i[1]>=n:
            continue
        arr[i[1]]-=i[2]
    maximum=0
    temp=0
    for i in range(n):
        temp+=arr[i]
        if maximum< temp:
            maximum =temp
    return maximum

يقوم بعمل submission بشكل عادي و تقبل الاجابة

لكن هذا الكود                                          
  def arrayManipulation(n, queries):
    arr= [0]*n
    for i in queries:
        arr[i[0]-1]+=i[2]
        if i[1]>=n:
            continue
        arr[i[1]]-=i[2]
    maximum=arr[0]
    for i in range(1, n):
        arr[i]=arr[i-1]+arr[i]
        if maximum< arr[i]:
            maximum =arr[i]
    return maximum 

يظهر لي runtime error في حالة الاختبار ب large dataset 10**7 .لكن في الحالات الخفيفة و المتوسطة الكود يشتغل بشكل جيد.

هل يعود السبب الى أن تحديث المصفوفة كل مرة يستهلك الذاكرة . 

حاولت أن أفهم سبب وراء صحة الكود الاول و خطأ الكود الثاني لكني لم أتوصل الى اجابة.

اسم المشكلة array manipulation.

جزاكم الله خيرا.

Recommended Posts

  • 0
نشر

 

الفارق الرئيسي بين الكودين هو كيفية حساب القيم النهائية في المصفوفة بعد التعديلات الكود الأول يقوم بحساب القيم النهائية عبر for واحدة بعد تنفيذ جميع العمليات في الاستعلامات بينما الكود الثاني يقوم بتحديث القيم في كل for منفصلة

في الكود الثاني لديك إضافية for تقوم بحساب القيم النهائية (arr[i] = arr[i-1] + arr[i])، وهذا يمكن أن يزيد من الوقت اللازم لتنفيذ الكود خاصةً مع مجموعة البيانات الكبيرة

إذا كان هناك تحديات في الأداء عند استخدام الكود الثاني مع مجموعة البيانات الكبيرة فقد يكون ذلك بسبب استهلاك الذاكرة الإضافي أو الوقت اللازم لتنفيذ العمليات من الناحية العملية الكود الأول يعتبر أكثر فعالية لأنه يقوم بحساب القيم النهائية في دورة for واحدة دون إضافة دورات إضافية

  • 0
نشر

بالفعل سبب حدوث الخطأ وقت التشغيل في الكود الثاني هو تجاوز سعة الذاكرة 
الاختلاف بين الكود الاول والثاني هو في الكود الأول يتم تحديث قيم المصفوفة arr بشكل مباشر في كل مرة يتم فيها تنفيذ حلقة for ولاكن في الكود الثاني يتم حساب القيمة الإجمالية لكل عنصر في المصفوفة arr من خلال جمع قيم العناصر السابقة.
المشكله التي تتسبب في الخطاء تحدث في حالة مجموعة البيانات الكبيرة (10^7) حيث يتطلب الكود الثاني مساحة ذاكرة أكبر بكثير من الكود الأول وذلك لأن الكود الثاني يقوم بحفظ قيم جميع العناصر السابقة في المصفوفة arr بينما الكود الأول يقوم فقط بحفظ قيم العناصر التي يتم تحديثها.
افضل حل للمشكله هو الحل بواسطةخوارزمية مجموعات البادئات  (Prefix clustering algorithm)

  • تعتمد خوارزمية مجموعات البادئات على حساب مجموعات العناصر المتتالية في المصفوفة.
  • يتم تخزين مجموعات البادئات في مصفوفة جديدة.
  • يمكن استخدام مصفوفة مجموعات البادئات لحساب القيمة الإجمالية لأي مجموعة فرعية من العناصر في المصفوفة الأصلية بكفاءة.

    مثال علي كيفية استخدام الاجوريزم
    def arrayManipulation(n, queries):
      # إنشاء مصفوفة مجموعات البادئات.
      prefix_sums = [0] * (n + 1)
      for i in range(1, n + 1):
        prefix_sums[i] = prefix_sums[i - 1] + queries[i - 1][2]
    
      # حساب القيمة القصوى لمجموع العناصر في المصفوفة.
      maximum = 0
      for i in range(1, n + 1):
        # حساب القيمة الإجمالية للعناصر من 1 إلى i.
        total_sum = prefix_sums[i]
        # حساب القيمة الإجمالية للعناصر من i + 1 إلى n.
        remaining_sum = prefix_sums[n] - prefix_sums[i]
        # تحديث القيمة القصوى.
        maximum = max(maximum, total_sum + remaining_sum)
    
      return maximum
    
    
    # مثال على استخدام الدالة.
    n = 5
    queries = [[1, 2, 100], [2, 4, 100], [3, 5, 100]]
    result = arrayManipulation(n, queries)
    print(result)

     

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...