改變將來的九大算法(5.糾錯碼)

在計算機中,正確率達到99.99999%仍是不夠的,必須達到徹底正確。那麼在實際應用中如何保障數據正確的呢?數組

一、重複把戲字體

      假如你要傳輸的數據爲234.5,線路的錯誤率爲20%,那麼咱們能夠傳輸5次。5次獲得的結果可能分別爲:編碼

      634.1spa

      244.5three

      235.5數學

      234.5table

      234.5二進制

   那麼咱們能夠選取出現最頻繁的那個位,從而獲得正確數據234.5.可是若是線路的錯誤率達到50%甚至以上,或者須要傳輸的數據很大時,那麼這種重複傳遞的方法就失效了。方法

二、冗餘把戲im

  此法把信息轉爲更冗餘的一個信息,雖然這個信息可能發生錯誤,可是仍有很大機率把原始數據恢復。

  例如要傳遞的數據爲234.5,那麼咱們發送的數據爲 two three four point five ,接收到的數據可能爲 tww theee fqur ppint ffve ,可是咱們仍然可以獲得發送方的發送的正確內容。

在這裏再複習一下海明校驗碼:

首先,海明碼的做用是:在編碼中若是有錯誤,能夠表達出第幾位出了錯,二進制的數據只有0和1,修改起來很容易,求反便可,這須要加入幾個校驗位。對於一個m位的數據信息,到底應該加入幾個呢?假設須要k個,那麼編碼以後應該是m+k位,這k個二進制數組成的數據可以表達的數值是2的k次方個,好比須要3個校驗位,k=3,3位二進制數從000 、 001 、…… 、111共有8個數值,而這m+k個二進制組成的數據的全部編碼中,只有一個是正確的,其餘的都是表達了錯誤的位置信息的,因此2的k次方個編碼中去掉正確的那一個,也就是(2的k次方-1),若是這個數值等於m+k,就能夠徹底表達出出錯的位置了,(2的k次方-1)也能夠大於m+k,

好比:給10個學員進行編號,能夠用一位數來編碼:學號爲0 、1 、2 、3 、……、9 ,也能夠 用兩位數或者五位數,00000 、00001 、00002 、……、00009,可是沒有必要用五位呀,只要能知足編碼的要求就能夠了,因此說咱們求出知足條件的最小的k值就能夠!

下面舉例說明:咱們要推導出D= 101101這個數字的海明碼

1、 肯定校驗碼的位數k

數據的位數m=6,按照上面咱們說的公式來計算知足條件的k的最小值

2的k次方-1>=m+k

即:2的k次方-1>=6+k

解此不等式得:知足不等式的最小k=4,也就是D=101101這個數字的海明碼應該有6+4=10位,其中原數據6位,校驗碼4位。

2、肯定校驗碼的位置

設這4爲校驗碼分別爲P一、P二、P三、P4

數據從左到右爲D一、D二、……、D6

編碼後的數據共有6+4=10位,設爲M一、M二、……M10

校驗碼Pi(這裏i=1,2,3,4)在編碼中的位置爲2的(i-1)次方,值是這樣的1,2,4,8,16……即:P1在M1位置,P2在M2位置,P3在M4位置,P4在M8位置,這裏一共有10位,因此排不到M16,見圖中「甲」行紅色字體

理解海明碼(借鑑) - 紅豆 - 紅豆的南國 圖一 

3、數據的位置

這個很簡單,除了校驗碼的位置其他的就是數據的位置,填充進去就能夠了,見圖中「甲」行的藍色字體,因而能夠先把數據信息填進去,見「丙」行,下面就是最關鍵的部分,求出校驗位的值啦!!!

4、求出校驗位的值

這裏會用到一個公式,找了好多資料都說了這個公式,可是徹底沒有必要死記硬背,是有規律的,回顧一下二進制的表達,對於一個4位二進制數,能夠表達16個值,0000B~1111B,「B」表明二進制,「D」表明十進制,假定這4位二進制數,從左到右分別爲S4S3S2S1,請把腦殼向左歪90°看下圖:1D=0001B,因此M1S1那一行,4D=0100B,因此M4S3那一行,5D=0101B,這就不能用一個格子來表達了,因此須要S3S1共同表達,即4+1=5,看圖中黃色的部分,是否是M5?看出規律了吧?M後邊的數字均可以拆爲由2n次方的數相加來表達,在舉一個例子M74+2+1=7即:7D=0111B,看圖中橙色的部分,都是M7!by the way:這個公式在驗證糾錯的時候還會用獲得,我找的網上的不少資料寫了好幾個公式,看後徹底「懵懂」了,其實只須要這一個就能夠了,按照我說的這個方法,你只要記住這個公式的推導就能夠解決全部問題了,怎麼樣?強大吧?

 

理解海明碼(借鑑) - 紅豆 - 紅豆的南國 圖二

接下來就是代入求值的過程了,不要說你不懂「?」這個符號哦!這是異或,真不懂的話,就去搜吧!按照圖1中的指示,把相應的值代入到圖的公式裏,能夠獲得以下內容

理解海明碼(借鑑) - 紅豆 - 紅豆的南國

 

若是海明碼沒有錯誤信息,S1S2S3S4都爲0,等式右邊的值也得爲0,因爲是異或,因此Pii=1,2,3 )的值跟後邊的式子必須同樣才能使整個式子的值爲零,即:Pi=後邊的式子的值,即:  理解海明碼(借鑑) - 紅豆 - 紅豆的南國

 

懂了嗎?是否是說的有點跨度?仔細想一下異或的含義,以S4= P4?D5?D6爲例,S4=0,就是說P4?D5?D6=0,那麼P4和(D5?D6)必須同樣(即P4= D5?D6),那麼異或的結果才能爲零吧?!!不要以算術加減法來理解,要用邏輯數學的思惟啦!!

那麼能夠算出Pi的值了吧?

理解海明碼(借鑑) - 紅豆 - 紅豆的南國

 

恭喜你,大功告成,把Pi的值填寫到圖1中,看「丙」行,就能夠獲得haimming編碼啦!哈哈!

 

理解海明碼(借鑑) - 紅豆 - 紅豆的南國 圖三

 

5、海明碼校驗過程

如今咱們獲得了D=101101的正確海明碼就是

0

0

1

0

0

1

1

1

0

1

那麼出錯的時候是怎麼驗證出來的呢?好比第5位錯了,第5位如今的值是0,若是錯了,它只能是1,二進制就這兩種值即:咱們獲得了這樣的一組編碼,如今要找出錯誤的位置(假定你不知道哪裏錯了啊!!!)

 

理解海明碼(借鑑) - 紅豆 - 紅豆的南國  

如今又要用到我剛纔說的那個強大的公式了,請看圖2,算了,爲了你不至於來回撥弄鼠標滾輪,我仍是把圖粘貼過來吧

 

理解海明碼(借鑑) - 紅豆 - 紅豆的南國

 

 

把圖4中的值,帶入到圖的公式裏

理解海明碼(借鑑) - 紅豆 - 紅豆的南國

 

按照S4S3S2S1排列獲得的二進制數爲:0101,對應的值十進制爲5,哇塞!找到啦!!哈哈!!糾錯吧!把1改成0

三、校驗和把戲

  普通校驗和:如要發送的信息爲4283,將全部數字相加4+2+8+3=17.取7.獲得校驗和爲7

階梯校驗和:若是要發送的信息爲4283,進行以下計算、4*1+2*2+8*3+3*4=40 取模後爲0.獲得校驗和爲0

同時使用普通校驗和和階梯校驗和能發現不超過兩個的錯誤。

四、定位把戲






在計算機中稱之爲——二維奇偶校驗碼

相關文章
相關標籤/搜索