日韩成人黄色,透逼一级毛片,狠狠躁天天躁中文字幕,久久久久久亚洲精品不卡,在线看国产美女毛片2019,黄片www.www,一级黄色毛a视频直播

一種數(shù)據(jù)存儲(chǔ)方法及裝置的制造方法

文檔序號(hào):10724917閱讀:366來源:國知局
一種數(shù)據(jù)存儲(chǔ)方法及裝置的制造方法
【專利摘要】本發(fā)明實(shí)施例公開了一種數(shù)據(jù)存儲(chǔ)方法及裝置,針對(duì)待存儲(chǔ)數(shù)據(jù),構(gòu)建至少兩級(jí)鏈表,該待存儲(chǔ)數(shù)據(jù)存儲(chǔ)在底層鏈表中,在底層鏈表包含的存儲(chǔ)數(shù)據(jù)全部相同時(shí),刪除該底層鏈表,并更新該底層鏈表在上一級(jí)鏈表中的狀態(tài)。一方面,將包含的存儲(chǔ)數(shù)據(jù)全部相同的底層鏈表刪除,節(jié)省了內(nèi)存空間的占用;另一方面,當(dāng)數(shù)據(jù)量很大、構(gòu)建了多個(gè)底層鏈表時(shí),如果出現(xiàn)數(shù)據(jù)變化的情況,僅需修改該數(shù)據(jù)對(duì)應(yīng)的底層鏈表及該底層鏈表在上一級(jí)鏈表中的狀態(tài),不需要將全部鏈表進(jìn)行解壓?修改?壓縮的處理,提高了執(zhí)行效率。
【專利說明】
一種數(shù)據(jù)存儲(chǔ)方法及裝置
技術(shù)領(lǐng)域
[0001 ]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,特別涉及一種數(shù)據(jù)存儲(chǔ)方法及裝置。
【背景技術(shù)】
[0002] 隨著科學(xué)技術(shù)的發(fā)展,計(jì)算機(jī)已深入人們的生活,并帶來了巨大的便利。目前,利 用計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)已十分普遍。比如,公司記錄員工的考勤數(shù)據(jù),一般都采用計(jì)算機(jī)來存 儲(chǔ)。
[0003] 例如,公司A需要記錄8個(gè)員工的考勤信息,傳統(tǒng)的記錄方案是在計(jì)算機(jī)中存儲(chǔ)每 一天正??记趩T工的ID列表,比如:2016-2-15:[1,2,3,4,5,6,7,8]。假如員工ID采用的數(shù) 據(jù)類型是CHAR型(占用1個(gè)BYTE),則在沒有員工缺勤的情況下,存儲(chǔ)當(dāng)天的考勤記錄需要8 個(gè)BYTE(內(nèi)存占用總數(shù)=員工個(gè)數(shù)*員工ID數(shù)據(jù)類型占用內(nèi)存數(shù))。當(dāng)該公司的規(guī)模再擴(kuò)大, 比如擴(kuò)大到100000個(gè)員工時(shí),那么員工ID的數(shù)據(jù)類型就不能使用CHAR型,因?yàn)镃HAR型數(shù)據(jù) 只能表示0~127,員工ID的類型必須使用INT型(占用4個(gè)BYTE),則在沒有員工缺勤的情況 下,存儲(chǔ)當(dāng)天的考勤記錄需要400,000(即100000*4)個(gè)BYTE。
[0004] -種更優(yōu)的方案是構(gòu)造一個(gè)BIT-MAP(位圖文件),用于存儲(chǔ)每一個(gè)員工的考勤信 息,如果某員工當(dāng)前的考勤正常,則將該員工對(duì)應(yīng)的位置設(shè)置成1,否則設(shè)置成0。
[0005] 以上述例子進(jìn)行說明,當(dāng)公司A中存在8個(gè)員工時(shí),將這些員工映射到一個(gè)8個(gè)BIT 的數(shù)組中,假設(shè)2016-2-16這天員工4和員工7考勤不正常時(shí),其所對(duì)應(yīng)的BIT-MAP如圖1所 示。由此可以看出,僅需8個(gè)比特位(即1個(gè)BYTE)便可存儲(chǔ)所有員工的考勤信息,所占用的計(jì) 算機(jī)的內(nèi)存為傳統(tǒng)方案的1/8。當(dāng)該公司的規(guī)模再擴(kuò)大,比如擴(kuò)大到100000個(gè)員工時(shí),需要 申請(qǐng)一個(gè)12500 (即100000/8)個(gè)BYTE的CHAR型數(shù)組arrayA,其中:arrayA[0 ]對(duì)應(yīng)十進(jìn)制數(shù)0 ~7,arrayA[l ]對(duì)應(yīng)十進(jìn)制數(shù)8~15,arrayA[2]對(duì)應(yīng)十進(jìn)制數(shù)16~23......以此類推。因此, 采用構(gòu)造 BIT-MAP的方案,占用的計(jì)算機(jī)的內(nèi)存僅為傳統(tǒng)方案的1/32( 即12500/400000)。
[0006] 綜上所述,當(dāng)記錄的數(shù)據(jù)中最大的數(shù)為N時(shí),所需要消耗的內(nèi)存最多為(1+N/8)個(gè) BYTE,通過采用構(gòu)造 BIT-MAP的方案能夠很大程度上節(jié)省計(jì)算機(jī)內(nèi)存。
[0007] 但是在很多的使用場(chǎng)景中,BIT-MAP數(shù)據(jù)結(jié)構(gòu)中的比特位為0或者比特位為1都是 連續(xù)的,如上面例子中的員工考勤,對(duì)于工作日,絕大部分員工所對(duì)應(yīng)的比特位都是1(即考 勤正常),因此該BIT-MAP數(shù)據(jù)結(jié)構(gòu)仍然可以進(jìn)行壓縮和優(yōu)化,進(jìn)一步的節(jié)省內(nèi)存。
[0008] 針對(duì)BIT-MAP數(shù)據(jù)結(jié)構(gòu)中的比特位為0或者比特位為1都是連續(xù)的這一特點(diǎn),通常 使用的方案是引入字符串壓縮技術(shù),比如對(duì)BIT-MAP字符串采用RLE (run-length encoding,游程編碼)編碼方法進(jìn)行壓縮。如圖2的BIT-MAP為例:可以將圖2中的BIT-MAP編 碼為0,7,2,9,1,10,3。其意思是:第一位為0,連續(xù)有7個(gè),接下來是2個(gè)1,9個(gè)0,1個(gè)1,10個(gè)0, 最后是3個(gè)1(這里只是對(duì)RLE編碼基本原理的解釋,實(shí)際中的編碼可能會(huì)存在差異)。
[0009] 對(duì)于一個(gè)數(shù)據(jù)量很大的BIT-MAP,如果里面的數(shù)據(jù)分布存在大片連續(xù)的0或者大片 連續(xù)的1,采用RLE編碼方法將其進(jìn)行壓縮,會(huì)節(jié)省很多內(nèi)存的占用。
[0010]但是,采用RLE編碼方法,如果BIT-MAP中的某一個(gè)比特位發(fā)生變化,需要向?qū)嚎s 的RLE編碼解壓成原始的BIT-MAP數(shù)據(jù),將原始的BIT-MAP數(shù)據(jù)修改之后,再將修改后的BITMAP 壓縮成 RLE 編碼格式。
[0011 ]因此,對(duì)于數(shù)據(jù)頻繁變化的情況,采用RLE編碼方法壓縮BIT-MAP數(shù)據(jù),執(zhí)行效率很 低。

【發(fā)明內(nèi)容】

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