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]
- 0からn-1の範囲のjの場合、do
- リターントレット
- メインの方法から、次の手順を実行します。
- 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
-
Pythonプログラムで配列の合計を見つける
この記事では、以下に示す問題ステートメントの解決策について学習します。 問題の説明 −配列の合計を計算するために必要な配列が与えられます。 合計を取得するために各インデックスで配列と要素全体をトラバースするブルートフォースアプローチについては、以下で説明します。合計を取得するための各インデックスについては、以下で説明します。 例 # sum function def sum_(arr,n): # using built-in function return(sum(arr)) # main arr = [11,22,33,44,55,66
-
配列の合計を見つけるPythonプログラム
この記事では、特定の問題ステートメントを解決するための解決策とアプローチについて学習します。 問題の説明 入力として配列が与えられた場合、与えられた配列の合計を計算する必要があります。 ここでは、ブルートフォースアプローチに従うことができます。つまり、リストをトラバースし、各要素を空の合計変数に追加します。最後に、合計の値を表示します。 以下で説明するように、組み込みの合計関数を使用して別のアプローチを実行することもできます。 例 # main arr = [1,2,3,4,5] ans = sum(arr,n) print ('Sum of the array is '