code及其實現

2021-08-30 22:30:35 字數 1938 閱讀 1288

1. what is γ code?

γ編碼並不是我隨便亂取的名字,其原理在資訊檢索導論第5章第3節有介紹,用於壓縮一連串有序的數字型別的資料非常有用。在mg中將γ編碼歸類為全域性模型(mg更推崇區域性模型)。其原理是將所有的資料分成兩部分連起來,第一部分為資料長度,第二部分為資料內容。這樣做的好處是對於很小的數字γ編碼可以只用bit就可以表示了,如對於8這樣的數字,只需要表示資料長度的1110四位位元組加上表示資料的000三位位元組就可以表示了。而如果當做int儲存,則需要4位元組即32bit儲存,而實際上前面的資料都是0,這樣做很浪費空間。但γ編碼需要儲存後面的資料的長度,在儲存很大的數字時會占用很大的空間,如儲存乙個4294967295這樣的數字,需要占用64bit。而這個是乙個32位的int內的數字,如儲存為int,只需32bit即可儲存了,前面提到γ編碼用於儲存一連串有序的數字型別非常有效,因為連續的有序數字型資料可以只儲存數字間的間隔即可,如前乙個數字是400000,後乙個數字是400008,此時間隔只有8,只需儲存成400000,8即可。因此後面這個數字就可以節省大量位元組。而在搜尋引擎的倒排索引中大量儲存的都是這些資料,某單詞對於的文件號,如:retrieval:1287,1297...

γ編碼的詳細介紹請參照:

相對於γ編碼,有乙個區域性有參模型與之類似,在mg中有介紹,稱之為全域性貝努力和區域性貝努力模型。可以參考下,主要是使用觸發將資料化為商和餘數,但除數需要經過訓練得出。除數即為引數。

2. γ編碼的實現

γ編碼的實現難點是在檔案中儲存的是以byte為單位的資料,讀取出資料時是乙個乙個的byte,需要精心計算每個數字的邊界,並且計算出邊界後需要使用各種二進位制操作符對資料擷取。

2.1 γ編碼讀取器

首先,需要確定的是資料的長度,即對讀到的bit進行計數,當讀到0時結束計數。即,如果讀到的byte為01110111,讀到第乙個0時計數結束,說明後面跟著0bit資料。再加上前面已經確定的1,所有位加起來,資料就是1,然後讀到第二個0時,此時計數器為3,表示後面跟著3bit的資料。也就是後面的111,再加上前面的1,即1111,轉換為10進製就是15,也就是說這個byte包含兩個數字:1,15。

假設現有byte by=119(01110111), by_index=0(用於儲存當前byte被讀了多少bit);

首先用by^-1(11111111),得到10001000,這裡的1即表示0所在的位置,再判斷10001000&10000000,如果等於10000000,則表示第一位存在0,如果與01000000做按位與操作得到01000000,則表示第二位為0,以此類推。

計數器為0直接返回1,此時by_index的值為1(已讀取1bit)。再讀取下一資料時,計數器為3。讀取後面的資料需要先將by向左移動5位(by_index=5),用以截掉前面已經讀取過的資料,得到11100000,再向右移動5位,得到00000111,假設目前有一臨時結果儲存在記憶體中(result)值為1。則將result向左移動三位(資料長度為3),得到00001000,再用00001000與00000111做按位或操作,得到00001111即為最終結果。

2.2 γ編碼寫入器

γ編碼的寫入器首先要確定需要寫入的資料的長度,同樣需要對每個位做按位&計算,輸出時需要考慮輸出時按照每byte輸出的,上次輸出可能並沒有完整地用完一byte,需要將bit資料加到後面去。

假設有資料15(1111),6(110)需要輸出,首先經過計算得出資料15的長度是3(截掉前面的1),快取中有byte by=0;需要先將3個1輸出到快取中,即by|11100000,然後輸出資料,需要輸出3位數字,此時前面4位元已被占用,需要將資料右移4bit。得到00001110,再與快取資料做按位或操作,得到11101110,此時還有1bit未被占用,可被下乙個資料使用,下乙個資料需要2長度,使用上次遺存的1bit再加上下一byte的4byte就能完成儲存了。

3.實驗

使用gammacodewriter對隨機100個1w以內的整數進行編碼,輸出到檔案中,占用209位元組,而如果使用dataoutputstream進行完整輸出,則需要占用400位元組。

程序及其實現

一 程序的定義 1 程序是可併發執行的程式在某個資料集合上的一次計算活動,也是作業系統進行資源分配和保護的基本單位 2 可以用來共享資源又能描述程式併發 為什麼要引入程序概念 1 刻畫程式的併發性 程式是併發執行的,這是由於資源共享和競爭問題,程式自身只是計算任務的指令和資料的描述,是靜態的,程序是...

kmeans演算法及其實現

k 均值演算法能夠使聚類域中所有樣品到聚類中心距離平方和最小。其原理為 先取 k個初始聚類中心,計算每個樣品到這 k個中心的距離,找出最小距離,把樣品歸入最近的聚類中心,修改中心點的值為本類所有樣品的均值,再計算各個樣品到新的聚類中心的距離,重新歸類,修改新的中心點,直到新的聚類中心和上一次聚類中心...

strtok函式及其實現

標頭檔案 include 定義函式 char strtok char s,const char delim 函式說明 strtok 用來將字串分割成乙個個片段。引數s 指向欲分割的字串,引數delim 則為分割字串,當 strtok 在引數s 的字串中發現到引數delim 的分割字元時則 會將該字元...