幻當(dāng)程序員小白用自然語(yǔ)言編程時(shí)會(huì)怎樣?
=數(shù)據(jù)卡尺=
如何用統(tǒng)計(jì)學(xué)的知識(shí),來(lái)應(yīng)用在數(shù)據(jù)上呢?
-第一步-
要弄明白統(tǒng)計(jì)學(xué)和數(shù)據(jù)之間的共性和非共性。
統(tǒng)計(jì)學(xué):每一個(gè)數(shù)據(jù)無(wú)論其數(shù)值是多少,其本身就作為一個(gè)數(shù)值獨(dú)占的存在體,然而統(tǒng)計(jì)學(xué)本身就有意和無(wú)意的忽略了各個(gè)數(shù)值的先后排列。
數(shù)據(jù):每一個(gè)數(shù)據(jù)無(wú)論其數(shù)值是多少,其本身就作為一個(gè)數(shù)值獨(dú)占的存在體,然而數(shù)據(jù)本身很注重各個(gè)數(shù)值的先后排列。
比如:ABRACADABRA
用統(tǒng)計(jì)學(xué)來(lái)表示,就是A出現(xiàn)了5次,B出現(xiàn)了2次,C出現(xiàn)了1次,D出現(xiàn)了1次,R出現(xiàn)了2次。
用數(shù)據(jù)來(lái)表示,就是ABRACADABRA。
那么如何把數(shù)據(jù)快速的解壓縮出來(lái)呢?可以使用分段壓縮方式,比如把一個(gè)大文件,分割成一個(gè)個(gè)片段,例如:
ABRACADABRA THE FOX JUMP. 張三和李四一起去喝酒。
那么,就可以根據(jù)前面的數(shù)據(jù),本身就是采用英文的方式,也就是最多是52進(jìn)制(區(qū)分大小寫(xiě)),而后面的中文可就麻煩了,畢竟中文本身進(jìn)制相當(dāng)大,那么就需要進(jìn)行大進(jìn)制處理。
用統(tǒng)計(jì)學(xué)的方法,就是把數(shù)據(jù)平均分,然后分割成可以互相對(duì)齊的數(shù)據(jù)個(gè)體,然后統(tǒng)計(jì)這些數(shù)據(jù)個(gè)體各出現(xiàn)了多少次。
然后進(jìn)行統(tǒng)計(jì),把統(tǒng)計(jì)數(shù)據(jù)記錄下去。
也就是說(shuō),把大英百科全書(shū)的純文本內(nèi)容用統(tǒng)計(jì)學(xué)的方式記錄下來(lái),就能對(duì)應(yīng)到大小寫(xiě)英文字母+符號(hào)+空格+換行+換頁(yè)……
那么就能夠統(tǒng)計(jì)出各英文字母出現(xiàn)過(guò)多少次,這導(dǎo)致的就是數(shù)據(jù)能夠很好把所有元素給還原出來(lái),只是這些元素之間的排列組合,就隨著數(shù)據(jù)長(zhǎng)度的變大而趨向更高運(yùn)算量。
最簡(jiǎn)單的方法,就是用三種統(tǒng)計(jì)方法:
如字母矩陣:
A C A E F H I O P Q R T T Y T
A S D K F J A S L K F D J L A
S K J F D A S D F S A D F A S
D F A S F A S D F A S F D A S
F D J H L K J H L K J H L K J H
為了快速得知每個(gè)數(shù)字的排列方式,可以進(jìn)行統(tǒng)計(jì)校驗(yàn)
每一行的第一列中出現(xiàn)A的次數(shù)為2次
每一行的第二列中出現(xiàn)A的次數(shù)為0次
第一行中出現(xiàn)A的次數(shù)為2次
第二行中出現(xiàn)A的次數(shù)為3次
A在整個(gè)文本中出現(xiàn)過(guò)12次
以此類(lèi)推,就能使用數(shù)獨(dú)的方式,逆推出去掉了很多排列組合的有限數(shù)量的排列組合方式,然后這些排列組合就能通過(guò)其他校驗(yàn)方式,比如MD5,比如SHA128和其他校驗(yàn)方式快速找出正確的排列組合。
這種方式,就是使用小公式重復(fù)使用的方式,快速生成數(shù)據(jù)的片段,然后只需要把數(shù)據(jù)片段進(jìn)行拼圖一樣的整理就行了,就能還原出源文件。
之前說(shuō)的,只應(yīng)用到階乘,N次方,無(wú)理數(shù),都只適合于超級(jí)計(jì)算機(jī)的壓縮方式,而這次介紹的,則是相對(duì)來(lái)說(shuō),更適合個(gè)人計(jì)算機(jī),以及單片機(jī)使用,本身就是以硬件上限有限時(shí),如何獲得最高壓縮率,以及最快解壓縮。
同樣的,把數(shù)據(jù)進(jìn)行片段化,然后使用特定進(jìn)制的方式來(lái)進(jìn)行統(tǒng)計(jì),同樣可以統(tǒng)計(jì)出,然而還有一種特殊的進(jìn)制轉(zhuǎn)換對(duì)齊校驗(yàn)方式。
比如二進(jìn)制的101010111010110111010001001101110010。
轉(zhuǎn)換為4進(jìn)制(00=A)(01=B)(10=C)(11=D):CCCDCCDBDBABADBDAC
轉(zhuǎn)換為十進(jìn)制:46,084,723,570
轉(zhuǎn)換為16進(jìn)制:A BADD 1372
然后進(jìn)行統(tǒng)計(jì),比如,在4進(jìn)制中,ABCD各出現(xiàn)過(guò)多少次;在二進(jìn)制中0和1各出現(xiàn)過(guò)多少次;在十進(jìn)制中0123456789各出現(xiàn)過(guò)多少次;在十六進(jìn)制中0123456789ABCDEF各出現(xiàn)過(guò)多少次。
當(dāng)然了,為了進(jìn)制校驗(yàn)的準(zhǔn)確性,一般都是采用素?cái)?shù)進(jìn)制的方式來(lái)進(jìn)行校驗(yàn)(比如2進(jìn)制,3進(jìn)制,5進(jìn)制,7進(jìn)制,11進(jìn)制,13進(jìn)制……以此類(lèi)推),然后通過(guò)進(jìn)制之間的差異,來(lái)統(tǒng)計(jì)。
當(dāng)然了,因?yàn)槭菫榱私o單片機(jī)使用的,所以本身就不會(huì)采用過(guò)高進(jìn)制,比如高達(dá)億進(jìn)制。
也就是把每一個(gè)數(shù)據(jù)片段,都除以各個(gè)進(jìn)制數(shù),然后得出余數(shù)。
→噴子兼或破壁人:所以分解質(zhì)因數(shù)都出現(xiàn)了是吧?你還能更敷衍一點(diǎn)么?
→噴子兼或破壁人:直到現(xiàn)在,你都沒(méi)有給出使用多處理器來(lái)進(jìn)行大數(shù)據(jù)壓縮和解壓縮的代碼實(shí)現(xiàn),你在這給程序員用自然語(yǔ)言編程呢?
=作者的話=
作者現(xiàn)在在自學(xué)C++語(yǔ)言,感覺(jué)可能用得上。