一種數(shù)據(jù)存儲方法及裝置的制造方法
【專利摘要】本發(fā)明實施例公開了一種數(shù)據(jù)存儲方法及裝置,針對待存儲數(shù)據(jù),構建至少兩級鏈表,該待存儲數(shù)據(jù)存儲在底層鏈表中,在底層鏈表包含的存儲數(shù)據(jù)全部相同時,刪除該底層鏈表,并更新該底層鏈表在上一級鏈表中的狀態(tài)。一方面,將包含的存儲數(shù)據(jù)全部相同的底層鏈表刪除,節(jié)省了內存空間的占用;另一方面,當數(shù)據(jù)量很大、構建了多個底層鏈表時,如果出現(xiàn)數(shù)據(jù)變化的情況,僅需修改該數(shù)據(jù)對應的底層鏈表及該底層鏈表在上一級鏈表中的狀態(tài),不需要將全部鏈表進行解壓?修改?壓縮的處理,提高了執(zhí)行效率。
【專利說明】
一種數(shù)據(jù)存儲方法及裝置
技術領域
[0001 ]本發(fā)明涉及計算機技術領域,特別涉及一種數(shù)據(jù)存儲方法及裝置。
【背景技術】
[0002] 隨著科學技術的發(fā)展,計算機已深入人們的生活,并帶來了巨大的便利。目前,利 用計算機存儲數(shù)據(jù)已十分普遍。比如,公司記錄員工的考勤數(shù)據(jù),一般都采用計算機來存 儲。
[0003] 例如,公司A需要記錄8個員工的考勤信息,傳統(tǒng)的記錄方案是在計算機中存儲每 一天正??记趩T工的ID列表,比如:2016-2-15:[1,2,3,4,5,6,7,8]。假如員工ID采用的數(shù) 據(jù)類型是CHAR型(占用1個BYTE),則在沒有員工缺勤的情況下,存儲當天的考勤記錄需要8 個BYTE(內存占用總數(shù)=員工個數(shù)*員工ID數(shù)據(jù)類型占用內存數(shù))。當該公司的規(guī)模再擴大, 比如擴大到100000個員工時,那么員工ID的數(shù)據(jù)類型就不能使用CHAR型,因為CHAR型數(shù)據(jù) 只能表示0~127,員工ID的類型必須使用INT型(占用4個BYTE),則在沒有員工缺勤的情況 下,存儲當天的考勤記錄需要400,000(即100000*4)個BYTE。
[0004] -種更優(yōu)的方案是構造一個BIT-MAP(位圖文件),用于存儲每一個員工的考勤信 息,如果某員工當前的考勤正常,則將該員工對應的位置設置成1,否則設置成0。
[0005] 以上述例子進行說明,當公司A中存在8個員工時,將這些員工映射到一個8個BIT 的數(shù)組中,假設2016-2-16這天員工4和員工7考勤不正常時,其所對應的BIT-MAP如圖1所 示。由此可以看出,僅需8個比特位(即1個BYTE)便可存儲所有員工的考勤信息,所占用的計 算機的內存為傳統(tǒng)方案的1/8。當該公司的規(guī)模再擴大,比如擴大到100000個員工時,需要 申請一個12500 (即100000/8)個BYTE的CHAR型數(shù)組arrayA,其中:arrayA[0 ]對應十進制數(shù)0 ~7,arrayA[l ]對應十進制數(shù)8~15,arrayA[2]對應十進制數(shù)16~23......以此類推。因此, 采用構造 BIT-MAP的方案,占用的計算機的內存僅為傳統(tǒng)方案的1/32( 即12500/400000)。
[0006] 綜上所述,當記錄的數(shù)據(jù)中最大的數(shù)為N時,所需要消耗的內存最多為(1+N/8)個 BYTE,通過采用構造 BIT-MAP的方案能夠很大程度上節(jié)省計算機內存。
[0007] 但是在很多的使用場景中,BIT-MAP數(shù)據(jù)結構中的比特位為0或者比特位為1都是 連續(xù)的,如上面例子中的員工考勤,對于工作日,絕大部分員工所對應的比特位都是1(即考 勤正常),因此該BIT-MAP數(shù)據(jù)結構仍然可以進行壓縮和優(yōu)化,進一步的節(jié)省內存。
[0008] 針對BIT-MAP數(shù)據(jù)結構中的比特位為0或者比特位為1都是連續(xù)的這一特點,通常 使用的方案是引入字符串壓縮技術,比如對BIT-MAP字符串采用RLE (run-length encoding,游程編碼)編碼方法進行壓縮。如圖2的BIT-MAP為例:可以將圖2中的BIT-MAP編 碼為0,7,2,9,1,10,3。其意思是:第一位為0,連續(xù)有7個,接下來是2個1,9個0,1個1,10個0, 最后是3個1(這里只是對RLE編碼基本原理的解釋,實際中的編碼可能會存在差異)。
[0009] 對于一個數(shù)據(jù)量很大的BIT-MAP,如果里面的數(shù)據(jù)分布存在大片連續(xù)的0或者大片 連續(xù)的1,采用RLE編碼方法將其進行壓縮,會節(jié)省很多內存的占用。
[0010]但是,采用RLE編碼方法,如果BIT-MAP中的某一個比特位發(fā)生變化,需要向將壓縮 的RLE編碼解壓成原始的BIT-MAP數(shù)據(jù),將原始的BIT-MAP數(shù)據(jù)修改之后,再將修改后的BITMAP 壓縮成 RLE 編碼格式。
[0011 ]因此,對于數(shù)據(jù)頻繁變化的情況,采用RLE編碼方法壓縮BIT-MAP數(shù)據(jù),執(zhí)行效率很 低。
【發(fā)明內容】
[0012] 本發(fā)明實施例的目的在于提供一種數(shù)據(jù)存儲方法及裝置,在節(jié)省計算機內存的基 礎上,針對數(shù)據(jù)頻繁變化的情況,提高執(zhí)行效率。
[0013] 為達到上述目的,本發(fā)明實施例公開了一種數(shù)據(jù)存儲方法,包括:
[0014] 獲得待存儲數(shù)據(jù),并確定所述待存儲數(shù)據(jù)對應的目標鏈表以及所述待存儲數(shù)據(jù)在 所述目標鏈表的存儲位置;
[0015] 將所述待存儲數(shù)據(jù)存儲至所述存儲位置;
[0016] 在所述目標鏈表包含的所述數(shù)據(jù)全部相同時,刪除所述目標鏈表,并更新所述目 標鏈表在上一級鏈表中的狀態(tài)。
[0017] 為達到上述目的,本發(fā)明實施例還公開了一種數(shù)據(jù)存儲裝置,包括:
[0018] 獲得確定模塊,用于獲得待存儲數(shù)據(jù),并確定所述待存儲數(shù)據(jù)對應的目標鏈表以 及所述待存儲數(shù)據(jù)在所述目標鏈表的存儲位置;
[0019] 存儲模塊,用于將所述待存儲數(shù)據(jù)存儲至所述存儲位置;
[0020] 刪除更新模塊,用于在所述目標鏈表包含的所述數(shù)據(jù)全部相同時,刪除所述目標 鏈表,并更新所述目標鏈表在上一級鏈表中的狀態(tài)。
[0021 ]由上述技術方案可見,應用本發(fā)明所示實施例,針對待存儲數(shù)據(jù),構建至少兩級鏈 表,該待存儲數(shù)據(jù)存儲在底層鏈表中,在底層鏈表包含的存儲數(shù)據(jù)全部相同時,刪除該底層 鏈表,并更新該底層鏈表在上一級鏈表中的狀態(tài)。一方面,將包含的存儲數(shù)據(jù)全部相同的底 層鏈表刪除,節(jié)省了內存空間的占用;另一方面,當數(shù)據(jù)量很大、構建了多個底層鏈表時,如 果出現(xiàn)數(shù)據(jù)變化的情況,僅需修改該數(shù)據(jù)對應的底層鏈表及該底層鏈表在上一級鏈表中的 狀態(tài),不需要將全部鏈表進行解壓-修改-壓縮的處理,提高了執(zhí)行效率。
[0022] 當然,實施本發(fā)明的任一產(chǎn)品或方法必不一定需要同時達到以上所述的所有優(yōu) 點。
【附圖說明】
[0023] 為了更清楚地說明本發(fā)明實施例或現(xiàn)有技術中的技術方案,下面將對實施例或現(xiàn) 有技術描述中所需要使用的附圖作簡單地介紹,顯而易見地,下面描述中的附圖僅僅是本 發(fā)明的一些實施例,對于本領域普通技術人員來講,在不付出創(chuàng)造性勞動的前提下,還可以 根據(jù)這些附圖獲得其他的附圖。
[0024] 圖1為【背景技術】所舉實例中對應的一個BIT-MAP;
[0025] 圖2為【背景技術】所舉實例中對應的另一個BIT-MAP;
[0026] 圖3為本發(fā)明實施例提供的一種數(shù)據(jù)存儲方法的流程示意圖;
[0027] 圖4為本發(fā)明實施例提供的一種數(shù)據(jù)結構;
[0028] 圖5為本發(fā)明實施例提供的另一種數(shù)據(jù)結構;
[0029] 圖6為本發(fā)明實施例提供的一種數(shù)據(jù)存儲裝置的結構示意圖。
【具體實施方式】
[0030] 下面將結合本發(fā)明實施例中的附圖,對本發(fā)明實施例中的技術方案進行清楚、完 整地描述,顯然,所描述的實施例僅僅是本發(fā)明一部分實施例,而不是全部的實施例?;?本發(fā)明中的實施例,本領域普通技術人員在沒有作出創(chuàng)造性勞動前提下所獲得的所有其他 實施例,都屬于本發(fā)明保護的范圍。
[0031] 為了解決現(xiàn)有技術問題,本發(fā)明實施例提供了一種數(shù)據(jù)存儲方法及裝置。下面首 先對本發(fā)明實施例提供的一種數(shù)據(jù)存儲方法進行詳細說明。
[0032] 圖3為本發(fā)明實施例提供的一種數(shù)據(jù)存儲方法的流程示意圖,包括:
[0033] S101:獲得待存儲數(shù)據(jù),并確定待存儲數(shù)據(jù)對應的目標鏈表以及待存儲數(shù)據(jù)在目 標鏈表的存儲位置。
[0034]需要說明的是,以鏈表形式存儲數(shù)據(jù),可以以多級鏈表的形式對數(shù)據(jù)進行存儲,本 發(fā)明實施例中所述目標鏈表指的是多級鏈表中最底層的鏈表。
[0035] 在本發(fā)明所示實施例中,鏈表中可以以位圖形式存儲數(shù)據(jù)。
[0036] 作為本發(fā)明的一種實施方式,可以預先建立待存儲數(shù)據(jù)與底層鏈表的對應關系、 及待存儲數(shù)據(jù)與其對應的底層鏈表的存儲位置的對應關系。根據(jù)建立的對應關系,確定待 存儲數(shù)據(jù)對應的目標鏈表以及待存儲數(shù)據(jù)在目標鏈表的存儲位置。
[0037] 假設待存儲數(shù)據(jù)為A公司的考勤數(shù)據(jù),A公司有120個員工,針對A公司的考勤數(shù)據(jù) 構建了兩級鏈表,每個底層鏈表能容納40條數(shù)據(jù),則需構建3個底層鏈表。
[0038] 可以根據(jù)員工ID號或名稱等,建立員工考勤數(shù)據(jù)與底層鏈表及底層鏈表的位圖中 的存儲位置的對應關系,比如,ID號為1-40的員工考勤數(shù)據(jù)對應第一個底層鏈表,ID號為 41-80的員工考勤數(shù)據(jù)對應第二個底層鏈表,ID號為81-120的員工考勤數(shù)據(jù)對應第三個底 層鏈表;ID號為1的員工對應第一個底層鏈表的位圖中的編號為0的比特位,ID號為2的員工 對應第一個底層鏈表中的編號為1的比特位等等。
[0039]將考勤數(shù)據(jù)以位圖形式存儲在底層鏈表中,考勤數(shù)據(jù)可以有兩種取值,比如用0表 示缺勤,用1表示考勤正常。
[0040] 假設獲取了一條待存儲數(shù)據(jù):ID號為7的員工于2016年4月13日的考勤正常(即該 待存儲數(shù)據(jù)為1 ),確定該待存儲數(shù)據(jù)對應的目標鏈表為第一個底層鏈表,確定該待存儲數(shù) 據(jù)在第一個底層鏈表的存儲位置為編號為6的比特位。
[0041] 在本發(fā)明所示實施例中,可以預設X級鏈表,所述X為大于1的整數(shù)。確定的目標鏈 表為底層鏈表,即第X級鏈表。確定的待存儲數(shù)據(jù)的存儲位置為:在第X級鏈表的存儲位置。 確定目標鏈表之前,可以依次確定所述待存儲數(shù)據(jù)對應的第一級鏈表至第x-1級鏈表。
[0042] 在上述實施例中,鏈表的級別與數(shù)量均可以設定很多,鏈表結構比較復雜,因而, 建立待存儲數(shù)據(jù)與底層鏈表的對應關系、及待存儲數(shù)據(jù)與其對應的底層鏈表的存儲位置的 對應關系,可以采用確定編號的方式。
[0043] 作為本發(fā)明的一種實施方式,確定待存儲數(shù)據(jù)對應的第一級鏈表至第x-1級鏈表 的編號為:[(i%pi%P2% …%pj-1)/Pj],1彡 j彡X-1;
[0044] 確定待存儲數(shù)據(jù)對應的第X級鏈表的編號為:[(i%Pl%P2%· · . %ργ··%Ρχ-0/ Ρχ];
[0045]所述i為待存儲數(shù)據(jù)的編號,i為非負整數(shù);
[0046]所述Pj為第j級鏈表對應的待存儲數(shù)據(jù)的個數(shù),p j = wx*wx-,所述Wj為預設 的第j級鏈表存儲的狀態(tài)的個數(shù),w j = y j / o j,所述y j為預設的第j級鏈表的容量,單位為比 特,所述W為預設的第j+Ι級鏈表的狀態(tài)在第j級鏈表中占用的比特位數(shù);
[0047] 所述px為第X級鏈表存儲的所述待存儲數(shù)據(jù)的個數(shù),?\ = ?^ = 7/〇\,所述7\為預設 的第X級鏈表的容量,單位為比特,所述〇x為預設的待存儲數(shù)據(jù)在第X級鏈表中占用的比特 位數(shù)。
[0048] 在上述實施方式中,待存儲數(shù)據(jù)在第X級鏈表的存儲位置為一個比特位組,所述比 特位組包括:從編號為(i % ρχ)*〇χ的比特位到編號為(i % Ρχ) *〇χ+〇χ-1的比特位。
[0049] 下面對上述實施方式進行詳細說明:
[0050] 預設X級鏈表,對于第j (j的范圍是1~X)級鏈表來說,預設第j級鏈表的容量為yj 比特,位圖中的比特位從0開始編號。其中,j越大表示該鏈表越低級。
[0051 ] j為X時,為第X級鏈表,第X級鏈表為最底層的鏈表,第X級鏈表所包含的位圖用來 存儲上述待存儲數(shù)據(jù),預設的待存儲數(shù)據(jù)在第X級鏈表的位圖中占用的比特位數(shù)為〇x比特; [0052] j不為X時,第j級鏈表所包含的位圖用于存儲第j+Ι級列表的狀態(tài),預設第j+Ι級列 表的狀態(tài)在第j級鏈表的位圖中占用的比特位數(shù)為W比特;
[0053] 預設的鏈表編號規(guī)則為:第一級鏈表從0開始編號,每個第一級鏈表下的第二級鏈 表從〇開始編號,每個第二級鏈表下的第三級鏈表從〇開始編號,以此類推,每個第x-1級鏈 表下的第X級鏈表從〇開始編號。
[0054] 貝1J:
[0055 ]第X級鏈表存儲的數(shù)據(jù)個數(shù)為:px=wx = yx/ox
[0056] ···
[0057] 第 j 級鏈表存儲的數(shù)據(jù)個數(shù)為:pj = wx*wx-= (yx/ox)*(yx-i/ox-i)*'"*(yj/ 〇j)
[0058] ···
[0059] 第一級鏈表存儲的數(shù)據(jù)個數(shù)為:
[0060] pfwJwx-(yx/ox)*(yx-i/〇x-i)*."*(yj/〇j)*."*(yi/oi) 〇
[0061 ]對于待存儲數(shù)據(jù)i(i的范圍為0~n)來說,
[0062] 對應的第一鏈表的編號為:[i/Pl];
[0063] ···
[0064] 對應的第j級鏈表的編號為:[(i%Pl%p2% . · · %Pj-d/pj];
[0065] ···
[0066] 對應的第x級鏈表的編號為:[(i%Pl%p2%…%pj··· %px-0/px];
[0067] 在第x級鏈表的位圖的存儲位置:從(i % px)*〇x比特到(i % ρχ)*〇χ+〇χ-1比特。
[0068]下面以兩級鏈表為例進行說明:
[0069]假設第二級鏈表的容量72為6比特,待存儲數(shù)據(jù)在第二級鏈表中占用的比特位數(shù)〇2 為2比特,第二級鏈表存儲的數(shù)據(jù)個數(shù):P2 = y2/〇2 = 6/2 = 3。
[0070]假設第一級鏈表的容量71為12比特,第二級鏈表的狀態(tài)在第一級鏈表中占用的比 特位數(shù)〇1為2比特,則第一級鏈表對應6個第二級鏈表,第一級鏈表對應的待存儲數(shù)據(jù)的個 數(shù):pl = (y2/〇2)*(yi/oi) = (6/2)*(12/2) = 18〇 [0071]對于數(shù)據(jù)i = 0來說:
[0072] 對應的第一級鏈表的編號為:[i/Pl] = [0/18] =0;
[0073] 對應的第二級鏈表的編號為:[(i%Pl)/p2] = [(0% 18)/3] = [0/3] =0。
[0074] 在第二級鏈表的位圖的存儲位置:
[0075] (i%p2)*〇2= (0%3)*2 = 0; (i%p2)*〇2+〇2-l = (0%3)*2+2_1 = 1,
[0076] 即編號為0和1的比特位用來存儲數(shù)據(jù)i = 0。
[0077] 對于任意的數(shù)據(jù)i = 42來說:
[0078] 對應的第一級鏈表的編號為:[i/Pl] = [42/18] = 2;
[0079] 對應的第二級鏈表的編號為:[(i%Pl)/p2] = [(42% 18)/3] = [6/3] =2
[0080] 在第二級鏈表的位圖的存儲位置:
[0081] (i%p2)*〇2= (42%3)*2 = 0
[0082] (i %ρ2)*〇2+〇2~1 =42% 3)*2+2-1 = 1
[0083] 即編號為0和1的比特位用來存儲數(shù)據(jù)i = 42。
[0084]下面以三級鏈表為例進行說明:
[0085]第三級鏈表存儲的數(shù)據(jù)個數(shù):p3 = y3/〇3 = 6/3 = 2;
[0086] 第二級鏈表對應的數(shù)據(jù)個數(shù):p2=(y3/〇3)*(y2/〇2 ) = (6/3 Μ12/2 ) = 12
[0087] 第一級鏈表對應的數(shù)據(jù)個數(shù):
[0088] p1= (yg/ogXyVc^Xyi/c^) = (6/3)*(12/2)*(8/1) = 96。
[0089] 對于數(shù)據(jù);[ = 99來說:
[0090] 對應的第一級鏈表的編號為:[i/Pl] = [99/96] = 1;
[0091 ]對應的第二級鏈表的編號為:[(i%Pl)/p2] = [(99%96)/12] = [3/12] =0 [0092]在第三級鏈表的位圖的存儲位置:
[0093] (i%p3)*〇3= (99%2)*3 = 3
[0094] (i%p3)*o3+〇3-l = (99%2)*3+3-l = 5
[0095] 即編號為3、4、5的比特位用來存儲數(shù)據(jù)。
[0096] S102:將待存儲數(shù)據(jù)存儲至所述存儲位置。
[0097] 假設待存儲數(shù)據(jù)考勤正常,該待存儲數(shù)據(jù)的存儲位置為第一個底層鏈表的編號為 6的比特位,將該待存儲數(shù)據(jù)存儲至該存儲位置,即表示第一個底層鏈表的編號為6的比特 位的位圖信息為1。
[0098] S103:在目標鏈表包含的所述數(shù)據(jù)全部相同時,刪除目標鏈表,并更新目標鏈表在 上一級鏈表中的狀態(tài)。
[0099] 在上述實施例中,待存儲數(shù)據(jù)在底層鏈表的存儲位置為一個比特位組,因此,目標 鏈表包含的所述數(shù)據(jù)全部相同,也就是說目標鏈表包含的每個比特位組的值全部相同,這 種情況下,刪除該目標鏈表,并在目標鏈表的上一級鏈表中將目標鏈表的狀態(tài)更新為對應 的第一預設值。
[0100] 仍以待存儲數(shù)據(jù)為考勤數(shù)據(jù)為例進行說明,用0表示缺勤,用1表示考勤正常,則一 個比特位組中包括一個比特位。
[0101 ]目標鏈表在上一級鏈表中的狀態(tài)可以包含三種狀態(tài):所有比特位全部為〇,所有比 特位全部為1,所有比特位既不全為0也不全為1??梢栽谀繕随湵淼纳弦患夋湵碇幸詢晌槐?特位來表示目標鏈表的狀態(tài)(因為兩位比特位可以表示四種狀態(tài)),比如,用01表示目標鏈 表的所有比特位全部為1,10表示目標鏈表的所有比特位全部為0,00表示目標鏈表的所有 比特位既不全為0也不全為1,當然也可以用其他方式表示底層鏈表的位圖的狀態(tài)信息,在 此不做限制。
[0102] 在實際應用中,可以根據(jù)有幾種狀態(tài),確定上一級鏈表中以幾位比特位來表示目 標鏈表的狀態(tài)。
[0103] 當目標鏈表中每一比特位全為1時,在上一級鏈表中將目標鏈表的狀態(tài)更新為01; 當目標鏈表中每一比特位全為0時,在上一級鏈表中將目標鏈表的狀態(tài)更新為10。
[0104] 應用本發(fā)明所示實施例,在目標鏈表包含的存儲數(shù)據(jù)全部相同時,刪除了該目標 鏈表,如果后來目標鏈表中的存儲數(shù)據(jù)發(fā)生了改變,需要根據(jù)上一級鏈表中目標鏈表的狀 態(tài),重新創(chuàng)建該目標鏈表。
[0105] 在本發(fā)明所示實施例中,如果待存儲數(shù)據(jù)為目標鏈表的第一條存儲數(shù)據(jù),則確定 所述目標鏈表不存在,需要創(chuàng)建目標鏈表,并在上一級鏈表中將目標鏈表的狀態(tài)設置為對 應的初始值。在上述例子中,上一級鏈表中針對目標鏈表的初始值應該為10,表示目標鏈表 的所有比特位全部為0。
[0106] 在本發(fā)明所示實施例中,在所述目標鏈表包含的所述數(shù)據(jù)不全部相同時,在上一 級鏈表中將目標鏈表的狀態(tài)更新為對應的第二預設值。在上述例子中,在目標鏈表包含的 所述數(shù)據(jù)不全部相同時(既包括0,又包括1),在上一級鏈表中將目標鏈表的狀態(tài)更新為對 應的第二預設值(00)。
[0107] 在上述實施方式中,當預設了X級鏈表時,如果第j級鏈表包含的狀態(tài)全部相同,則 刪除該第j級鏈表,并更新該第j級鏈表在第j-i級鏈表中的狀態(tài)。
[0108] 假設預設了三級鏈表,第三級鏈表中存儲的是考勤數(shù)據(jù),第三級鏈表存儲的待存 儲數(shù)據(jù)的個數(shù)為2,第二級鏈表對應的所述待存儲數(shù)據(jù)的個數(shù)為12,第一級鏈表對應的所述 待存儲數(shù)據(jù)的個數(shù)為96。也就是說第二級鏈表中包含了 6個第三級鏈表,第一級鏈表中包含 了 8個第二級鏈表。
[0109] 假設某個第三級鏈表中的存儲的2個數(shù)據(jù)相同,都為1,則刪除該第三級鏈表,將該 第三級鏈表的上一級鏈表中的狀態(tài)更新為10。假設該第三級鏈表的上一級鏈表(即第二級 鏈表)包含的6個第三級鏈表中的存儲的2個數(shù)據(jù)均相同,都為1,則刪除這6個第三級鏈表, 且該第二級鏈表中包含的狀態(tài)全部相同,均為10,這種情況下,刪除該第二級鏈表,并更新 第二級鏈表在上一級鏈表中的狀態(tài)。
[0110]應用本發(fā)明所示實施例,針對待存儲數(shù)據(jù),構建至少兩級鏈表,該待存儲數(shù)據(jù)存儲 在底層鏈表中,在底層鏈表包含的存儲數(shù)據(jù)全部相同時,刪除該底層鏈表,并更新該底層鏈 表在上一級鏈表中的狀態(tài)。一方面,將包含的存儲數(shù)據(jù)全部相同的底層鏈表刪除,節(jié)省了內 存空間的占用;另一方面,當數(shù)據(jù)量很大、構建了多個底層鏈表時,如果出現(xiàn)數(shù)據(jù)變化的情 況,僅需修改該數(shù)據(jù)對應的底層鏈表及該底層鏈表在上一級鏈表中的狀態(tài),不需要將全部 鏈表進行解壓-修改-壓縮的處理,提高了執(zhí)行效率。
[0111]下面以C語言為例來描述本發(fā)明多級鏈表的數(shù)據(jù)結構,需要說明的是,本發(fā)明的多 級鏈表數(shù)據(jù)結構能夠基于多種編程語言來實現(xiàn),例如Python或者Java等。
[0112]作為本發(fā)明的一種實施方式,底層鏈表的數(shù)據(jù)結構如下:
[0114] 其中,pstNextSecondBitMap表示指向下一個底層鏈表的指針,當已經(jīng)是最后一個 底層鏈表時,該指針為空;int類型數(shù)據(jù)iSecondBitMap表示底層鏈表的各個存儲位置的值; 每一個底層鏈表表示的數(shù)據(jù)范圍由上一級鏈表中的iBeginID和該底層鏈表對應上一級鏈 表的位置決定。
[0115]上一級鏈表的數(shù)據(jù)結構如下:
[0118] 其中,pstNextFirstBitMap表示指向下一個同一級鏈表的指針,當該鏈表已經(jīng)是 同一級中最后一個鏈表時,該指針為空;int類型數(shù)據(jù)iBeginID表示該鏈表的第一個比特位 表示的值,可以是1024的整數(shù)倍,如0、1024、2048等;long long型數(shù)據(jù)llFirstBitMap: long long類型的數(shù)據(jù)一共64個比特位,本實施例中,用上一級鏈表中的每兩位比特位表示一個 底層鏈表的狀態(tài),llFirstBitMap可以表示32個底層鏈表的狀態(tài):當這兩個比特位中左邊的 比特位為1時,表示對應的底層鏈表的所有比特位為0,當這兩個比特位中右邊的比特位為1 時,表示對應的底層鏈表的所有比特位為1,當這兩個比特位全為0時,表示對應的底層鏈表 的所有比特位既不全為1,也不全為〇 ;鏈表的頭結點pstSecondBitMap用于指向下一級鏈 表。
[0119] 假設目標鏈表的上一級鏈表的iBeginID為2048,該上一級鏈表對應了 32個底層鏈 表的狀態(tài),舉例說明該32個底層鏈表中每一個底層鏈表表示的數(shù)據(jù)范圍:上一級鏈表中編 號為8和9的比特位對應的底層鏈表表示的最小值為2048+8/2*32 = 2176,其中,8/2表示在 編號為8和9的比特位對應的底層鏈表之前有4個底層鏈表,一共占用了 8/2*32個比特位,加 上初始的2048,編號為8和9的比特位對應的底層鏈表的數(shù)據(jù)最小值為2048+8/2*32 = 2176; 每個底層鏈表占用32個比特位,編號為8和9的比特位對應的底層鏈表的數(shù)據(jù)最大值為2176 +32-1 = 2207。
[0120] 整體的數(shù)據(jù)結構可以如圖4所示:上一級鏈表通過指針pstNextFirstBitMap串聯(lián) 成一個單鏈表,每一個上一級鏈表還記錄有其對應的底層鏈表的鏈表頭結點,底層鏈表通 過pstNextSecondBitMap串聯(lián)成一個單鏈表。
[0121] 假設Z公司有2048個員工,員工ID從0到2047,在某一天有3個員工的考勤為缺勤, 他們的ID分別是100、328和1530,如果采用傳統(tǒng)的方式來記錄,需要2048/8 = 256個BYTE的 字符串來記錄這一信息,在這天的考勤記錄中,只需要將這個字符串的第100個、第328個和 第1530個比特位全部置為0,其余位置為1即可。
[0122] 采用本發(fā)明所示實施例,其處理步驟如下:
[0123] (1)獲得ID為0的員工的考勤信息,該員工的考勤正常,對應的比特位應該為1。記 錄ID為0的員工的考勤信息時,先構建底層鏈表(二級結構)的上一級鏈表(一級結構), iBeginID的值為0,llFirstBitMap的初始值為 1010101010101010101010101010101010101010101010101010101010101010(此時尚沒有員 工信息,全部比特位都認為是0,因此左邊的比特位全部設置成1)。
[0124] ( 2 )構建底層鏈表,并將底層鏈表的指針指向構建的上一級鏈表中。 iSecondBitMap 的初始值為00000000000000000000000000000000。
[0125] (3)ID為0的員工考勤正常,將iSecondBitMap中的編號為0的比特位設置成1,此時 iSecondBitMap 的值為 10000000000000000000000000000000, iSecondBitMap 的值既不是全 1也不是全0,因此11卩化8七8汍]\^口值修改成00101010101010101010101010101010 10101010101010101010101010101010, ID 為 0 的員工考勤記錄完畢。
[0126] (4)在本實施例中,一個底層鏈表能表示32個員工的考勤信息,一個上一級鏈表能 表示1024個員工的信息,因此需要2個上一級鏈表。
[0127] 可以采用上述公式,確定待存儲數(shù)據(jù)對應的第一級鏈表至第x-1級鏈表:確定的所 述第一級鏈表至第x-1級鏈表的編號為:[(i%pi%P2%…%pj-i)/pj],1彡j彡x-1;確定的 第X級鏈表的編號為:[(i%pi%p 2% · · · %Pj. · · %px-0/px]。
[0128] 對于ID為0的員工來說,i = 0,對應的第二級鏈表的編號為:[i/Pl] = [0/32] =0;
[0129] 對應的第一級鏈表的編號為:[(i%Pl)/p2] = [ (0%32)/32] = [0/32] =0。
[0130] 在第二級鏈表的存儲位置:
[0131 ] (i%p2)*〇2= (0%32)*2 = 0; (i%p2)*〇2+〇2-l = (0%32)*2+2_1 = 1,
[0132] 即編號為0和1的比特位用來存儲ID為0的員工的考勤數(shù)據(jù)。
[0133] (5)第一個底層鏈表對應于llFirstBitMap中的編號為0和1的比特位, llFirstBitMap中編號為0和1的比特位的值為00,表示第一個底層鏈表的所有比特位既不 全為0也不全為1。
[0134] (6)獲得ID為1的員工的考勤信息,該員工的考勤正常,對應的比特位應該為1。將 iSecondBitMap 的值修改為 11000000000000000000000000000000, iSecondBitMap 仍舊既不 全為0也不全為1,因此不用修改。
[0135] ID從2到30的員工的處理過程與ID為1的員工的處理過程相同,經(jīng)過處理完這些員 工之后,iSecondBitMap 變?yōu)?11 111 111 111 111 111 111 111 111 111 10。
[0136] (7)記錄ID為31的員工的考勤,ID為31的員工仍對應編號為0的底層鏈表。將編號 為 31 的比特位置為 1,iSecondBitMap 的值變?yōu)?1111111111111111111111111111111,可以 看到此時iSecondBitMap所有比特位已經(jīng)全部成了 1,因此刪除該底層鏈表,同時將 llFirstBitMap 值修改成 01101010101010101010101010101010101010101010101010101010 10101010。
[0137] (8)記錄ID32-63員工的考勤信息,確定ID32-63員工對應的第二級鏈表的編號為: [i/ Pl] = [32/32] = 1;對應的第一級鏈表的編號為:[(i%Pl)/p2] = [(32%32)/32] = [l/ 32] =0。在編號為1的底層鏈表中記錄ID32-63員工的考勤信息,其過程與記錄ID0-31員工 的考勤信息相同,記錄完ID32-63員工的考勤信息后,llFirstBitMap值修改成 0101101010101010101010101010101010101010101010101010101010101010ο
[0138] 為了簡化描述,ID從32到99的員工的記錄過程不再贅述,直接看第一個考勤異常 的員工的處理方法。記錄完ID為99的員工后,llFirstBitMap值為 0101010010101010101010101010101010101010101010101010101010101010, iSecondBitMap 值為 11110000000000000000000000000000 〇
[0139] (9)確定ID為100的員工對應的第二級鏈表的編號為:[i/pl ] = [ 100/32] = 3;對應 的第一級鏈表的編號為:[(1^1)/^2] = [(100%32)/32] = [3/32]=0。在第二級鏈表的存 儲位置:(1%口2)*〇2 = (100%32)*2 = 6;(1%口2)*〇2+〇2-1 = (100%32)*2+2-1 = 7??芍?0 為100的員工對應編號為3的底層鏈表,在編號為3的底層鏈表中,以編號為6和7的比特位用 來存儲ID為100的員工的考勤數(shù)據(jù)。編號為3的底層鏈表中存儲ID為100的員工的存儲位置 處的位圖信息本身為0,不需要進行任何操作。
[0140] (10)記錄完ID為100的員工之后,繼續(xù)記錄后續(xù)員工,當記錄完ID96-127的員工之 后,此時因為員工100對應的比特位是0,員工96、97、98等對應的比特位是1,因此該編號為3 的底層鏈表中包含的存儲數(shù)據(jù)不全部相同,不刪除該底層鏈表。記錄完ID為127的員工后, llFirstBitMap 值為 010101001010101010101010101010101010101010101010101010101010 1010, iSecondBitMap 值為 11110111111111111111111111111111。
[0141] (11)后續(xù)員工的處理過程相同,此處不再贅述,最終,我們得到數(shù)據(jù)結構如圖5所 示,存儲數(shù)據(jù)全部相同的底層鏈表已被壓縮,只顯示了存儲數(shù)據(jù)不全部相同的三個底層鏈 表。
[0142] 通過上述步驟可知,應用上述實施例,一共使用了兩個上一級鏈表(一級結構)和 三個底層鏈表(二級結構)。在32位系統(tǒng)中,一個上一級鏈表的大小為(4+4+8+4) = 20BYTE, 一個底層鏈表的大小為(4+4) = 8BYTE,一共占用的內存為(2*20+3*8) = 64BYTE。相對于原 來的 256BYTE,節(jié)省了( 256-64) /256 = 75 % 的內存。
[0143] 作為本發(fā)明的另一種實施方式,上述方案還可以應用在BGP(Border Gateway Protocol,邊界網(wǎng)關協(xié)議)中。在BGP應用中,需要記錄每個BGP鄰居是否發(fā)送過更新或者撤 銷的信息,以避免重復發(fā)送。
[0144]假設需要記錄1000個BGP鄰居是否發(fā)送過更新或者撤銷的信息,針對每個鄰居,有 一個唯一的編號,1000個鄰居的編號可以為0-999。與上述考勤數(shù)據(jù)類似,如果對于某條更 新或者撤銷的信息,該鄰居發(fā)送過,則該鄰居的存儲數(shù)據(jù)為1,如果沒發(fā)送過,該鄰居的存儲 數(shù)據(jù)為0。
[0145] 假設編號為100、328和930的鄰居沒有發(fā)送過該信息,如果采用傳統(tǒng)的方式來記 錄,需要1000/8 = 125個BYTE的字符串來記錄這一信息。在針對該信息的記錄中,只需要將 這個字符串的編號為1〇〇、328、930的比特位全部置為0,其余位置為1即可。
[0146] 采用本發(fā)明所示實施例,應用圖4中的數(shù)據(jù)結構,其處理步驟如下:
[0147] (1)獲得編號為0的鄰居的存儲數(shù)據(jù),該鄰居發(fā)送過該信息,對應的比特位的值應 該為1。記錄編號為〇的鄰居的存儲數(shù)據(jù)時,先構建底層鏈表(二級結構)的上一級鏈表(一級 結構),iBeginID 的值為 0,llFirstBitMap 的初始值為 10101010101010101010101010101010 10101010101010101010101010101010(此時尚沒有存儲數(shù)據(jù),全部比特位都認為是0,因此 左邊的比特位全部設置成1)。
[0148] ( 2 )構建底層鏈表,并將底層鏈表的指針指向構建的上一級鏈表中。 iSecondBitMap 的初始值為00000000000000000000000000000000。
[0149] (3)編號為0的鄰居發(fā)送過該信息,將iSecondBitMap中的編號為0的比特位設置成 1,此時 iSecondBitMap 的值為 10000000000000000000000000000000, iSecondBitMap 的值既 不是全 1 也不是全0,因此llFirstBitMap值修改成00101010101010101010101010101010 10101010101010101010101010101010,編號為 0 的鄰居記錄完畢。
[0150] (4)在本實施例中,一個底層鏈表能表示32個鄰居的存儲數(shù)據(jù),一個上一級鏈表能 表示1024個鄰居的存儲數(shù)據(jù),因此需要1個上一級鏈表。
[0151] 可以采用上述公式,確定待存儲數(shù)據(jù)對應的第一級鏈表至第x-1級鏈表:確定的所 述第一級鏈表至第x-1級鏈表的編號為:[(i%pi%P2%…%pj-i)/pj],1彡j彡x-1;確定的 第X級鏈表的編號為:[(i%pi%p 2% · · · %Pj. · · %px-0/px]。
[0152] 對于編號為0的鄰居來說,i=0,對應的第二級鏈表的編號為:[i/Pl] = [0/32] = 〇;
[0153] 對應的第一級鏈表的編號為:[(i%Pl)/p2] = [(0%32)/32] = [0/32] =0。
[0154] 在第二級鏈表的存儲位置:
[0155] (i%p2)*〇2= (0%32)*2 = 0; (i%p2)*〇2+〇2-l = (0%32)*2+2_1 = 1,
[0156] 即編號為0和1的比特位用來存儲編號為0的鄰居的存儲數(shù)據(jù)。
[0157] (5)第一個底層鏈表對應于llFirstBitMap中的編號為0和1的比特位, llFirstBitMap中編號為0和1的比特位的值為00,表示第一個底層鏈表的所有比特位既不 全為0也不全為1。
[0158] (6)獲得編號為1的鄰居的存儲數(shù)據(jù),該鄰居發(fā)送過該信息,對應的比特位應該為 1〇 將iSecondBitMap 的值修改為 11000000000000000000000000000000, iSecondBitMap 仍舊 既不全為〇也不全為1,因此不用修改。
[0159] 編號從2到30的鄰居的處理過程與編號為1的員工的處理過程相同,經(jīng)過處理完這 些員工之后,iSecondBitMap 變?yōu)?1111111111111111111111111111110。
[0160] (7)記錄編號為31的鄰居的存儲數(shù)據(jù),編號為31的鄰居仍對應編號為0的底層鏈 表。將編號為 31的比特位置為1,iSecondBitMap的值變?yōu)?1111111111111111111111111111 111,可以看到此時iSecondBitMap所有比特位已經(jīng)全部成了 1,因此刪除該底層鏈表,同時 將 llFirstBitMap 值修改成 011010101010101010101010101010101010101010101010101010 1010101010。
[0161] (8)記錄編號為32-63鄰居的存儲數(shù)據(jù),確定編號為32-63的鄰居對應的第二級鏈 表的編號為:[i/pi] = [32/32] = 1;對應的第一級鏈表的編號為:[(i%Pl)/p2] = [(32% 32)/32] = [1/32]=0。在編號為1的底層鏈表中記錄編號為32-63的鄰居的存儲數(shù)據(jù),其過 程與記錄編號為32-63的鄰居的存儲數(shù)據(jù)相同,記錄完編號為32-63的鄰居的存儲數(shù)據(jù)后, llFirstBitMap 值修改成 01011010101010101010101010101010101010101010101010101010 10101010。
[0162] 為了簡化描述,編號從32到99的鄰居的記錄過程不再贅述,直接看第一個異常的 鄰居的處理方法。記錄完編號為99的鄰居后,llFirstBitMap值為0101010010101010101010 101010101010101010101010101010101010101010,iSecondBitMap 值為 11110000000000000 000000000000000〇
[0163] (9)確定編號為100的鄰居對應的第二級鏈表的編號為:[i/pl] = [100/32]=3;對 應的第一級鏈表的編號為:[(1%口1)/^] = [(100%32)/32] = [3/32]=0。在第二級鏈表的 存儲位置:(i%P2)*〇2=(100%32)*2 = 6;(i%p2)*〇2+〇2-l = (100%32)*2+2-l = 7??芍?號為100的員工對應編號為3的底層鏈表,在編號為3的底層鏈表中,以編號為6和7的比特位 用來存儲編號為100的鄰居的存儲數(shù)據(jù)。編號為3的底層鏈表中編號為100的鄰居的存儲位 置處的位圖信息本身為0,不需要進行任何操作。
[0164] (10)記錄完編號為100的鄰居之后,繼續(xù)記錄后續(xù)鄰居,當記錄完編號96-127的鄰 居之后,此時因為編號為100的鄰居對應的比特位是0,編號為96、97、98等鄰居對應的比特 位是1,因此該編號為3的底層鏈表中包含的存儲數(shù)據(jù)不全部相同,不刪除該底層鏈表。記錄 完編號為 127 的鄰居后,llFirstBitMap 值 010101001010101010101010101010101010101010 1010101010101010101010,iSecondBitMap 值為 11110111111111111111111111111111。
[0165] (11)后續(xù)鄰居的處理過程相同,此處不再贅述,最終存儲數(shù)據(jù)全部相同的底層鏈 表已被刪除,只保留了存儲數(shù)據(jù)不全部相同的三個底層鏈表(編號為編號為1〇〇、328和930 的鄰居對應的底層鏈表)。
[0166] 通過上述步驟可知,應用上述實施例,一共使用了一個上一級鏈表(一級結構)和 三個底層鏈表(二級結構)。在32位系統(tǒng)中,一個上一級鏈表的大小為(4+4+8+4) = 20BYTE, 一個底層鏈表的大小為(4+4) = 8BYTE,一共占用的內存為(20+3*8) = 44BYTE。相對于原來 的 125BYTE,節(jié)省了(125-44)/125 = 64.8% 的內存。
[0167] 與上述的方法實施例相對應,本發(fā)明實施例還提供一種數(shù)據(jù)存儲裝置。
[0168] 圖6為本發(fā)明實施例提供的一種數(shù)據(jù)存儲裝置的結構示意圖,包括:
[0169] 獲得確定模塊201,用于獲得待存儲數(shù)據(jù),并確定所述待存儲數(shù)據(jù)對應的目標鏈表 以及所述待存儲數(shù)據(jù)在所述目標鏈表的存儲位置;
[0170]存儲模塊202,用于將所述待存儲數(shù)據(jù)存儲至所述存儲位置;
[0171 ]刪除更新模塊203,用于在所述目標鏈表包含的所述數(shù)據(jù)全部相同時,刪除所述目 標鏈表,并更新所述目標鏈表在上一級鏈表中的狀態(tài)。
[0172]在本發(fā)明所示實施例中,獲得確定模塊201,還可以用于預設X級鏈表,所述X為大 于1的整數(shù),設定所述目標鏈表為第X級鏈表;以及依次確定所述待存儲數(shù)據(jù)對應的第一級 鏈表至第x-1級鏈表。
[0173] 在本發(fā)明所示實施例中,獲得確定模塊201,還可以用于確定的所述第一級鏈表至 第x-1級鏈表的編號為:[(i%pi%P2%…%pj-i)/pj],K j彡x-1;以及確定的第X級鏈表的 編號為:[(i%pi%P2% · · · %Pj. · · %Ρχ-ι)/ρχ];
[0174] 其中,所述i為待存儲數(shù)據(jù)的編號,i為非負整數(shù);
[0175]所述Pj為第j級鏈表對應的所述待存儲數(shù)據(jù)的個數(shù),pj=Wx*Wx-所述Wj為 預設的第j級鏈表存儲的狀態(tài)的個數(shù),^ = ^/〇』,所述為預設的第j級鏈表的容量,單位為 比特,所述W為預設的第j+Ι級鏈表的狀態(tài)在第j級鏈表中占用的比特位數(shù);
[0176] 所述px為第X級鏈表存儲的所述待存儲數(shù)據(jù)的個數(shù),口\ = ?^ = 7/〇\,所述7\為預設 的第X級鏈表的容量,單位為比特,所述〇x為預設的待存儲數(shù)據(jù)在第X級鏈表中占用的比特 位數(shù)。
[0177] 在本發(fā)明所示實施例中,所述待存儲數(shù)據(jù)在所述第X級鏈表的存儲位置為一個比 特位組,所述比特位組包括:從編號為(i%px)* 〇x的比特位到編號為(i%px)*〇x+〇x-l的比特 位。
[0178] 在本發(fā)明所示實施例中,刪除更新模塊203,還可以用于在所述目標鏈表包含的所 述數(shù)據(jù)全部相同時,在所述上一級鏈表中將目標鏈表的狀態(tài)更新為對應的第一預設值;以 及在所述目標鏈表包含的所述數(shù)據(jù)不全部相同時,在所述上一級鏈表中將目標鏈表的狀態(tài) 更新為對應的第二預設值;
[0179]獲得確定模塊201,還可以用于確定所述目標鏈表不存在時,創(chuàng)建目標鏈表,并在 所述上一級鏈表中將目標鏈表的狀態(tài)設置為對應的初始值。
[0180]在本發(fā)明所示實施例中,刪除更新模塊203,還可以用于當?shù)趈級鏈表包含的狀態(tài) 全部相同時,刪除所述第j級鏈表,并更新所述第j級鏈表在第j-i級鏈表中的狀態(tài)。
[0181 ]應用本發(fā)明圖6所示實施例,針對待存儲數(shù)據(jù),構建至少兩級鏈表,該待存儲數(shù)據(jù) 存儲在底層鏈表中,在底層鏈表包含的存儲數(shù)據(jù)全部相同時,刪除該底層鏈表,并更新該底 層鏈表在上一級鏈表中的狀態(tài)。一方面,將包含的存儲數(shù)據(jù)全部相同的底層鏈表刪除,節(jié)省 了內存空間的占用;另一方面,當數(shù)據(jù)量很大、構建了多個底層鏈表時,如果出現(xiàn)數(shù)據(jù)變化 的情況,僅需修改該數(shù)據(jù)對應的底層鏈表及該底層鏈表在上一級鏈表中的狀態(tài),不需要將 全部鏈表進行解壓-修改-壓縮的處理,提高了執(zhí)行效率。
[0182] 需要說明的是,在本文中,諸如第一和第二等之類的關系術語僅僅用來將一個實 體或者操作與另一個實體或操作區(qū)分開來,而不一定要求或者暗示這些實體或操作之間存 在任何這種實際的關系或者順序。而且,術語"包括"、"包含"或者其任何其他變體意在涵蓋 非排他性的包含,從而使得包括一系列要素的過程、方法、物品或者設備不僅包括那些要 素,而且還包括沒有明確列出的其他要素,或者是還包括為這種過程、方法、物品或者設備 所固有的要素。在沒有更多限制的情況下,由語句"包括一個……"限定的要素,并不排除在 包括所述要素的過程、方法、物品或者設備中還存在另外的相同要素。
[0183] 本說明書中的各個實施例均采用相關的方式描述,各個實施例之間相同相似的部 分互相參見即可,每個實施例重點說明的都是與其他實施例的不同之處。尤其,對于裝置實 施例而言,由于其基本相似于方法實施例,所以描述的比較簡單,相關之處參見方法實施例 的部分說明即可。
[0184] 本領域普通技術人員可以理解實現(xiàn)上述方法實施方式中的全部或部分步驟是可 以通過程序來指令相關的硬件來完成,所述的程序可以存儲于計算機可讀取存儲介質中, 這里所稱得的存儲介質,如:ROM/RAM、磁碟、光盤等。
[0185]以上所述僅為本發(fā)明的較佳實施例而已,并非用于限定本發(fā)明的保護范圍。凡在 本發(fā)明的精神和原則之內所作的任何修改、等同替換、改進等,均包含在本發(fā)明的保護范圍 內。
【主權項】
1. 一種數(shù)據(jù)存儲方法,其特征在于,包括: 獲得待存儲數(shù)據(jù),并確定所述待存儲數(shù)據(jù)對應的目標鏈表以及所述待存儲數(shù)據(jù)在所述 目標鏈表的存儲位置; 將所述待存儲數(shù)據(jù)存儲至所述存儲位置; 在所述目標鏈表包含的所述數(shù)據(jù)全部相同時,刪除所述目標鏈表,并更新所述目標鏈 表在上一級鏈表中的狀態(tài)。2. 根據(jù)權利要求1所述的方法,其特征在于, 預設X級鏈表,所述X為大于1的整數(shù),則所述確定的目標鏈表為第X級鏈表,確定的所述 存儲位置為:在所述第X級鏈表的存儲位置; 確定所述目標鏈表之前,該方法還包括:依次確定所述待存儲數(shù)據(jù)對應的第一級鏈表 至第χ-1級鏈表。3. 根據(jù)權利要求2所述的方法,其特征在于, 確定的所述第一級鏈表至第χ-1級鏈表的編號為:[(i%pi%P2% . · · %pj-i)/pj],1彡j ^χ-1 ; 確定的第χ級鏈表的編號為:[(i%Pl%P2%…%Ρ?!ぁ?Ρχ-ι)/ρχ]; 所述i為待存儲數(shù)據(jù)的編號,i為非負整數(shù); 所述Pj為第j級鏈表對應的所述待存儲數(shù)據(jù)的個數(shù),Pj =WX*WX-,所述Wj = yj/〇j, 所述n為預設的第j級鏈表的容量,單位為比特,所述~為預設的第j+1級鏈表的狀態(tài)在第j 級鏈表中占用的比特位數(shù); 所述Px為第X級鏈表存儲的所述待存儲數(shù)據(jù)的個數(shù),px=wx = yx/ox,所述yx為預設的第X 級鏈表的容量,單位為比特,所述〇x為預設的待存儲數(shù)據(jù)在第X級鏈表中占用的比特位數(shù)。4. 根據(jù)權利要求3所述的方法,其特征在于,所述待存儲數(shù)據(jù)在所述第X級鏈表的存儲 位置為一個比特位組,所述比特位組包括:從編號為(i%p x)*〇x的比特位到編號為(i%px)* 〇χ+〇χ-1的比特位。5. 根據(jù)權利要求4所述的方法,其特征在于, 在所述目標鏈表包含的所述數(shù)據(jù)全部相同時,所述更新所述目標鏈表在上一級鏈表中 的狀態(tài),包括:在所述目標鏈表包含的每個比特位組的值全部相同時,在所述上一級鏈表中 將目標鏈表的狀態(tài)更新為對應的第一預設值; 確定所述目標鏈表不存在時,該方法還包括:創(chuàng)建目標鏈表,并在所述上一級鏈表中將 目標鏈表的狀態(tài)設置為對應的初始值; 在所述目標鏈表包含的所述數(shù)據(jù)不全部相同時,該方法還包括:在所述上一級鏈表中 將目標鏈表的狀態(tài)更新為對應的第二預設值。6. 根據(jù)權利要求3所述的方法,其特征在于,該方法還包括:當?shù)趈級鏈表包含的狀態(tài)全 部相同時,刪除所述第j級鏈表,并更新所述第j級鏈表在第j-Ι級鏈表中的狀態(tài)。7. -種數(shù)據(jù)存儲裝置,其特征在于,包括: 獲得確定模塊,用于獲得待存儲數(shù)據(jù),并確定所述待存儲數(shù)據(jù)對應的目標鏈表以及所 述待存儲數(shù)據(jù)在所述目標鏈表的存儲位置; 存儲模塊,用于將所述待存儲數(shù)據(jù)存儲至所述存儲位置; 刪除更新模塊,用于在所述目標鏈表包含的所述數(shù)據(jù)全部相同時,刪除所述目標鏈表, 并更新所述目標鏈表在上一級鏈表中的狀態(tài)。8. 根據(jù)權利要求7所述的裝置,其特征在于, 所述獲得確定模塊,還用于預設X級鏈表,所述X為大于1的整數(shù),設定所述目標鏈表為 第X級鏈表;以及依次確定所述待存儲數(shù)據(jù)對應的第一級鏈表至第χ-1級鏈表。9. 根據(jù)權利要求8所述的裝置,其特征在于, 所述獲得確定模塊,還用于確定的所述第一級鏈表至第χ-1級鏈表的編號為:[(i%ρι% P2% · · · %pj-i)/pj],1彡j彡χ-1;以及確定的第χ級鏈表的編號為:[(i %P1%P2% · · · % Pj---%Px-i)/px]; 其中,所述i為待存儲數(shù)據(jù)的編號,i為非負整數(shù); 所述Pj為第j級鏈表對應的所述待存儲數(shù)據(jù)的個數(shù),P j =WX*WX-,所述Wj = yj/〇j, 所述n為預設的第j級鏈表的容量,單位為比特,所述~為預設的第j+1級鏈表的狀態(tài)在第j 級鏈表中占用的比特位數(shù); 所述Px為第X級鏈表存儲的所述待存儲數(shù)據(jù)的個數(shù),px=wx = yx/ox,所述yx為預設的第X 級鏈表的容量,單位為比特,所述〇x為預設的待存儲數(shù)據(jù)在第X級鏈表中占用的比特位數(shù)。 10 .根據(jù)權利要求9所述的裝置,其特征在于,所述待存儲數(shù)據(jù)在所述第X級鏈表的存儲 位置為一個比特位組,所述比特位組包括:從編號為(i%px)*〇x的比特位到編號為(i%p x)* 〇χ+〇χ-1的比特位。11. 根據(jù)權利要求10所述的裝置,其特征在于, 所述刪除更新模塊,還用于在所述目標鏈表包含的所述數(shù)據(jù)全部相同時,在所述上一 級鏈表中將目標鏈表的狀態(tài)更新為對應的第一預設值;以及在所述目標鏈表包含的所述數(shù) 據(jù)不全部相同時,在所述上一級鏈表中將目標鏈表的狀態(tài)更新為對應的第二預設值; 所述獲得確定模塊,還用于確定所述目標鏈表不存在時,創(chuàng)建目標鏈表,并在所述上一 級鏈表中將目標鏈表的狀態(tài)設置為對應的初始值。12. 根據(jù)權利要求9所述的裝置,其特征在于, 所述刪除更新模塊,還用于當?shù)趈級鏈表包含的狀態(tài)全部相同時,刪除所述第j級鏈表, 并更新所述第j級鏈表在第j-Ι級鏈表中的狀態(tài)。
【文檔編號】G06F17/30GK106095788SQ201610367629
【公開日】2016年11月9日
【申請日】2016年5月27日
【發(fā)明人】余清炎
【申請人】杭州華三通信技術有限公司