在資料傳輸過程中難免會遇到部分資料丟失或者受到干擾而出錯,因此利用演算法來恢復錯誤的資料,reed solomon(簡稱rs)便是其中的一種常用的演算法。
rs演算法是以犧牲頻寬為代價的,編碼過程中會產生一定量的冗餘資料。這種增加冗餘資料來獲得有效資料的方法在我們日常生活中其實經常會使用。舉個很簡單的例子,比如我們把重要資料儲存在電腦硬碟裡,但是現在電腦病毒非常厲害,為了防止資料丟失,通常都會把重要資料燒錄成光碟,當硬碟資料丟失的時候我們可以用光碟裡的來恢復。但是光碟有時候也不保險,容易損壞,於是我們就多備份幾張,燒錄同樣的資料,這樣我們就不會擔心資料丟失了。我們增加了資料的可靠性,但是另外乙個方面來說,我們卻增加了儲存的容量,犧牲了很多光碟。從某種意義上來說,備份其實是一種增加資料可靠性的方法,但還不能算真正意義上的糾錯方法。
還有一種我們比較熟悉的用在資料傳輸上的方法——奇偶校驗。記錄一組資料的「1」(或「0」)的個數,如果有奇個「1」,則最後標記乙個「1」,如果有偶數個「1」則標記「0」。這樣接收方根據最後乙個bit就可以確定傳輸的資料是否出錯,如果有錯誤就可以要求重發。這是最簡單的校驗方法,但是還不足以糾錯。奇偶校驗,如果將一組資料進行行列多次分組編碼多次校驗就可以具有一定能力的糾錯功能,但是還是太弱,不適於現代通訊的要求。數學理論不斷發展,於是rs之類的演算法出現了。
乙個簡單的整數數學算式:
z=xy+a
這裡我們進行移位得到:
z-a=xy
可以知道
z-a一定可以被
y整除,其商是
x,同樣
z-a也能被
x整除,商為y。
rs演算法也用到了這個簡單原理。對於給定的乙個數y和商
x,只要我們求得其餘數
a,然後構造出
z-a,這就完成了編碼。將
z-a傳輸,接收方得到的數如果能被
x整除,而且商也落在我們預期的範圍內,那麼我們就可以說這次傳輸沒有錯誤。當然如果我們在整數範圍內來做這樣的演算法也僅僅能偵察出錯誤來,還不能成為真正意義上的糾錯。
rs演算法不同,他將所有的運算歸結到有限域中,即通常說的珈羅華域。充分利用了有限域的封閉性。而且我們也不是直接求出商是多少,而是間接地解出錯誤發生的位置和值。有了這些資訊,我們就可以實現糾錯了。
我所理解的前端
轉眼間,在鵝廠的實習已經過去三個多月,涉及到實習生轉正留用的考核流程也逐步開始了。帶著一堆疑問,以及自己實習期間的心得體會,與導師暢談了一番。他作為資深前端工程師,就前端領域及我個人未來的職業規劃等方面分享了他自己的經驗。這次與導師的溝通讓我受益匪淺,現簡單總結如下。前端知識學習路線 首先,當然是就...
我所理解的陣列
陣列 一 一維陣列 1 陣列的建立 陣列顧名思義是含有相同元素的集合,類似我們高中數學所學習的集合 例如int arr 10 char arr1 2 float arr2 3 double arr3 5 注意 切記 這個中要給常量,不能使用變數。2 陣列的初始化 初始化是指 在陣列的建立同時並賦予合...
我所理解的OpenSocial
昨天在google參加了opensocial的講座,通過三位opensocial工程師的精彩演講,我對這個東西有了一些簡單的理解。下面就把我所理解的opensocial,也算是筆記整理在這裡。1 為什麼會有opensocial?當前社會是乙個網路的社會,當前的網路是乙個社會性的網路,sns遍地開花到...