Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonでいくつかの操作を実行して、特定の配列のサブ配列の予想される合計を見つけるプログラム


いくつかの操作を実行して、特定の配列のサブ配列の予想される合計を見つけるプログラム

サイズがnで2つの値がpとqの配列Aがあるとします。これらの操作はAで実行できます。

  • l
  • l

最初の操作をp回、2番目の操作をq回実行した後、2つのインデックスl&rをランダムに選択します。ここでl

したがって、入力がA =[1,2,3] p =1 q =1の場合、出力は4.667になります。

ステップ1:3つの選択肢があります-

  • swap(0、1)なので、配列は2 1 3

  • swap(0、2)なので、配列は3 2 1

  • swap(1、2)なので、配列は1 3 2

ステップ2:結果ごとに3つの選択肢があります-

  • [213]から[123]、[3 1 2]、[2 3 1]

  • [321]から[231]、[1 2 3]、[3 1 2]

  • [132]から[312]、[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の範囲のiの場合、do
    • 0からn-1の範囲のjの場合、do
      • 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の範囲のiの場合、do
    • swaprow:=新しい空のリスト
    • revrow:=新しい空のリスト
    • 0からn-1の範囲のjの場合、do
      • swaprowの最後にswapvalmを挿入します
      • 再生の最後に2*(i、j、(n-i-1)および(n-j-1 + 1)/(n *(n-1))の最小値を挿入
    • swaprow:=新しい空のリスト
    • revrow:=新しい空のリスト
    • 0〜n -1の範囲のjの場合、実行します
    • swaprow [i]:=swapvalp
    • revrow [i]:=1.0-2 *((i + 1)*(n-i)-最小(i + 1)および(n-i))/(n *(n-1))
    • tempの最後にswaprowを挿入します
    • revの最後にrevrowを挿入
    • dotvの最後に2*((i + 1)*(n-i)-1)/(n *(n-1))を挿入します
  • A:=matmul(temp、A、n)
  • 0からqの範囲のiについては、
    • A:=matmul(rev、A、n)
  • tot:=0.0
  • 0からnの範囲のiについては、
    • 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. Pythonプログラムで配列の合計を見つける

    この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列の合計を計算するために必要な配列が与えられます。 合計を取得するために各インデックスで配列と要素全体をトラバースするブルートフォースアプローチについては、以下で説明します。合計を取得するための各インデックスについては、以下で説明します。 例 # sum function def sum_(arr,n):    # using built-in function    return(sum(arr)) # main arr = [11,22,33,44,55,66

  2. 配列の合計を見つけるPythonプログラム

    この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 入力として配列が与えられた場合、与えられた配列の合計を計算する必要があります。 ここでは、ブルートフォースアプローチに従うことができます。つまり、リストをトラバースし、各要素を空の合計変数に追加します。最後に、合計の値を表示します。 以下で説明するように、組み込みの合計関数を使用して別のアプローチを実行することもできます。 例 # main arr = [1,2,3,4,5] ans = sum(arr,n) print ('Sum of the array is '