ãbitset 㧠64 åé«éåã§ãã¾ããã64 ã¯å®æ°ãªã®ã§ãªã¼ãã¼ã¯å¤ããã¾ãããã®ãããªèª¬æã¯ã競ããçéã§ãã³ãã³è¦ããã¾ãã
59 æ¥ç®ã®è§£èª¬ã§ããstd::bitset ãªã©ã使ã£ãé«éåãã¯ããã¯ã¯éå»ã« AGC ã«ãåºé¡ããããã¨ãããéè¦äºé ã§ãã®ã§ãç解ãã¦ããããã«ãã¾ãããã
— E869120 (@e869120) 2021å¹´6æ6æ¥
ãªããX[i] < Y[i] ã®å¶ç´ããªãã¦ãæ¬åé¡ã解ããã¨ãã§ãã¾ãã #競ããå ¸å90å pic.twitter.com/zpIVYdc5VL
AGC ã®è§£èª¬ ã¨ããã
ãå®æ°åé«éåã軽è¦ãã風潮ã«å¯¾ãããæ°æã¡è¡¨æããã競ããã®ãããªå ¥åã«ä¸éãããå ´åã§ããªã¼ãã¼ãä¿¡ä»°ãã風潮ã«å¯¾ãããæ°æã¡è¡¨æããªã©ã¯ãä¸æ¦ããã¦ããã¾ãã
ä»åã®ã¡ã¤ã³ã¯ããé·ã \(n\) ã® bit åã® bitwise AND/OR ã shift ã«ãããæé㯠\(\Theta(n)\) ãï¼ãï¼ãããã¯ãããä»®å®ããã®ã¯å¦¥å½ãï¼ï¼ã¨ãã話ã§ãã
tl; dr
word RAM ã®ä¸ã§ã\(\Omega(\log(n))\) åã®é«éåã¨è¨ãããã§ãã
è£è¶³
ãªã¼ãã¼è¨æ³ã«æ £ãã¦ããªã人ã以ä¸ã§æ¯ããªãããã«ãããã£ã¨ã¾ã¨ãã¦ããã¾ãã
- \(\Theta(f(n))\)ï¼ã¡ããã© \(f(n)\) ã®ãªã¼ãã¼ã
- 競ããçéã§è¨ãã¨ããã® \(O(f(n))\) ã«è¿ããã
- \(O(f(n))\)ï¼é«ã
\(f(n)\) ã®ãªã¼ãã¼ã
- \(O(n^3)\) ã¨æ¸ããã¨ããå®éã«ã¯ \(\Theta(n^2)\) ãããããªãã
- \(\Omega(f(n))\)ï¼å°ãªãã¨ã \(f(n)\) ã®ãªã¼ãã¼ã
- \(o(f(n))\)ï¼\(f(n)\) ããçã«å°ãããªã¼ãã¼ã
- \(\omega(f(n))\)ï¼\(f(n)\) ããçã«å¤§ãããªã¼ãã¼ã
å°æåã®æ¹ã¯ä»åã¯ä½¿ãã¾ããã
å°å ¥
次ã®ãããªåé¡ãèãã¦ã¿ã¾ãã
\(0\) ã¾ã㯠\(1\) ãããªãé·ã \(n\) ã®å \(a = (a_0, a_1, \dots, a_{n-1})\) ãä¸ãããã¾ãããããåæãå¤å®ãã¦ãã ããã
- for \(i \in \{0, 1, \dots, n-1\}\) do
- if \(a_i \ne a_{n-i-1}\) then
- return
no
- return
- if \(a_i \ne a_{n-i-1}\) then
- return
yes
æç´ã«ã¯ããã®ãããªã¢ã«ã´ãªãºã ãèããããããã§ãããããã®è¨ç®éã¯ã©ããªãã§ãããï¼ ä½ã®ä»®å®ãç¡ãã« \(O(n)\) æéï¼+ worst \(\Theta(n)\) æéï¼ã ã¨è¨ãåã£ã¦ããã§ããããï¼ \(i\) ã®ã¤ã³ã¯ãªã¡ã³ãã \(n-i-1\) ã®è¨ç®ã\(a\) ã¸ã®ã¢ã¯ã»ã¹ã \(O(1)\) æéã§ã§ãããã®ã¨ä»®å®ãã¦ããã¯ãã§ãï¼ãã£ã¨è¨ãã°ã1 bit ã®ç価å¤å®ã \(O(1)\) æéã¨ä»®å®ãã¦ããã¯ãã§ãããããã«ãããããã¯ä»®å®ãããã§ããï¼ã
èªè ã®ä¸ã«ã¯ãã\(a\) ãé æ¹åã¨éæ¹åã«ã·ã¼ã±ã³ã·ã£ã«ã¢ã¯ã»ã¹ããã ãã§ãããããããã®ä»®å®ã¯ãããªãã ãããã¨è¨ã人ããããããããããªã*1ã®ã§ãå¥ã®ä¾ãåºãã¾ãã
\(0\) ä»¥ä¸ \(2^n\) æªæºãããªãé·ã \(n\) ã®æ´æ°å \(a = (a_0, a_1, \dots, a_{n-1})\) ãä¸ãããã¾ãããã®å¾ããä¸ãããã \(i\) 㨠\(j\) ã«å¯¾ã㦠\(a_i+a_j\) ã®å¤ã¯ãªãã§ããï¼ãã¨ããå½¢å¼ã® \(m\) åã®è³ªåã«çãã¦ãã ããã
ãã㯠\(O(n+m)\) æéã¨è¨ãã¦ã»ããã§ãããä½ã®ä»®å®ãç¡ãã«ã¯è¨ãã¾ããã ããããåæ´æ°ãã©ãããå½¢å¼ã§è¡¨ãã®ãã«ã¤ãã¦ã触ãã¦ãã¾ããã ãã²ã¨ã¤ã®æ´æ°ã表ãã®ã« \(2^n -1\) åã®é£ç¶ãã bit ãç¨ãããã®ãã¡ï¼é£ç¶ããã¨ã¯éããªãï¼\(x\) åã® bit ã \(1\) ã§æ®ãã \(0\) ã®ã¨ãã\(x\) ã表ãã¨ããããªã©ã¨è¨ããã¦ã¯å¤§å¤æ±ãã«ããã®ã§ãããå°ããã·ãªãã®ãè¦æ±ãããã§ãã ã³ã³ãã¥ã¼ã¿ã§æ±ãã«ãããã®ã®è©±ããã¦ããããããªãã®ã§ã2 é²æ³ã§è¡¨ãã®ãããããªã¨ãªãã¾ã*2ã
ã¾ããæ´æ° \(i\) ãç¨ã㦠\(a_i\) ã« \(O(1)\) æéã§ã¢ã¯ã»ã¹ã§ãããã¨ãè¦æ±ããã¾ãã \(a\) ã®é·ã㯠\(n\) ã§ãããã¨ããã\(\log(n)\) bits ç¨åº¦ã®æ´æ°ã¯ \(O(1)\) æéã§æ±ããªãã¨ã話ã«ãªããªããã¨ããããã¾ãã \(a_i+a_j\) ã®è¨ç®ãããªãããªã®ã§ã\(\log(n)\) bits ç¨åº¦ã®å ç®ã \(O(1)\) æéã§ãããã§ãã
word RAM ã®è©±
ããããè¦æã«åã£ãè¨ç®ã¢ãã«ã¨ãã¦ãword RAM ã¨ããã®ãããã¾ã*3ã次ã®ãããªä»®å®ã§ãã
- \(U=2^u\) åã® word ãããªãé
åãã¡ã¢ãªã¨å¼ã¶ã
- å ¥åã¯ãã®ã¡ã¢ãªã«åã¾ãå¿ è¦ãããã
- word ããã¤ã³ã¿ã¨ãã¦æ±ããã
- word ãæ·»åã¨ãã¦ç¨ãã¦ã¡ã¢ãªï¼ã®å ¨ç¯å²ï¼ã«ã¢ã¯ã»ã¹ã§ããã¨ãããã¨ã
- é·ãã \(O(1)\) ã®é£ç¶ãã word ã«å¯¾ããèªã¿æ¸ããååæ¼ç® (
+
,-
,*
,/
,%
)ããããæ¼ç® (&
,|
,^
,!
,<<
,>>
), æ¯è¼æ¼ç® (==
,<
, etc.) 㯠\(O(1)\) æéã§ã§ããã!
ã¯ãããå転ãC ã¨ãã§è¨ãã¨ããã®~
ã
word ã«ãã£ã¦ã¡ã¢ãªã«ã¢ã¯ã»ã¹ã§ãããã¨ãããword ã¯æä½ã§ã \(u\) bit å¿ è¦ã§ãã word ã® bit é·ã \(w\) ã¨ãã㨠\(w\ge u\) ã§ãã
ããããããé£ç¶ãã \(u\) bit ã«å¯¾ããå種æ¼ç®ã \(O(1)\) æéã§ã§ãããã¨ãå¾ãã¾ãã ãã ãããã¡ã¢ãªããé£ã³é£ã³ã® \(u\) åã® bit ãéãã¦ãã¦ãçµåãã¦ã²ã¨ã¤ã®æ´æ°ã¨è¦ãªããããããç¨ããæ¼ç®ãè¡ããã¨ãããã¨ã¯ \(O(1)\) æéã§ã§ããã¨ã¯è¨ã£ã¦ããªããã¨ã«æ³¨æãã¦ãã ããã
æ¬é¡
ãã¦ãå ã ã®è©±ã«æ»ãã¾ãã
é·ã \(n\) ã® bit åã«å¯¾ãããããæ¼ç®ã®è¨ç®éã¯ï¼
é£ç¶ãã \(n\) åã® bit åãããªãã¡ \(n/w\) word ã«å¯¾ããæ¼ç®ã¨ãªãã¾ãã
\(w\) ã¯æä½ã§ã \(\log(n/w)\) bit å¿
è¦ãªãã¨ãã
\(w \ge \log(n/w)\)ãããªãã¡ \(w\cdot 2^w \ge n\) ã¨ãªãã¾ãã
å¼å¤å½¢ããã°ãã
\(w\cdot 2^w = n\) ã®å½¢ã®å¼ã解ãã®ã¯åççã«ã¯ã¤ããã§ããLambert ã® \(W\) é¢æ° ã¨ããã®ãããã¾ãã
ä¸è¬ã«ã¯è¤ç´ æ°ã§å®ç¾©ããã¾ãããããã§ã¯å®æ°ã«ã¤ãã¦ã®ã¿èãã¾ãã
\[
ye^y = x \implies y = \begin{cases}
W_0(x), & \text{if }x \ge 0; \\
W_{-1}(x), & \text{if } -1/e\le x\lt 0.
\end{cases}
\]
ããã§ã¯ \(x\ge 0\) ã®ã¿æ°ã«ããã®ã§ã\(W_0\) ã®ã¿èãã¾ãã
\[
\begin{aligned}
w\cdot 2^w &\ge n \\
w\cdot 2^{w\cdot\log_2(e)\cdot\log_e(2)} &\ge n \\
w\cdot e^{w\cdot\log_e(2)} &\ge n \\
w\cdot\log_e(2)\cdot e^{w\cdot\log_e(2)} &\ge n\log_e(2) \\
w\cdot\log_e(2) &\ge W_0(n\log_e(2)) \\
w &\ge W_0(n\log_e(2))\cdot\log_2(e).
\end{aligned}
\]
ã¾ãã\(W\) é¢æ°ã«ã¤ãã¦ã以ä¸ã®ãã¨ãç¥ããã¦ãã¾ã*4ã \[ x\ge e \implies \ln(x)-\ln(\ln(x)) \le W_0(x). \] ãããããã\(w\in \Omega(\log(n/\log(n)))\) ãè¨ãããã§ãã ããã°ããããã
ä¸çå¼ã示ãã ããªãã\(W\) ã使ããªãã¦ãã§ããããã§ãã
ï¼è¿½è¨ï¼
log(n/log(n)) = Î(log(n)) ã¨æ°ã¥ãã®ã« 300 å¹´ããã£ã
— ãã³ã¡ããððð¦ (@rsk0315_h4x) 2022å¹´5æ11æ¥
ã¾ãã\(\log(n)\ge\log(n/\log(n))\) ã¯ããã¨ãã¦ã \[ \begin{aligned} \log(n/\log(n)) &= \log(n) - \log(\log(n)) \\ &\ge \log(n) - \log(\sqrt{n}) \\ &= \log(\sqrt{n}) \\ &= \frac{1}{2}\log(n) \end{aligned} \] ãªã®ã§ã\(\log(n/\log(n)) = \Theta(\log(n))\) ã§ããã
w ⥠log(n/w) = log(n) - log(w)
— ç¨æè¢ (@noshi91) 2022å¹´5æ10æ¥
2w ⥠w + log(w) ⥠log(n)
w ⥠log(n)/2
ã¯è¨ããã®ã§å°ãå ´é¢ã¯å°ãªãã
ãã£ã±ã \(W\) ã使ããã«ã§ãã¾ãããã
çµå±ã\(w\in\Omega(\log(n))\) ãè¨ããã®ã§ã\(n/w\in O(n/\log(n))\) ã¨ãªãã¾ããã¨ããããã§ãbitset é«éå㯠\(\Omega(\log(n))\) åã®æ¹åã¨è¨ãããã§ãã
ãã¾ã
å¥ã®ã¢ãã«ã®è©±
ãã¨ãã°ããã£ã¨ãã°ãè¨ç®ã¢ãã«ãä»®å®ãã¦ããä»»æã®ãµã¤ãºã®æ´æ°ã®ååæ¼ç®ã¯ \(O(1)\) ã§ã§ãã¾ããã¨ããã®ãããç¨åº¦ã®å¦¥å½æ§ããã£ã¦è¨ããã°ãbitset é«éå㯠\(n\) ãã²ã¨ã¤ã¶ãè½ã¨ããã¨ä¸»å¼µã§ãããã§ãã
word RAM ã®å ã ã®è«æ*6ã§ã¯ã
ããããã®è«æã§ã¯é·ã \(n\) ã®æ´æ°é å \(a\) ã®ã½ã¼ãã \(O(n)\) æéã§éæããã¨è¿°ã¹ã¦ãããã\(n^2 \log(\max a)\) ã®é·ãï¼ãããï¼ï¼ã®é¤ç®ã \(O(1)\) æéã§ã§ããã¨ä»®å®ããä¸ã§ã®ã¢ã«ã´ãªãºã ã§ããããã°ãã ã
ã¨ãã£ãæ¨ã®ãã¨ãæ¸ããã¦ãã¾ããã
ï¼è¿½è¨ï¼ä¸ã®å¼ã§ã¯ \(w\) ã®ä¸éã«ãã触ãã¦ããªãã®ã§ãå¥ã« \(w=n\) ã®ããã«ã¯ã¼ããµã¤ãºããã°ãã¢ãã«ãä»®å®ãããã¨ãã§ãããã§ããããã¡ãã£ã¨ä¹±æ´ã ã¨æãã¾ããã¾ããã¡ã¢ãªãç¡é§ã«ä½¿ããã¨ã§ã\(w\) ããã£ã¨å¿ è¦ã§ããããã¨ä¸»å¼µãããã¨ãã§ãããã§ãããç¡é§ã«ä½¿ã£ãã¡ã¢ãªã®ã¶ãã®æéã®ããã§æããããã§ãã
ï¼è¿½è¨ï¼å¥ã«ã¡ã¢ãªãç¡é§ã«ä½¿ããã¨ãã\(w\) ããã¡ã大ããã¢ãã«ã§ããã¨ããã®ãä»®å®ããã®èªä½ã¯è¨±ãããæ°ããã¾ããç¾å®çã«ã¯ããã妥å½ã§ã¯ãªããããªã®ã§ word RAM ãèãã¦ãããã§ã¯ããã¾ããã
ä»åã®å 容ã«é¢é£ããè¬ç¾©è³æã§ããword RAM 以å¤ã«ããTuring machine ãè«çåè·¯ãç¨ããå ´åã«è¨ç®éã¯ã©ããªããï¼ã¨ãã£ããã¨ãæ¸ããã¦ãã¾ãã
許容ããæ¼ç®ã®è©±
word RAM ã«ããã¦ã¯ word size ã®ååæ¼ç®ã \(O(1)\) ã¨è¨ã£ã¦ãã¾ãããä¹ç®ãé¤ç®ã¯ããã«å«ããªãã¨ããç«å ´ãããããã§ãã
ããã¯ãç¹å®ã®æ¡ä»¶ãæºããåè·¯ã«ãã£ã¦å ç®ã¯å®ç¾ã§ãããä¹ç®ã¯å®ç¾ã§ããªãã¨ããäºæ
ã«ããããã§ãã
n bit ã®ä¹ç®ã M(n) æéã§ã§ããã°ãNewton æ³ã«ãã£ã¦ n bit ã®é¤ç®ã O(M(n)) æéã§ã§ããã®ã§ãä¹ç®ãä»®å®ãããªãé¤ç®ãä»®å®ããããã§ãã ããåã§ã\(M(n)\in O(1)\) ãªã®ã§ã\(O(\log(w))\) æéã¨ãã«ãªã£ã¡ããã¾ããç¡è¦ãã¦ãã ããã
ã¾ããç«ã£ã¦ããæä¸ä½ bit ã®ä½ç½®ã¯ãä¹ç®ã許ãã°æ¬¡ã®ææ³ã§ \(O(1)\) æéã§å¾ããã¾ãã
ããã«ãããç«ã£ã¦ããæä¸ä½ bit ã n & -n
ã§å¾ããããã¨ã¨åããã¦ãç«ã£ã¦ããæä¸ä½ bit ã®ä½ç½®ã \(O(1)\) æéã§å¾ããã¾ãã
word RAM ä¸ã®ã¢ã«ã´ãªãºã ã®è©±
ããããè¨äºãããã¾ãã
ã¾ã¨ã
\(O(n/w)\) ãªã©ã® \(w\) ã¯å®æ°ã§ã¯ãªãã¦ãå ¥åãµã¤ãº \(n\) ã«ä¾ã£ã¦ããã¨è¦ãªãç«å ´ãããããã¨ãã話ã§ããã
ãã·ã³ãå ¥åã«ä¾ããã¨ã«ç´å¾ããããªã人ã¯ãã大ãããµã¤ãºã®åé¡ããã¡ã¢ãªã®å°ãªãæã® PC ã§è§£ãã®ã¯ä¸å¯è½ãã¿ãããªãã¨ãèãã¦ã¿ãã¨ããããããã¾ããï¼ å¤§ããªã¡ã¢ãªãã¡ããã¨æ±ããã¨ãã§ãããã·ã³ã§ããã°ãããã«ä¼´ã£ã¦ãããã大ããå¤ãæ±ããããã«ãªããã¨ãã£ããããªæ°æã¡ã«è¿ãæ°ããã¾ãã
è£è¶³
ãå®éã«ã¯ãã£ãã·ã¥ã¨ãã®é¢ä¿ã§ãã£ã¡ã 64 åé«éåãããã¨ã¯éããªããã å®æ° åé«éåã§ã¯ãªããã¨ãããããé¡ã®ä¸»å¼µã§ã¯ãªãã§ãã
ããã
log ã¯å®æ°å¦æ´¾ã®äººã«ã¨ã£ã¦ã¯ bitset é«éåã¯å®æ°åé«éåã¨ãããã¨ããããã¾ããããããã§ãããï¼
*1:ãã¤ã³ã¯ãªã¡ã³ãã¯ãªããå®æ°æéãªã®ã§ããã¨ãæã£ã人ãããããï¼
*2:å½ç¶ãæèã«ãã£ã¦ã¯ã³ã³ãã¥ã¼ã¿ã«ç¸ãããå¿ è¦ã¯ããã¾ããããããã§ã¯ä¸å¿ç«¶ããã«è¿ãæèãªã®ã§ã
*3:å ¥åã«å¿ãã¦ãµã¤ãºãå¤ããã®èªä½ã¯ transdichotomous model ã¨å¼ã°ãããã®ã§ãåä½æéã§ã§ããç¹å®ã®æ¼ç®ã決ãããã®ã word RAM ããããã¾ããã
*4:Hoorfar, A., & Hassani, M. (2008). Inequalities on the Lambert W function and hyperpower function. J. Inequal. Pure and Appl. Math, 9(2), 5-9.
*5:ãã®ããããè¨æ³ãæªããã®ã§å°ãã¾ããã
*6:Fredman, Michael L., and Dan E. Willard. "Surpassing the information theoretic bound with fusion trees." Journal of computer and system sciences 47.3 (1993): 424-436.