閒話:隨機 Hash

Meatherm發表於2024-07-14

隨機 Hash:堆疊必要條件

如果我們有一種方法來檢驗某個物件的某個性質,當物件滿足這個性質的時候,這個方法必然能使該物件透過檢驗;否則這個方法會使該物件以 \(p\) 的機率透過檢驗。那麼我們將得到一個極可能正確的檢驗方法:連續使用前述方法檢驗該物件足夠多次。誤透過檢驗的機率 \(x\) 將隨檢驗次數 \(m\) 的提升而迅速降低,因此我們的方法是極可能正確的。

當然,我們不能無限制地提升檢驗次數,這會讓我們的檢驗速度變低。那麼,我們應該怎樣選擇檢驗次數,才能使 錯誤率 \(x = p^{m}\) 被控制到一個可以接受的範圍內?

怎樣的錯誤率是可以被接受的?

不難發現,可以被接受的錯誤率與實驗次數 \(n\) 有關。在具體的題目中,我們幾乎要在每一次實驗中都不誤判,除此之外的結果都難以接受。因此,\(n\) 越大,可以被接受的錯誤率就越小。

下面是當錯誤率 \(x\) 和實驗次數 \(n\) 在某個量級的時候,透過所有實驗的正確率表格。(即透過所有實驗不報錯的機率)

單次錯誤率 (\(x\)) / 實驗次數 (\(n\)) \(10^5\) \(10^6\) \(10^7\) \(10^8\)
\(10^{-5}\) \(0.3679\) \(0\) \(0\) \(0\)
\(10^{-6}\) \(0.9048\) \(0.368\) \(0\) \(0\)
\(10^{-7}\) \(0.9900\) \(0.9048\) \(0.3679\) \(0.0000\)
\(10^{-8}\) \(0.9990\) \(0.9900\) \(0.9048\) \(0.3678\)
\(10^{-9}\) \(0.9999\) \(0.9990\) \(0.9900\) \(0.9048\)

這裡的實驗次數一般要考慮到資料組數或者測試點數量(畢竟我們不想在 CF 中 WA 哪怕一個點對吧?)。

如果對單次正確率有自信,可以直接使用伯努利不等式:

\[(1-x)^{n} \geq 1 - nx \ \ \ (x > -1,n \geq 1) \]

該不等式表明當我們足夠悲觀(直接認為錯誤率為單次錯誤率乘實驗次數)時,正確率也是有保障的。

當單次錯誤率在 \(10^{-9}\)\(10^{-8}\) 看上去不錯,但是接近 \(10\%\) 的錯誤率不夠小)的時候,我們的總體正確率都是非常樂觀的,因為幾乎沒有題目會實驗 \(10^{8}\) 次。

當單次錯誤率較高的時候,我們有幾乎沒有代價的降低錯誤率方法:重複隨機。選取合適的重複隨機次數,將單次錯誤率維持在 \(10^{-9}\) 級別,我們就可以認為這是可以接受的錯誤機率。

具體的錯誤率分析

Sum Hash 一例:QOJ 5254 Differences

考慮答案串,其它每個字串都和它有 \(m - k\) 個相同的字元。必要條件呼之欲出:和該字串相同的位恰有 \((n-1)(m-k)\) 個。

進一步地,給每個字串隨機賦權 \(w_i\)。列舉答案串的每一位,統計這一位和答案串相同的串的權值和。那麼,僅當權值和為 \(sum(m - k)\) 時,答案串合法。

考慮分析錯誤率。當某一種權值 \(w_i\) 並非出現了 \((m-k)\) 次時,考慮固定其餘的 \(w_j\) 不變,值域內至多隻有 \(1\)\(w_i\) 會使得它和 \(sum(m-k)\) 相等,因此錯誤率可以近似看作 \(1/V\)

Sum Hash 一例:CF 1746F Kazaee

給每種數賦隨機權值然後檢驗區間和是否是 \(k\) 的倍數。此處值域可看作 \([0,k)\),那麼當隨機權值取遍 \([0,k)\) 的時候,固定其餘的隨機權值不變,類似的分析可以分析出:錯誤率至多 \(1/2\)(當 \(k = 2\) 的時候達到最高)。

此時需要將隨機次數提升到 \(25\) 次左右(\(2 \times 10^{-8}\) 左右的錯誤率)。

Xor Hash 一例:CSP 2022 星戰

前面的部分略去。

首先不難分析出按位獨立。然後,每一位非法時錯誤率約 \(1/2\)(套用 Sum Hash 時的分析方法:固定其餘不變,改變欽定的關鍵元素的權值),因此錯誤率為 \((0.5)^{L}\),其中 \(L\) 為向量長度。

Xor Hash 另一例:Dzy loves Chinese

這裡我們需要把隨機權值當成 \(2^i\) 使用並插入進線性基裡。這要求我們每次取樣的大小必須遠小於向量位長。我們認為一次錯誤是誤把線性無關組判斷為線性相關組,即插進線性基失敗了。

如果我們的向量長度為 \(L\),每一位均勻取 \(0/1\),那麼我們可以近似估計錯誤率:第 \(i\) 個向量插入時已經有 \((i-1)\) 位有主元,從而有 \(\frac{1}{2^{L-{i-1}}}\) 的機率被前 \(i\) 個向量線性表出(考慮將有主元的位消成 \(0\),此時只有 \(\frac{1}{2^{L-i-1}}\) 的機率滿足整個數就是 \(0\);其它情況下可以找到一位作為主元)。

因此,正確率為 \((1-\frac{1}{2^L})(1-\frac{1}{2^{L-1}})(1-\frac{1}{2^{L-2}}) \cdots (1 - \frac{1}{2^{L- n + 1}})\),其中 \(n\) 是取樣大小。這也和蒙特卡洛方法得出的結果大致吻合。

相關文章