Computer >> Máy Tính >  >> Lập trình >> Python

Chương trình tìm tổng dự kiến ​​của các mảng con của một mảng nhất định bằng cách thực hiện một số hoạt động trong Python

Chương trình tìm tổng dự kiến ​​của các mảng con của một mảng nhất định bằng cách thực hiện một số phép toán

Giả sử chúng ta có một mảng A có kích thước là n và hai giá trị p và q. Chúng tôi có thể thực hiện các thao tác này trên A.

  • Chọn ngẫu nhiên hai chỉ mục (l, r) trong đó l
  • Chọn ngẫu nhiên hai chỉ mục (l, r) trong đó l

Sau khi thực hiện thao tác thứ nhất p số lần và thao tác thứ hai q lần, chúng ta chọn ngẫu nhiên hai chỉ số l &r trong đó l

Vì vậy, nếu đầu vào là A =[1,2,3] p =1 q =1, thì đầu ra sẽ là 4,667 vì

Bước 1:chúng tôi có ba lựa chọn -

  • swap (0, 1) để mảng sẽ là 2 1 3

  • swap (0, 2) để mảng sẽ là 3 2 1

  • swap (1, 2) để mảng sẽ là 1 3 2

Bước 2:chúng tôi có ba lựa chọn một lần nữa cho mỗi kết quả -

  • [2 1 3] đến [1 2 3], [3 1 2], [2 3 1]

  • [3 2 1] đến [2 3 1], [1 2 3], [3 1 2]

  • [1 3 2] đến [3 1 2], [2 3 1], [1 2 3]

Có 9 mảng có thể có nên xác suất là 1/9. Vì vậy, mỗi mảng trong số 9 mảng sẽ có 3 tổng có thể có với xác suất bằng nhau. Ví dụ, [1 2 3], chúng ta có thể lấy 1 + 2, 2 + 3 và 1 + 2 + 3. Và có tổng cộng 27 kết quả cho đầu vào này, giá trị mong đợi có thể được tính bằng cách tìm tổng của tất cả 27S và chia nó cho 27.

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

  • Định nghĩa một hàm matmul (). Điều này sẽ mất a, v, n
  • toret:=một mảng có kích thước n và điền bằng 0
  • đối với tôi trong phạm vi từ 0 đến n - 1, thực hiện
    • đối với j trong phạm vi từ 0 đến n - 1, thực hiện
      • toret [i]:=toret [i] + a [i, j] * v [j]
  • quay trở lại toret
  • Từ phương thức chính, hãy thực hiện như sau:
  • n:=kích thước của A
  • temp:=một danh sách mới
  • swp:=(n - 3) / (n - 1)
  • swapvalp:=((swp ^ p) * (n - 1) + 1) / n
  • swapvalm:=(1 - (swp ^ p)) / n
  • rev:=một danh sách trống mới
  • dotv:=một danh sách trống mới
  • đối với tôi trong phạm vi từ 0 đến n - 1, thực hiện
    • swaprow:=một danh sách trống mới
    • revrow:=một danh sách trống mới
    • đối với j trong phạm vi từ 0 đến n - 1, thực hiện
      • chèn swapvalm vào cuối swaprow
      • chèn 2 * (tối thiểu i, j, (n-i-1) và (n-j-1 + 1) / (n * (n - 1)) vào cuối vòng lặp
    • swaprow:=một danh sách trống mới
    • revrow:=một danh sách trống mới
    • đối với j trong phạm vi từ 0 đến n - 1, thực hiện
    • swaprow [i]:=swapvalp
    • revrow [i]:=1,0 - 2 * ((i + 1) * (n - i) - tối thiểu của (i + 1) và (n - i)) / (n * (n-1))
    • chèn hoán đổi vào cuối thời gian tạm thời
    • chèn vòng quay vào cuối vòng quay
    • chèn 2 * ((i + 1) * (n-i) - 1) / (n * (n-1)) vào cuối dấu chấmv
  • A:=matmul (temp, A, n)
  • đối với tôi trong phạm vi từ 0 đến q, thực hiện
    • A:=matmul (rev, A, n)
  • tổng:=0.0
  • đối với tôi trong phạm vi từ 0 đến n, thực hiện
    • tot:=tot + dotv [i] * A [i]
  • trả về tổng số

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

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

Đầu vào

[1,2,3], 1, 1

Đầu ra

0.0