-
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path複雑性クラス.html
104 lines (89 loc) · 8.26 KB
/
複雑性クラス.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
<title>複雑性クラス</title>
(追記歓迎!)
<h3 class="shadow">複雑性クラス</h3>
いわゆるPとかNPのやつです。<br>
情報工学生やアルゴリズマーなら知っておいた良い知識だと思いますが、<br>
競技プログラミングをする上では、深く知らなくても良いと思ってます。(*)<br><br>
厳密な定義は、教科書やWikipediaに譲るとして、ゆるふわにわかった気にさせるページです。
<br><br>
(*)結局問題のクラスはPでも、 NP-Hardでも、EXPTIMEでも、計算時間的に解ける問題しか出ず.<br>
計算量の見積りのほうが大事だと思うからです。(運営者の考えです。)
<h3 class="shadow">クラス P</h3>
<b>判定問題</b>(yes/no・possible/impossibleなど、どちらかを答えさせる問題)で、<br>
回答が、多項式時間で判定可能な問題のことである。<br><br>
「決定性チューリングマシンが多項式時間で回答できる」というのが定義だが、詳しくは各自で。<br>
<br>
yukicoderの問題でいうと以下の問題等がイメージしやすいかも
<ul>
<li><a href="http://yukicoder.me/problems/341">No.138 化石のバージョン</a></li>
<li><a href="http://yukicoder.me/problems/432">No.197 手品</a></li>
</ul>
最適化(答えの最小化・最大化)問題に対しては、「答えがk以下(以上)か?」という質問に変換することで判定問題にできる。
その判定ができれば2分探索によって実際の答えを(十分な精度まで)多項式時間で求められることに注意する。<br>
このようにしてできた対応する判定問題があるクラスに含まれるとき、(厳密ではないが)元の問題に対してそのクラスに含まれるということがある。<br>
(対応する判定問題が)Pに含まれる最適化問題の例としては、
<ul>
<li><a href='http://yukicoder.me/problems/609'>No.224 文字列変更(easy)</a></li>
<li><a href='http://yukicoder.me/problems/424'>No.178 美しいWhitespace (1)</a></li>
</ul>
(なお、値を求めさせる問題は<b>クラスFP</b>というらしく、競技プログラミングの問題の多くはこれだと思われる)<br>
ただ、これはクラスPに限らないが、判定問題でなく値を求めさせる問題であっても、自然な対応する定義のクラスを指してカジュアルに「そのクラスに含まれる」ということは多い。<!-- この記事でもこの言い方をすることがある。--> <br>
<h3 class="shadow">クラス NP</h3>
<b>判定問題</b>で、<b>証拠</b>が<b>多項式時間</b>で検証可能な問題のことである。<br>
(回答については述べてないことに注意)
<br><br>
競技プログラミングっぽくというと、スペシャルジャッジの判定が多項式時間で終わること。
<br><br>
実際の定義は<br>
「非決定性チューリングマシンが多項式時間で回答できる」もしくは<br>
「yesだったときの証拠が多項式時間で検証可能」<br><br>
よくある誤りは「指数時間かかるからNP」、「PじゃないからNP」など。<br>
(「NP完全」のこと指して、「NP」と言ってる事が多い?)
<br><br>
<b>「クラスP」の問題はすべて「クラスNP」でもあります。</b><br><br>
例え回答に指数時間以上かかっても、「証拠が多項式時間で検証できればNP」です。<br>
$P \subseteq NP$ の関係がある (もし $P \neq NP$が証明されれば$P \subset NP$ である。現在この見方が強い)
<br><br>
yukicoderの問題でいうと以下の問題がイメージしやすいかも
<ul>
<li><a href="http://yukicoder.me/problems/535">No.231 めぐるはめぐる (1)</a></li>
<li><a href="http://yukicoder.me/problems/498">No.232 めぐるはめぐる (2)</a></li>
</ul>
<h3 class="shadow">クラス NP完全 (NP-complete)</h3>
「クラス NP」の中で一番難しい問題クラス<br>
NP完全の問題が多項式時間で解けてしまうと、P=NPということになる。(未だに証明されていない)<br>
(つまり、NP完全の問題は多項式時間で解けないと思われる。)
<h3 class="shadow">クラス NP困難 (NP-hard)</h3>
NPと同等以上(NPも含む)難しいだろうと思われるクラス。
つまり、「yesだったときの証拠が多項式時間"以上"で検証可能」や、判定問題ではないものもNP困難に含まれる。<br>
<br>
正直、困難という名称がついてるが、困難っぽくはない気がしてます。<br>
NPに入るがNP困難でもPでもない問題を<a href='https://en.wikipedia.org/wiki/NP-intermediate'>NP-intermediate</a>問題といい、いくつかの自然な問題がこれに属すると思われている(ex.<a href="https://ja.wikipedia.org/wiki/%E8%A8%88%E7%AE%97%E8%A4%87%E9%9B%91%E6%80%A7%E7%90%86%E8%AB%96#NP.E3.81.AB.E3.81.8A.E3.81.91.E3.82.8B.E4.B8.8D.E5.AE.8C.E5.85.A8.E5.95.8F.E9.A1.8C">グラフ同型</a>)。<br>
<br>
「NP」かつ「NP困難」は「NP完全」である。
<h3 class="shadow">クラス #P (sharp-P)</h3>
数え上げ問題のクラス。<br>
多項式時間で実行される非決定性チューリングマシンが受理する実行パス(非決定性)の数が答えとなるようなもの。<br>
いわば、クラスNPの数え上げ版。<br>
「数え上げ」というが、確率問題や期待値問題もある意味での「数え上げ」とみなすことができるので、このクラスに入りうる。<br>
競技プログラミングにおいては、ある数kで割った余りを答えさせることが多い。その場合、<a href='https://complexityzoo.uwaterloo.ca/Complexity_Zoo:M#modkp'>Mod<sub>k</sub>P</a>と呼ばれる問題クラスになる。<br>
ただ、任意の素数modで割った余りを求められる場合には<a href='http://yukicoder.me/wiki/%E4%B8%AD%E8%8F%AF%E9%A2%A8%E5%89%B0%E4%BD%99%E5%AE%9A%E7%90%86'>中国人剰余定理</a>によって多項式時間で元の答えを得ることができるので、ある意味で同じことである。
<h3 class="shadow">#P完全 (#P-complete)</h3>
#Pの中で一番難しい問題のクラス。<br>
判定問題が多項式時間で解ける問題でも、数え上げバージョンは#P完全となることがよくある。2部マッチング, 2SAT, トポロジカルソート などが例である。
<h3 class="shadow">クラス BPP</h3>
乱数を使って多項式時間で定数確率で正しい答えが出せるような判定問題のクラス。「モンテカルロ法」(の中で多項式時間で実行されるもの)。
<h3 class="shadow">クラス RP, co-RP</h3>
クラスBPPが両側誤りを許すのに対して、片側誤りしか許さないクラス。片側誤りの方向に対応してRPとco-RPがある。<br>
たとえば、素数判定問題はMiller-Rabin法によりco-RPに含まれることがわかる(最近になって、AKSアルゴリズムによってPに含まれることが示された)。
<h3 class="shadow">クラス ZPP</h3>
乱数を使って期待多項式時間で解ける判定問題のクラス。「ラスベガス法」(の中で期待多項式時間で実行されるもの)。
RPが片側誤りを許すのに対して"zero-sided error"<!-- (日本語訳わからない) !-->であり、停止したら絶対に正しい答えを返す。<br>
(筆者の感覚的には)数論アルゴリズムやそれを応用したアルゴリズムに多い。たとえば、有限体上の多項式の因数分解にはzero-sided errorの期待多項式時間アルゴリズムがよく知られている。
<h3 class="shadow">xx-hard, xx-complete のクラスについて</h3>
<p>
クラスCに対する"C-hard"のクラスは「Cと同じ程度かそれ以上に難しい」ということを意味するが、実際には「還元 (reduction)」によって定義される。
還元にも種類があり、"xx-hard"のクラスごとに定義が違うことがあるので注意する必要がある。
基本的には、「Aが解けたらBが(相対的に)効率的に解ける」ということを「BをAに還元した」と言う。
</p>
<p>クラスCに対する"C-complete"のクラスは「CかつC-hard」として定義される。</p>