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
- 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 -
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
Ví dụ
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