কম্পিউটার

পাইথনে কিছু ক্রিয়াকলাপ সম্পাদন করে একটি প্রদত্ত অ্যারের সাবয়ারের প্রত্যাশিত যোগফল খুঁজে বের করার প্রোগ্রাম


কিছু ক্রিয়াকলাপ সম্পাদন করে একটি প্রদত্ত অ্যারের সাবয়ারের প্রত্যাশিত যোগফল খুঁজে পাওয়ার জন্য প্রোগ্রাম

ধরুন আমাদের একটি অ্যারে A আছে যার আকার n এবং দুটি মান p এবং q। আমরা A.

তে এই অপারেশনগুলি সম্পাদন করতে পারি
  • এলোমেলোভাবে দুটি সূচী (l, r) নির্বাচন করুন যেখানে l
  • এলোমেলোভাবে দুটি সূচক (l, r) নির্বাচন করুন যেখানে l

প্রথম অপারেশন p সংখ্যা বার এবং দ্বিতীয় অপারেশন q বার করার পরে, আমরা এলোমেলোভাবে দুটি সূচক l &r যেখানে l এর প্রত্যাশিত মান খুঁজে বের করতে হবে

সুতরাং, যদি ইনপুট A =[1,2,3] p =1 q =1 এর মত হয়, তাহলে আউটপুট হবে 4.667 কারণ

ধাপ 1:আমাদের তিনটি পছন্দ আছে −

  • swap(0, 1) তাই অ্যারে হবে 2 1 3

  • swap(0, 2) তাই অ্যারে হবে 3 2 1

  • swap(1, 2) তাই অ্যারে হবে 1 3 2

ধাপ 2:প্রতিটি ফলাফলের জন্য আমাদের কাছে আবার তিনটি পছন্দ আছে −

  • [2 1 3] থেকে [1 2 3], [3 1 2], [2 3 1]

  • [3 2 1] থেকে [2 3 1], [1 2 3], [3 1 2]

  • [1 3 2] থেকে [3 1 2], [2 3 1], [1 2 3]

9টি সম্ভাব্য অ্যারে আছে তাই সম্ভাব্যতা 1/9। সুতরাং 9টি অ্যারের প্রতিটিতে সমান সম্ভাবনা সহ 3টি সম্ভাব্য যোগফল থাকবে। উদাহরণস্বরূপ, [1 2 3], আমরা 1+2, 2+3 এবং 1+2+3 পেতে পারি। এবং এই ইনপুটের জন্য মোট 27টি ফলাফল রয়েছে, প্রত্যাশিত মানটি সমস্ত 27S এর যোগফল খুঁজে বের করে এবং 27 দ্বারা ভাগ করে গণনা করা যেতে পারে৷

এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -

  • একটি ফাংশন matmul() সংজ্ঞায়িত করুন। এটি a, v, n
  • লাগবে
  • toret :=n আকারের একটি অ্যারে এবং 0 দিয়ে পূরণ করুন
  • আমি 0 থেকে n - 1 রেঞ্জের জন্য, কর
      0 থেকে n - 1 রেঞ্জে j-এর জন্য
    • করুন
      • toret[i] :=toret[i] + a[i, j]*v[j]
  • রিটার্ন টরেট
  • প্রধান পদ্ধতি থেকে, নিম্নলিখিতগুলি করুন:
  • n :=A এর আকার
  • temp :=একটি নতুন তালিকা
  • swp :=(n - 3) /(n - 1)
  • swapvalp :=((swp^p)*(n - 1) + 1) /n
  • swapvalm :=(1 - (swp^p)) /n
  • rev :=একটি নতুন খালি তালিকা
  • dotv :=একটি নতুন খালি তালিকা
  • আমি 0 থেকে n - 1 রেঞ্জের জন্য, কর
    • swaprow :=একটি নতুন খালি তালিকা
    • revrow :=একটি নতুন খালি তালিকা
    • 0 থেকে n - 1 রেঞ্জে j-এর জন্য
    • করুন
      • swaprow এর শেষে swapvalm ঢোকান
      • রিভরো শেষে 2*(সর্বনিম্ন i, j, (n-i-1) এবং (n-j-1+1)/(n*(n - 1)) সন্নিবেশ করুন
    • swaprow :=একটি নতুন খালি তালিকা
    • revrow :=একটি নতুন খালি তালিকা
    • 0 থেকে n - 1 রেঞ্জের মধ্যে j এর জন্য, করুন
    • swaprow[i] :=swapvalp
    • রিভরো[i] :=1.0 - 2*(i + 1)*(n - i) - ন্যূনতম (i+1) এবং (n - i))/(n*(n-1))
    • টেম্পের শেষে সোয়াপ্রো ঢোকান
    • রিভের শেষে রিভরো ঢোকান
    • ডটভির শেষে 2*(i+1)*(n-i) - 1)/(n*(n-1)) সন্নিবেশ করুন
  • A :=matmul(temp, A, n)
  • আমি 0 থেকে q রেঞ্জের জন্য, কর
    • A :=matmul(rev, A, n)
  • টোট :=0.0
  • আমি 0 থেকে n রেঞ্জের জন্য, কর
    • tot :=tot + dotv[i]*A[i]
  • মোট প্রত্যাবর্তন

উদাহরণ

আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -

def matmul(a, v, n):
   toret = [0]*n
   for i in range(n):
      for j in range(n):
         toret[i] += a[i][j]*v[j]
   return toret

def solve(A, p, q):
   n = len(A)
   temp = []
   swp = (n - 3)/(n - 1)
   swapvalp = (pow(swp, p)*(n - 1) + 1)/n
   swapvalm = (1 - pow(swp, p))/n
   rev = []
   dotv = []
   for i in range(n):
      swaprow = []
      revrow = []
      for j in range(n):
         swaprow.append(swapvalm)
         revrow.append(2*(min(i, j, n - i - 1, n - j - 1) + 1)/(n*(n - 1)))
      swaprow[i] = swapvalp
      revrow[i] = 1.0 - 2*((i + 1)*(n - i) - min(i + 1, n - i))/(n*(n - 1))
      temp.append(swaprow)
      rev.append(revrow)
      dotv.append(2*((i + 1)*(n - i) - 1)/(n*(n - 1)))

   A = matmul(temp, A, n)
   for _ in range(q):
      A = matmul(rev, A, n)

   tot = 0.0
   for i in range(n):
      tot += dotv[i]*A[i]

   return tot

A = [1,2,3]
p = 1
q = 1
print(solve(A, p, q))

ইনপুট

[1,2,3], 1, 1

আউটপুট

0.0

  1. পাইথনে 1d অ্যারের চলমান যোগফল খুঁজে বের করার জন্য প্রোগ্রাম

  2. কয়েকটি সংখ্যার গুণফল খুঁজে বের করার প্রোগ্রাম যার যোগফল পাইথনে দেওয়া হয়েছে

  3. পাইথন প্রোগ্রামে অ্যারের সমষ্টি খুঁজুন

  4. অ্যারের যোগফল খুঁজে পেতে পাইথন প্রোগ্রাম