通信复杂度问题
通信復(fù)雜度問(wèn)題:確定雙方手中所有數(shù)的中位數(shù)
????通信復(fù)雜度(communication complexity)主要研究這么一類(lèi)問(wèn)題: A 持有數(shù)據(jù) x , B 持有數(shù)據(jù) y ,他們想要合作計(jì)算某個(gè)關(guān)于 x 和 y 的二元函數(shù)值 f(x, y) ,那么在漸近意義下,兩人至少需要傳輸多少 bit 的數(shù)據(jù)。最近著迷于通信復(fù)雜度,看到了幾個(gè)與通信復(fù)雜度有關(guān)的問(wèn)題,和大家分享一下。下面就是其中之一。
????A 、 B 的手中各有一個(gè) {1, 2, …, n} 的子集。兩人想知道,如果把他們手中的數(shù)全都放在一塊兒,那么這些數(shù)(可能會(huì)有重復(fù)的數(shù))的中位數(shù)是多少。然而, A 、 B 兩人遠(yuǎn)隔千里,他們之間通信的成本非常高。因此,他們想在通信線路上傳輸盡可能少的信息,使得最終兩人都知道中位數(shù)的值。在這里,為了簡(jiǎn)便起見(jiàn),我們直接 定義 m 個(gè)數(shù)的中位數(shù)是第 ? m / 2 ? 小的數(shù),因而如果 m = 2k ,那么中位數(shù)就應(yīng)該直接取第 k 小的數(shù)。
????其中一種最笨的方法是, A 把手中的所有數(shù)全部發(fā)給 B 。由于發(fā)送一個(gè)不超過(guò) n 的正整數(shù)最多會(huì)用到 log(n) 個(gè) bit ,而 A 手里的數(shù)最多有 O(n) 個(gè),因此 A 傳給 B 的信息量就是 O(n · logn) 。于是, B 就得到了足夠多的信息,可以直接計(jì)算中位數(shù)了,算好后再把結(jié)果告訴 A ,此時(shí)又要耗費(fèi) log(n) 個(gè) bit (但它并不會(huì)成為通信量的瓶頸)。因此,在這種方案中,總的通信復(fù)雜度就是 O(n · logn) 。事實(shí)上,傳送一個(gè) {1, 2, …, n} 的子集只需要一個(gè) n 位 01 串就夠了,因而我們可以把通信復(fù)雜度降低到 O(n) 個(gè) bit 。
????利用下面的辦法,我們可以實(shí)現(xiàn) O(logn · logn) 的通信復(fù)雜度。首先, A 、 B 分別告訴對(duì)方自己手中有多少個(gè)數(shù),這一共會(huì)耗費(fèi) O(logn) 個(gè) bit 。接下來(lái),兩人在區(qū)間 [1, n] 上進(jìn)行二分查找。假設(shè)到了某一步,中位數(shù)被限定在了區(qū)間 [i, j] 里,那么 A 就計(jì)算出 k = (i + j) / 2 ,數(shù)一數(shù)自己手中有多少個(gè)數(shù)比 k 小,然后告訴 B ,由 B 再來(lái)數(shù)數(shù)自己這邊又有多少個(gè)比 k 小的數(shù),從而判斷出 k 作為中位數(shù)來(lái)說(shuō)是偏大了還是偏小了,并把判斷出來(lái)的結(jié)果返回給 A 。根據(jù)情況,區(qū)間 [i, j] 將被更新為 [i, k] 或者 [k, j] ,兩人在新的區(qū)間上繼續(xù)二分下去。整個(gè)算法將會(huì)持續(xù) O(logn) 輪,每一輪都會(huì)傳輸 O(logn) 的數(shù)據(jù),因此總的通信復(fù)雜度是 O(logn · logn) 。
????另一方面,通信復(fù)雜度至少是 Ω(logn) 的。這是因?yàn)?#xff0c;如果規(guī)定 A 和 B 最多只能交流 k 個(gè) bit ,那么整個(gè)交流歷史最多就只有 k 次分岔的機(jī)會(huì),到最后最多只能產(chǎn)生 2k 個(gè)不同的分支;但事實(shí)上中位數(shù)有可能是 1 到 n 中的任何一個(gè),共有 n 種不同的可能,因此 2k 必須大于等于 n 。這說(shuō)明 k 必須大于等于 log2(n) ,也就是說(shuō)兩個(gè)人總會(huì)有必須要交流 log2(n) 個(gè) bit 才行的時(shí)候。
????一個(gè)有意思的問(wèn)題自然而然地誕生了:我們所得的上界和下界仍然有差距。究竟是剛才的算法還不夠經(jīng)濟(jì),還是剛才證明的結(jié)論還不夠強(qiáng)呢?
????還想說(shuō)明一點(diǎn)的是,兩個(gè)人商量算法的過(guò)程,或者其中一個(gè)人把算法告訴另一個(gè)人的過(guò)程,這可以不算進(jìn)通信復(fù)雜度里。事實(shí)上,把它們算進(jìn)通信復(fù)雜度里也沒(méi)關(guān)系,因?yàn)樗鼈兎凑际?O(1) 的。
?
????我們還能把通信復(fù)雜度進(jìn)一步降低到 O(logn) ,從而完美地解決這個(gè)問(wèn)題。為此,我們先給出另一種 O(logn · logn) 的算法,然后把它改進(jìn)到 O(logn) 去。
????假設(shè) A 和 B 手中的數(shù)分別有 |A| 個(gè)和 |B| 個(gè),而且正好有 |A| = |B| = 2k ,其中 k 是某個(gè)正整數(shù)。如果不是的話,可以讓 A 先花費(fèi) O(logn) 個(gè) bit 把 |A| 告訴 B ,同樣地, B 也花費(fèi) O(logn) 個(gè) bit 把 |B| 告訴 A 。然后,兩人找出一個(gè)最小的但是比 |A| 和 |B| 都大的 2k 。接下來(lái),兩個(gè)人都在自己的數(shù)據(jù)當(dāng)中加入 1 和 n ,把各自手中的數(shù)填充到 2k 個(gè)。只要最后兩個(gè)人總共加入了同樣多的 1 和 n (或者加進(jìn)去的 n 比加進(jìn)去的 1 多一個(gè),如果 |A| + |B| 是奇數(shù)的話),這都不會(huì)改變中位數(shù)的值。兩人可以花費(fèi) O(logn) 個(gè) bit 來(lái)約定,每個(gè)人都往自己的數(shù)據(jù)里加入多少個(gè) 1 和多少個(gè) n 。注意,雖然兩個(gè)人手中的數(shù)變多了,但從對(duì)數(shù)意義上看,這僅僅是常數(shù)級(jí)別的變化。
????現(xiàn)在,每個(gè)人手中都有 2k 個(gè)數(shù)了。每個(gè)人都給自己手中的所有數(shù)從小到大排個(gè)序。假設(shè)此時(shí) A 手中所有數(shù)的中位數(shù)是 a , B 手中所有數(shù)的中位數(shù)是 b 。兩人用 O(logn) 個(gè) bit 交換 a 和 b 的值。如果 a < b ,那么 A 手中前面一半的數(shù)肯定不可能是中位數(shù)了, A 就把前面一半的數(shù)丟掉;同時(shí), B 手中后面一半的數(shù)肯定也不可能是中位數(shù),因此 B 就可以把他手中后面一半的數(shù)都丟掉。類(lèi)似地,如果 a > b ,那么 A 就可以把他后面一半的數(shù)丟掉, B 就可以把他前面一半的數(shù)丟掉。不管怎么樣, A 、 B 兩人手里的數(shù)都只剩下原來(lái)的一半了,并且如果把兩個(gè)人手中的數(shù)合起來(lái)看,那么真正的中位數(shù)左右兩邊都被去掉了同樣多的數(shù),因而剩下的數(shù)將會(huì)保持中位數(shù)不 變。接下來(lái), A 算出新的 a 是多少, B 算出新的 b 是多少,然后兩人再次比較 a 和 b ,并繼續(xù)扔掉各自手里其中一半的數(shù)……不斷這樣做下去,那么每個(gè)人手中的數(shù)都會(huì)成半地減少。等到哪一步,兩個(gè)人手里都只剩一個(gè)數(shù)了,小的那個(gè)數(shù)一定就是中 位數(shù)了;或者某一步出現(xiàn)了 a = b 的情況,那么這個(gè)值就一定是中位數(shù)了。整個(gè)過(guò)程一共有 O(logn) 輪,每一輪都會(huì)傳輸 O(logn) 的數(shù)據(jù),因此總的通信復(fù)雜度是 O(logn · logn) 。
????現(xiàn)在,我們把算法的通信復(fù)雜度改進(jìn)到 O(logn) 。首先注意到,在每一輪當(dāng)中,雙方并不需要知道 a 和 b 的值,只需要知道 a 和 b 誰(shuí)更大一些。因此,兩個(gè)人可以從高到低輪流發(fā)送 a 和 b 的二進(jìn)制位,一旦出現(xiàn)不同就可以立即停下來(lái)了。另外,如果這一輪逐位比較大小的時(shí)候,到了左起第 i 位才比出 a 和 b 的大小,那么對(duì)于今后的 a 和 b 來(lái)說(shuō),我們要么根本就不用比較,要么就可以直接從第 i 位開(kāi)始比較。比方說(shuō),在這一輪里雙方發(fā)現(xiàn) a = 00100????? 并且 b = 00101????? ,這就說(shuō)明 a < b 。此時(shí), A 會(huì)去掉前面一半的數(shù),那些頭幾位就比 00100 小的數(shù)肯定都被去掉了,剩下的數(shù)只有可能以 00100, 00101, 00110, 00111, 01000, … 打頭;類(lèi)似地, B 則會(huì)去掉后面一半的數(shù),剩下的數(shù)只能以 00101, 00100, 00011, 00010, … 打頭。假如今后某一輪中的 a 值是以 00110 打頭的,那么 A 不用跟 B 說(shuō)話就能直接知道,這回肯定是 a 值更大一些 ,因?yàn)?B 的手里不可能有這么大的數(shù),它們都已經(jīng)被去掉了。此時(shí), A 就可以用 O(1) 個(gè) bit 直接告訴 B ,這回我的 a 肯定比你的 b 大,咱倆該怎么辦就怎么辦吧。類(lèi)似地,今后 B 也可能會(huì)出現(xiàn)這樣的情況:一看 b 值的頭幾位,直接就知道該怎么辦了。除非 a 和 b 都以 00100 或者 00101 打頭,我們才真的需要比較 a 和 b 的大小,因此我們可以直接從上次停止的數(shù)位開(kāi)始繼續(xù)往下比。
????如果某一輪當(dāng)中比到了相同的位,那么這些位今后就再也不用交換了,而 a 和 b 都有 O(logn) 位,這說(shuō)明兩人一共交換了 O(logn) 次相同的位;如果某一輪當(dāng)中比到了不同的位,那么這一輪比較就會(huì)立即停止,這說(shuō)明每一輪里最多只會(huì)遇到一次不同的位,而整個(gè)算法有 O(logn) 輪,因而兩人一共也就交換了 O(logn) 次不同的位。另外,整個(gè)算法開(kāi)始前會(huì)有 O(logn) 的交流(為了把數(shù)據(jù)填充到 2k 個(gè)),每一輪也會(huì)產(chǎn)生 O(1) 的交流(告訴對(duì)方是否需要比較)。因而,最終總的通信復(fù)雜度就是 O(logn) 。
參考資料: Eyal Kushilevitz and Noam Nisan, Communication complexity.
?
?
通訊復(fù)雜性簡(jiǎn)單介紹
作者:張志強(qiáng), 發(fā)表于 2008年9月17日
英文是communication complexity,不知道該翻譯成通信復(fù)雜性,還是通訊復(fù)雜性呢。這里先用通訊復(fù)雜性吧。這是一個(gè)理論計(jì)算機(jī)的子領(lǐng)域,在過(guò)去30年衍生了很多東西。它是我的研究的主要內(nèi)容,這里簡(jiǎn)略介紹一下。
1.Communication Protocol 通訊協(xié)議
我們說(shuō)一個(gè)通訊問(wèn)題,是有兩臺(tái)機(jī)器Alice和Bob,它們需要計(jì)算某個(gè)函數(shù) f(x,y)
。但是Alice只知道輸入 x ,Bob只知道 y 。它們之間離得很遠(yuǎn),需要通過(guò)光纜互相傳遞信息,把 f(x,y)
計(jì)算出來(lái)。它們之間傳遞信息的過(guò)程稱(chēng)為通訊,一個(gè)有效的通訊過(guò)程稱(chēng)為一個(gè)協(xié)議。
舉一個(gè)例子,比如兩個(gè)數(shù)據(jù)中心,它們想知道它們的數(shù)據(jù)是否已經(jīng)同步(指數(shù)據(jù)完全一樣),如果不一樣的話就需要重新同步。它們之間該怎么通訊來(lái)確定這一點(diǎn)呢?這個(gè)問(wèn)題就是通訊問(wèn)題 EQ。在這個(gè)問(wèn)題里,Alice和Bob分別擁有一個(gè)字符串 x
和 y ,它們想計(jì)算 x==y
。
對(duì)于所有通訊問(wèn)題,Alice可以通過(guò)發(fā)送它的所有輸入 x
到Bob,然后Bob擁有全部輸入,從而計(jì)算 f(x,y)
。注意在通訊問(wèn)題里面,我們只考慮通訊消耗,而不考慮本地的計(jì)算時(shí)間和空間消耗。我們能設(shè)計(jì)更好的通訊協(xié)議嗎?
對(duì)于一個(gè)通訊問(wèn)題,如果要求對(duì)于任何輸入,輸出結(jié)果完全精確,這種符合條件的協(xié)議稱(chēng)為確定型通訊協(xié)議。但在實(shí)際應(yīng)用中,我們可以容忍一個(gè)足夠小的出錯(cuò)概率。在某些時(shí)候這是有很大好處的。比如上面那個(gè)EQ通訊問(wèn)題,在要求結(jié)果完全精確的情況下,Alice發(fā)送自己的 x
已經(jīng)是一個(gè)最優(yōu)方案了。但在實(shí)際應(yīng)用中,我們有一個(gè)更簡(jiǎn)單的方法,那就是發(fā)送hash函數(shù)(比如MD5碼),然后雙方檢驗(yàn)MD5碼即可。當(dāng)然某種意義上這個(gè)協(xié)議不夠嚴(yán)格,更嚴(yán)格的應(yīng)該是Alice隨機(jī)選擇一個(gè)合適長(zhǎng)度的質(zhì)數(shù) p ,然后發(fā)送 (p,xmodp)
。
2.Communication Complexity 通訊復(fù)雜性
復(fù)雜性的意思就是說(shuō)一個(gè)問(wèn)題不能以多快的速度解決。比如EQ的任何確定型通訊協(xié)議無(wú)法比發(fā)送所有輸入做得更好,這說(shuō)明EQ的復(fù)雜度為 O(n)
。類(lèi)似于計(jì)算理論,人們發(fā)現(xiàn)證明一個(gè)復(fù)雜性比設(shè)計(jì)一個(gè)算法和協(xié)議更困難。
3.量子通訊復(fù)雜性
量子通訊和上面的經(jīng)典通訊基本上是一樣的,除了Alice和Bob是兩臺(tái)量子計(jì)算機(jī),可以操縱量子比特,以及它們之間共享量子通道可以發(fā)送量子比特。我們希望能夠盡可能少的發(fā)送量子比特就能解決問(wèn)題。
就像在計(jì)算理論里,人們非常關(guān)系量子系統(tǒng)的引入能否大幅度提高計(jì)算的速度,人們也關(guān)心量子系統(tǒng)對(duì)于通訊的幫助。目前,人們發(fā)現(xiàn)對(duì)于partial函數(shù)(對(duì)于某些輸入對(duì) (x,y)
, f(x,y) 可以沒(méi)有定義的 f 稱(chēng)為partial函數(shù)),量子系統(tǒng)可以指數(shù)級(jí)的縮減發(fā)送的比特?cái)?shù),但對(duì)于完全函數(shù)(對(duì) ?(x,y) , f(x,y)
都有定義),人們猜測(cè)量子系統(tǒng)是沒(méi)有幫助的。
4.通訊復(fù)雜性理論和信息論
通訊復(fù)雜性理論和信息論是兩個(gè)不同的領(lǐng)域。通訊復(fù)雜性通常研究如何發(fā)送盡可能少的比特得到計(jì)算結(jié)果,而信息論是研究通訊的過(guò)程(?),比如如何糾錯(cuò),如何利用量子糾纏等。現(xiàn)在的量子信息論發(fā)展非常火熱,但和量子通訊復(fù)雜性是兩個(gè)完全不同的概念。
5.GT 一個(gè)更復(fù)雜的例子
現(xiàn)在Alice和Bob分別擁有兩個(gè)字符串 x
和 y
,它們?cè)撊绾未_定誰(shuí)的字符串更大(按字典序)呢?同樣這里很低的錯(cuò)誤概率是可以忍受的。
思路:每次Alice和Bob先檢查前一半輸入是否相等(調(diào)用EQ的通訊協(xié)議),如果是,拋棄之;否則后一半可以拋棄;重復(fù)這個(gè)步驟即可。
Q.E.D.
?
?
?
總結(jié)
- 上一篇: storm基础系列之五---------
- 下一篇: 编译过程中,termcap.h