Weitere ähnliche Inhalte
Mehr von Yusuke Matsushita (11)
Kürzlich hochgeladen (11)
確率解析計算
- 9. 計算量=比較回数の総数X
𝑦1 , 𝑦2 , … , 𝑦 𝑛 :入力を昇順に並び替えたもの
𝑋 𝑖𝑗 :ソート中に𝑦 𝑖 と𝑦 𝑗 を比較するかどうかを表す
確率変数(1 or 0)
𝑛−1 𝑛
𝑋= 𝑋 𝑖𝑗
𝑖=1 𝑗=𝑖+1
𝑛−1 𝑛 𝑛−1 𝑛
𝐄 𝑋 = 𝐄 𝑋 𝑖𝑗 = 𝐄 𝑋 𝑖𝑗
𝑖=1 𝑗=𝑖+1 𝑖=1 𝑗=𝑖+1
- 10. 𝒚 𝒊 と𝒚 𝒋 が比較される
⇔ 𝒚 𝒊 か𝒚 𝒋 が同じグループにいてどちらかが軸になる
⇔ 𝒚 𝒊 , 𝒚 𝒊+𝟏 , … , 𝒚 𝒋 の中で𝒚 𝒊 か𝒚 𝒋 が最初に軸になる
2
𝐄 𝑋 𝑖𝑗 =
𝑗− 𝑖+1
𝑛−1 𝑛 𝑛
2
𝐄 𝑋 = 𝐄 𝑋 𝑖𝑗 = 𝑛+1− 𝑘
𝑘
𝑖=1 𝑗=𝑖+1 𝑘=2
= 2𝑛 ln 𝑛 + Θ(𝑛)
平均計算量は𝜪(𝒏 𝐥𝐨𝐠 𝒏)
(入力もしくは軸の選択がランダムであるという条件下で)
- 11. 最良計算量:𝛰(𝑛 log 𝑛)
(軸の選択で常に中央値を選ぶ)
最悪計算量:𝛰(𝑛2 )
(軸の選択で常に最大値/最小値を選ぶ)
どれくらいの確率で𝜪 𝒏 𝐥𝐨𝐠 𝒏 となるのか?
- 14. 補題1:
木の根から葉までの任意の路において、良い頂点の数
は𝑐 log 2 𝑛を超えない。(𝑐はある正の定数)
証明:
路の上の良い頂点の数を最大にするには、良い頂点
だけの道を通り、かつそれぞれの頂点の子の大きい方
に向かえばよい。
このとき良い頂点の数は、𝑐 = log 3 2とすると、
2
log 3 𝑛 = log 3 2 ∙ log 𝑛 = 𝑐 log 2 𝑛
2 2
(証明終わり)
- 15. 補題2:
木の根から葉までの任意の路において、頂点数は
1 − 1 𝑛2 よりも高い確率で𝑐 ′ log 2 𝑛を超えない。(𝑐′はあ
る正の定数)
証明:
1/3の確率でよい頂点が出る試行があるとする。良い頂
点が𝑐 log 2 𝑛回現れるまでにかかる試行の回数𝑋は頂
点数と等しくなると考えてよい。
このとき、
𝜇 = 𝐄 𝑋 = 3𝑐 log 2 𝑛 ⋯ (1)
*確率pの事象が起こるまでにかかる回数(=パラメーターp
の幾何確率変数)の期待値は1/p
- 16. 証明続:
ここで、次の定理を用いる。 (Chernoff上界)
𝑋が独立なPoisson試行𝑋1 , … , 𝑋 𝑛 の和であるとき、
𝜇 = 𝐄[𝑋]とすると、任意の0 < 𝛿 ≤ 1に対して
−𝜇𝛿 2 3
Pr 𝑋 ≥ 1 + 𝛿 𝜇 ≤ 𝑒
上の式に(1)を代入して、
− 3𝑐 log2 𝑛𝛿 2 3
Pr 𝑋 ≥ 3𝑐 log 2 𝑛 1 + 𝛿 ≤ 𝑒
−𝑐 log2 𝑒 𝛿 2
= 𝑛
𝛿= 2/(𝑐 log 2 𝑒), 𝑐 ′ = 3𝑐 1 + 𝛿 とすると、
Pr(𝑋 ≥ 𝑐 ′ log 2 𝑛) ≤ 𝑛−2
(証明終わり)
- 17. 定理:
乱択クイックソートの実行時間は少なくとも1 − 1/𝑛の確
率で𝑂(𝑛 log 𝑛)となる。
証明:
路は高々𝑛本なので、最高頂点数が𝑐 ′ log 2 𝑛を超える
ような路がない確率は𝑛が十分大きいとき、
𝑛
1 1
1− 2 >1−
𝑛 𝑛
このとき、深さの最大値は最高頂点数𝑐 ′ log 2 𝑛であり、
同じ深さの頂点で行われる比較の回数の総和は高々𝑛
である。よって、比較の回数の総和は高々𝑐 ′ log 2 𝑛 ∙ 𝑛
であるので、実行時間のオーダーは𝑂(𝑛 log 𝑛)となる。
- 18. 𝐄 𝑋
Pr 𝑋 ≥ 𝑎 ≤ 𝑋は非負の確率変数, 𝑎 > 0
𝑎
𝐕𝐚𝐫 𝑋
Pr 𝑋− 𝐄 𝑋 ≥ 𝑎 ≤ (𝑎 > 0)
𝑎2
1
Pr 𝑋 − 𝐄 𝑋 ≥ 𝑡 ∙ σ 𝑋 ≤ 2 (𝑡 > 1)
𝑡
𝐕𝐚𝐫 𝑋
Pr |𝑋 − 𝐄 𝑋 | ≥ 𝑡 ∙ 𝐄 𝑋 ≤ 2 (t > 1)
𝑡 𝐄 𝑋 2
𝑋を独立ないくつかのPoisson試行の和とし、𝜇 = 𝐄 𝑋 とするとき、
𝜇
𝑒𝛿
Pr 𝑋 ≥ 1 + 𝛿 𝜇 < 𝛿>0
1+𝛿 1+𝛿
−𝜇𝛿 2 3
Pr 𝑋 ≥ 1 + 𝛿 𝜇 ≤ 𝑒 0< 𝛿≤1
Pr 𝑋 ≥ 𝑅 ≤ 2−𝑅 𝑅 ≥ 6𝜇
𝜇
𝑒 −𝛿
Pr 𝑋 ≤ 1 − 𝛿 𝜇 < 0< 𝛿<1
1 − 𝛿 1−𝛿
2
Pr 𝑋 ≤ 1 − 𝛿 𝜇 ≤ 𝑒 −𝜇𝛿 2 0 < 𝛿 < 1
2
Pr 𝑋 − 𝜇 ≥ 𝛿𝜇 ≤ 2𝑒 −𝜇𝛿 3
0< 𝛿<1
𝐕𝐚𝐫 𝑋
Pr(𝑋 = 0) <=
𝐄 𝑋 2
𝑋が𝑛個のBernoulli確率変数の和である時
𝑛 Pr 𝑋 𝑖 =1
Pr 𝑋 > 0 ≥ 𝑖=1 𝐄 𝑋 𝑋 =1
𝑖
- 22. #include <cstdio> #include <ctime> #include <cstdlib> #if 1 #define
REP(i,x) for(int i=0;i<x;++i) #define REPab(i,a,b) for(int i=a;i<b;++i)
void MakeInput(int number) { srand((unsigned)time(nullptr)); FILE *fp
= fopen(“in_quicksort.txt”,“w”); fprintf(fp,“%d¥n¥n”,number);
REP(i,number)fprintf(fp,“%d¥n”,rand()*(RAND_MAX+1)+rand());
fclose(fp); } const int MAX = 1000000; int a[MAX], b[MAX]; int number;
FILE *in, *out; int comptimes; void QuickSort(int begin, int end) { ///
comptimes+=end-begin-1; /// if(end-begin<=1) return; int x =
a[rand()%(end-begin)+begin]; int nsmall=0, nlarge=0;
REPab(i,begin,end){ if(a[i]<x){ //small b[begin+nsmall]=a[i];
++nsmall; }else{ //large b[end-nlarge-1]=a[i]; ++nlarge; } }
b[begin+nsmall]=x; REPab(i,begin,end){ a[i]=b[i]; }
QuickSort(begin,begin+nsmall); QuickSort(begin+nsmall+1,end); } const
int repeat = 1000; int main() { srand((unsigned)time(nullptr));
REP(cnt,repeat){ MakeInput((rand()*(RAND_MAX+1)+rand())%MAX); in
= fopen(“in_quicksort.txt”,“r”); out = fopen(“out_quicksort.txt”,“a”);
comptimes=0; fscanf(in,“%d”,&number);
REP(i,number)fscanf(in,“%d”,&a[i]); QuickSort(0,number); ///
fprintf(out,“%d %d¥n”,number,comptimes);
if(cnt%(repeat/100)==0)printf(“cnt is %d¥n”,cnt); /// fclose(in);
fclose(out); } return 0; } #endif