テスト名の「ハッカー」は、コンピューティング指向のソリューションを見つけようとしていることを示しています。
したがって、(a)1つの整数が他の整数の2倍である「好ましい」ケースと、(b)考えられるすべてのケースを総当たりで列挙するプログラムから始めましょう。答えはそれらの比率になります。一般的なソリューションをコーディングしました。入力は正の整数n
で、出力は確率です。
n=100
all=favorable=0
for i=1 to n
for j=1 to n
if (i != j) all=all+1 {1}
if (j == 2*i) favorable = favorable+1 {2}
if (i == 2*j) favorable = favorable+1 {3}
return(favorable / all)
(正しさの証明は、任意の正の数iに対してであるという事実に依存しています。)私≠ 2 私私
333 n6 n3 n26 n2O(n2)んn = 100ん10000
ハッカーとして最初にしたいことの1つは、内部ループを(可能な場合)単純化することにより、2次のパフォーマンスを排除することです。このために、(番号が付けられた)内部ループの行を体系的に調べ、次の点に注意してください。
i
all
n − 1all
j
all
n-1
2 I ≤ Nall
12 I ≤ N
行3は、提供されたものi
が偶数になると実行されます。
これが変換されたプログラムです。
n=100
all=favorable=0
for i=1 to n
all = all + (n-1) {1'}
if (2*i <= n) favorable = favorable+1 {2'}
if (even(i)) favorable = favorable+1 {3'}
return(favorable / all)
さらに進んで、そのループを排除できますか?
んall
n*(n-1)
2 I ≤ N⌊ N / 2 ⌋n / 2
私⌊ N / 2 ⌋
プログラムの2番目の変換は次のとおりです。
n=100
all=favorable=0 {0}
all = all + n * (n-1) {1''}
favorable = favorable + floor(n/2) {2''}
favorable = favorable + floor(n/2) {3''}
return(favorable / all)
O (n2)O (1 )
最後に、初期化(行0)を各変数の最初の使用にロールインし、行2 ''と3 ''を組み合わせることにより、いくつかの単純な代数的変換があります。
n=100
all = n * (n-1)
favorable = 2 * floor(n/2)
return(favorable / all)
n = 100
all = 100 * (100-1) = 100*99
favorable = 2 * floor(100/2) = 2*50 = 100
favorable/all = 100 / (100*99) = 1/99
1 / 99
O (1 )