さて、これで少し楽しかったです。この問題を最初に読んだときに最初に考えたのは、群論(特に対称群S n)でした。forループは、反復ごとに転置(つまりスワップ)を構成することにより、Snに順列σを構築するだけです。私の数学はそれほど壮観ではなく、私は少しさびているので、私の表記が外れている場合は私に耐えられません。
概要
順列A
の後で配列が変更されないというイベントであるとします。最終的に、イベントの確率を見つけるように求められA
ますPr(A)
。
私のソリューションは、次の手順に従おうとします。
- 考えられるすべての順列(つまり、配列の並べ替え)を考慮してください
- これらの順列を、それらに含まれるいわゆるアイデンティティ転置の数に基づいて互いに素なセットに分割します。これは、問題を順列のみに減らすのに役立ちます。
- 順列が偶数(および特定の長さ)である場合に、単位元順列を取得する確率を決定します。
- これらの確率を合計して、配列が変更されていない全体的な確率を取得します。
1)考えられる結果
forループを繰り返すたびに、スワップ(または転置)が作成され、次の2つのいずれか(両方ではない)が発生することに注意してください。
- 2つの要素が交換されます。
- 要素はそれ自体と交換されます。私たちの意図と目的のために、配列は変更されていません。
2番目のケースにラベルを付けます。次のようにアイデンティティの転置を定義しましょう。
IDの転置は、番号がそれ自体と交換されるときに発生します。つまり、上記のforループでn==mの場合です。
リストされたコードの任意の実行に対して、N
転置を作成します。0, 1, 2, ... , N
この「チェーン」に現れるアイデンティティの転置が存在する可能性があります。
たとえば、N = 3
次のような場合を考えてみましょう。
Given our input [0, 1, 2].
Swap (0 1) and get [1, 0, 2].
Swap (1 1) and get [1, 0, 2]. ** Here is an identity **
Swap (2 2) and get [1, 0, 2]. ** And another **
奇数の非同一性転置(1)があり、配列が変更されていることに注意してください。
2)アイデンティティ転置の数に基づく分割
アイデンティティの転置が特定の順列に現れるK_i
イベントであるとします。i
これは、考えられるすべての結果の完全なパーティションを形成することに注意してください。
- 順列は、2つの異なる量のアイデンティティ転置を同時に持つことはできません。
0
可能なすべての順列は、N
アイデンティティの転置の間である必要があります。
したがって、全確率の法則を適用できます。
これで、最終的にパーティションを利用できるようになりました。非同一性転置の数が奇数の場合、配列を変更しない方法はないことに注意してください*。したがって:
*群論から、順列は偶数または奇数ですが、両方になることはありません。したがって、奇数の順列を単位元の順列にすることはできません(単位元の順列は偶数であるため)。
3)確率の決定
したがって、次の2つの確率を決定する必要がN-i
あります。
第一期
最初の項、は、同一性の転置を伴う順列を取得する確率を表しi
ます。forループの反復ごとに、これは二項分布であることがわかります。
- 結果は、それ以前の結果とは無関係であり、
- アイデンティティの転置を作成する確率は同じです。つまり、
1/N
です。
したがって、N
試験の場合、i
アイデンティティの転置を取得する確率は次のとおりです。
第2期
したがって、これまでに達成した場合は、問題を均等に見つけることに減らしましたN - i
。i
これは、転置が単位元である場合に、単位順列を取得する確率を表します。私は素朴なカウントアプローチを使用して、可能な順列の数に対して単位元の順列を達成する方法の数を決定します。
まず、順列(n, m)
と(m, n)
同等のものを検討します。次に、M
可能な非同一性順列の数とします。この量を頻繁に使用します。
ここでの目標は、転置のコレクションを組み合わせて単位元列を形成する方法の数を決定することです。の例と一緒に一般的なソリューションを構築しようとしN = 4
ます。
N = 4
すべてのID転置(つまり )の場合を考えてみましょうi = N = 4
。X
アイデンティティの転置を表現しましょう。それぞれについてX
、可能性がありますN
(それらは:) n = m = 0, 1, 2, ... , N - 1
。したがってN^i = 4^4
、アイデンティティの順列を実現する可能性があります。完全を期すために、二項係数を追加してC(N, i)
、アイデンティティの転置の順序を検討します(ここでは1に等しい)。上記の要素の物理的なレイアウトと以下の可能性の数を使用して、これを以下に示してみました。
I = _X_ _X_ _X_ _X_
N * N * N * N * C(4, 4) => N^N * C(N, N) possibilities
N = 4
これで、とを明示的に置き換えることなくi = 4
、一般的なケースを見ることができます。上記を以前に見つかった分母と組み合わせると、次のことがわかります。
これは直感的です。実際、それ以外の値1
はおそらくあなたを驚かせるはずです。考えてみてください。すべてのN
転置がアイデンティティであると言われる状況が与えられています。この状況でアレイが変更されていない可能性は何ですか?明らかに、1
。
さて、ここでも、 2つのアイデンティティの転置(すなわちN = 4
)を考えてみましょう。慣例として、2つのIDを最後に配置します(後で注文することを考慮します)。これで、2つの転置を選択する必要があることがわかりました。これらは、構成されると、単位元列になります。最初の場所に任意の要素を配置して、それを呼び出しましょう。上で述べたように、アイデンティティではないと仮定する可能性があります(すでに2つ配置しているため、アイデンティティではあり得ません)。 i = N - 2 = 2
t1
M
t1
I = _t1_ ___ _X_ _X_
M * ? * N * N
2番目のスポットに入る可能性のある残りの要素は、の逆数だけですt1
。これは実際にt1
あります(これは、逆数の一意性による唯一の要素です)。ここでも二項係数を含めます。この場合、4つのオープンロケーションがあり、2つのID順列を配置しようとしています。それを行う方法はいくつありますか?42を選択します。
I = _t1_ _t1_ _X_ _X_
M * 1 * N * N * C(4, 2) => C(N, N-2) * M * N^(N-2) possibilities
もう一度一般的なケースを見ると、これはすべて次のことに対応しています。
最後にN = 4
、アイデンティティの転置なしでケースを実行します(つまり i = N - 4 = 0
)。可能性はたくさんあるので、トリッキーになり始めます。二重に数えないように注意する必要があります。同様に、最初の場所に1つの要素を配置し、可能な組み合わせを検討することから始めます。最初に最も簡単な方法を取ります。同じ転置を4回行います。
I = _t1_ _t1_ _t1_ _t1_
M * 1 * 1 * 1 => M possibilities
t1
ここで、2つの固有の要素とを考えてみましょうt2
。M
の可能性と可能性t1
のみがあります(に等しくすることはできないため)。すべての取り決めを使い果たすと、次のパターンが残ります。M-1
t2
t2
t1
I = _t1_ _t1_ _t2_ _t2_
M * 1 * M-1 * 1 => M * (M - 1) possibilities (1)st
= _t1_ _t2_ _t1_ _t2_
M * M-1 * 1 * 1 => M * (M - 1) possibilities (2)nd
= _t1_ _t2_ _t2_ _t1_
M * M-1 * 1 * 1 => M * (M - 1) possibilities (3)rd
次に、3つの固有の要素、、、を考えてみましょt1
う。最初に配置してから。いつものように、私たちは持っています:t2
t3
t1
t2
I = _t1_ _t2_ ___ ___
M * ? * ? * ?
まだいくつの可能性があるかはまだわかりませんt2
。その理由はすぐにわかります。
3番目の場所t1
に配置します。t1
最後の場所に行くとしたら、(3)rd
上記の配置を再現するだけなので、そこに行かなければならないことに注意してください。ダブルカウントは悪いです!これにより、3番目の一意の要素t3
が最終的な位置に残ります。
I = _t1_ _t2_ _t1_ _t3_
M * ? * 1 * ?
では、なぜt2
sの数をより綿密に検討するために1分かかる必要があったのでしょうか。転置t1
とは互いに素な順列にt2
することはできません(つまりn
、またはの1つを共有する必要があります(また、等しくすることはできないため、1つだけを共有する必要がありますm
)。これは、それらが互いに素である場合、順列の順序を入れ替えることができるためです。これは、(1)st
アレンジメントを二重にカウントすることを意味します。
言うt1 = (n, m)
。互いに素であるためには、形式または一部t2
の形式である必要があります。またはではない場合があり、多くの場合はまたはではないことに注意してください。したがって、可能な順列の数は実際にはです。(n, x)
(y, m)
x
y
x
n
m
y
n
m
t2
2 * (N - 2)
では、レイアウトに戻ります。
I = _t1_ _t2_ _t1_ _t3_
M * 2(N-2) * 1 * ?
ここt3
で、の構成の逆である必要がありますt1 t2 t1
。手動でやってみましょう:
(n, m)(n, x)(n, m) = (m, x)
したがって、t3
でなければなりません(m, x)
。これは互いに素ではなく、どちらt1
にも等しくないことに注意してください。したがって、この場合、二重カウントはありません。t1
t2
I = _t1_ _t2_ _t1_ _t3_
M * 2(N-2) * 1 * 1 => M * 2(N - 2) possibilities
最後に、これらすべてをまとめます。
4)すべてをまとめる
以上です。ステップ2で与えられた元の合計に、私たちが見つけたものを代入して、逆方向に作業します。私はN = 4
以下のケースに対する答えを計算しました。これは、別の回答で見つかった経験的な数値と非常によく一致しています。
N = 4
M = 6 _________ _____________ _________
| Pr(K_i)| Pr(A | K_i)| 製品|
_________ | _________ | _____________ | _________ |
| | | | |
| i = 0 | 0.316 | 120/1296 | 0.029 |
| _________ | _________ | _____________ | _________ |
| | | | |
| i = 2 | 0.211 | 6/36 | 0.035 |
| _________ | _________ | _____________ | _________ |
| | | | |
| i = 4 | 0.004 | 1/1 | 0.004 |
| _________ | _________ | _____________ | _________ |
| | |
| 合計:| 0.068 |
| _____________ | _________ |
正しさ
ここに適用する群論の結果があったら、それはクールだろう-そして多分あるだろう!それは確かに、この退屈なカウントをすべて完全になくすのに役立ちます(そして問題をはるかにエレガントなものに短縮します)。で仕事をやめましたN = 4
。の場合N > 5
、与えられたものは概算を与えるだけです(どれだけ良いかはわかりません)。それを考えると、その理由はかなり明らかです。たとえば、転置が与えられた場合、上記で説明されていない4つの固有の要素を使用N = 8
してアイデンティティを作成する方法が明らかにあります。順列が長くなるにつれて、方法の数を数えるのが一見難しくなります(私が知る限り...)。
とにかく、インタビューの範囲内でこのようなことは絶対にできませんでした。運が良ければ、分母のステップまで到達できます。それを超えて、それはかなり厄介なようです。