本發(fā)明涉及兩路及多路文件塊合并的方法。
背景技術(shù):
在很多的應(yīng)用場(chǎng)景(例如組播數(shù)據(jù))中,需要把一個(gè)大文件拆分為很多個(gè)文件塊,用文件偏移量(從文件指定位置向前或向后移動(dòng)的字節(jié)數(shù))來(lái)標(biāo)識(shí)文件塊在文件中的位置,而同時(shí)又往往涉及到把其中的一些文件塊進(jìn)行合并。例如,根據(jù)UDP協(xié)議組播大文件時(shí),組播方會(huì)把一個(gè)大文件拆分為多個(gè)較小的文件塊,將文件塊和文件偏移量等信息組成數(shù)據(jù)包(UDP包)組播。組播過(guò)程中丟包很多時(shí)候難以避免,接收方發(fā)現(xiàn)有丟包,會(huì)將丟失的數(shù)據(jù)包的信息通知組播方。通常,組播方收到接收方的丟包信息后不會(huì)立即響應(yīng),而是將丟包信息涉及到的文件塊進(jìn)行合并,累積到一定程度后再統(tǒng)一重發(fā)。由于組播方面向多個(gè)接收方,組播方需要進(jìn)行多路數(shù)據(jù)的合并,每路數(shù)據(jù)都包含了若干個(gè)文件塊。
對(duì)于多路文件塊的合并,可以選擇位圖(bitmap)、平衡數(shù)等算法,但這些算法各自有缺點(diǎn)。bitmap占用的內(nèi)存大、遍歷效率低。平衡樹的節(jié)點(diǎn)會(huì)頻繁的調(diào)整,合并的時(shí)間復(fù)雜度高。目前時(shí)間復(fù)雜度較優(yōu)的算法尚未見報(bào)道。
在說(shuō)明書“背景技術(shù)”部分公開的內(nèi)容,有助于本領(lǐng)域技術(shù)人員理解本發(fā)明的技術(shù)方案,但不應(yīng)據(jù)此認(rèn)為這些內(nèi)容一定屬于現(xiàn)有技術(shù)或公知常識(shí)。
技術(shù)實(shí)現(xiàn)要素:
為了克服“背景技術(shù)”部分所反映的缺陷,本發(fā)明提供兩路及多路文件塊合并的方法。
兩路文件塊合并的方法,包括:
1)分別將每路數(shù)據(jù)中的文件塊按照文件偏移量排序,在每路數(shù)據(jù)中設(shè)置一個(gè)指針指向排序第一的文件塊;
2)如果兩路數(shù)據(jù)指針指向的兩個(gè)文件塊在文件中的范圍不重疊,則將文件偏移量為最值的文件塊放入合并數(shù)據(jù)結(jié)構(gòu),原指向文件偏移量為最值的文件塊的指針指向該路數(shù)據(jù)按照排序的下一個(gè)文件塊;
如果兩路數(shù)據(jù)指針指向的兩個(gè)文件塊在文件中的范圍重疊,則將兩個(gè)文件塊合并為一個(gè)新文件塊,新文件塊位于一路數(shù)據(jù)中,原指向合并前文件塊的指針一個(gè)指向新文件塊另一個(gè)指向該路數(shù)據(jù)按照排序的下一個(gè)文件塊;
如果兩路數(shù)據(jù)指針指向的兩個(gè)文件塊中的一個(gè)文件塊在文件中的范圍被另一個(gè)文件塊覆蓋,則將在文件中的范圍被另一個(gè)文件塊覆蓋的文件塊刪除,原指向被刪除文件塊的指針指向該路數(shù)據(jù)按照排序的下一個(gè)文件塊;
3)重復(fù)2)直到遍歷完兩路數(shù)據(jù)的所有文件塊。
進(jìn)一步的,2)中所述的合并數(shù)據(jù)結(jié)構(gòu)為鏈表。
進(jìn)一步的,2)中所述將兩個(gè)文件塊合并為一個(gè)新文件塊,新文件塊位于一路數(shù)據(jù)中時(shí),新文件塊在文件中的范圍與該路數(shù)據(jù)按照排序的下一個(gè)文件塊不重疊。
多路文件塊合并的方法,包括:
1)將多路數(shù)據(jù)中的各路數(shù)據(jù)按照兩路文件塊合并的方法進(jìn)行兩兩合并,直到未進(jìn)行合并的數(shù)據(jù)路數(shù)不超過(guò)一;
2)重復(fù)1)直到多路數(shù)據(jù)合并為一路數(shù)據(jù)。
本發(fā)明技術(shù)方案中,“包括”、“用于”等詞語(yǔ)應(yīng)按照開放式表達(dá)方式理解。本領(lǐng)域技術(shù)人員通過(guò)閱讀本說(shuō)明書并結(jié)合現(xiàn)有技術(shù)或公知常識(shí)能夠獲知的內(nèi)容,本說(shuō)明書中不再贅述。
本發(fā)明提供的兩路及多路文件塊合并的方法,對(duì)于兩路及多路數(shù)據(jù)每路數(shù)據(jù)都包含了多個(gè)文件塊的情形,合并文件塊的算法達(dá)到了最優(yōu)或較優(yōu)的時(shí)間復(fù)雜度。
附圖說(shuō)明
圖1為具體實(shí)施方式中兩路文件塊合并的方法的流程圖。
圖2為具體實(shí)施方式中兩路文件塊合并的方法一個(gè)理想化示例的示意圖。
圖3為具體實(shí)施方式中多路文件塊合并的方法的流程圖。
具體實(shí)施方式
下面對(duì)本發(fā)明的實(shí)施方式進(jìn)行進(jìn)一步的具體說(shuō)明。但應(yīng)注意,本發(fā)明的范圍并不局限于所描述的具體技術(shù)方案。任何對(duì)所描述的具體技術(shù)方案中的技術(shù)要素進(jìn)行相同或等同替換獲得的技術(shù)方案或本領(lǐng)域技術(shù)人員在所描述的具體技術(shù)方案的基礎(chǔ)上不經(jīng)過(guò)創(chuàng)造性勞動(dòng)就可以獲得的技術(shù)方案,都應(yīng)當(dāng)視為落入本發(fā)明的保護(hù)范圍。
在本發(fā)明技術(shù)方案中,兩路或多路(多路指超過(guò)兩路)數(shù)據(jù)中任何一路數(shù)據(jù)的文件塊都來(lái)源于同一個(gè)原始文件(這樣進(jìn)行合并才有意義),這些文件塊都有與其對(duì)應(yīng)的文件偏移量,這樣根據(jù)文件偏移量和文件塊本身的大小(也稱為文件塊的長(zhǎng)度)可以確定文件塊在文件(原始文件)中的范圍。例如,一個(gè)大小2K的文件塊來(lái)自一個(gè)大小10K的文件,該文件塊的文件偏移量(從文件起始位置計(jì)算)為6K,則該文件塊在文件中的范圍為6K-8K。
兩路文件塊合并的方法,其流程如圖1所示,包括:
S101:分別將每路數(shù)據(jù)中的文件塊按照文件偏移量排序,在每路數(shù)據(jù)中設(shè)置一個(gè)指針指向排序第一的文件塊。
具體的,本步驟中,分別將每路數(shù)據(jù)中的文件塊按照文件偏移量排序。如果文件偏移量是從文件起始位置計(jì)算的,可以按照文件偏移量從小到大的順序排序;如果文件偏移量是從文件結(jié)束位置計(jì)算的,可以按照文件偏移量從大到小的順序排序。每路數(shù)據(jù)的文件塊按照文件偏移量排序后,在每路數(shù)據(jù)中都設(shè)置一個(gè)指針。初始時(shí)指針指向排序第一的文件塊,后續(xù)指針會(huì)不斷移動(dòng)遍歷該路數(shù)據(jù)中的所有文件塊。
S102:如果兩路數(shù)據(jù)指針指向的兩個(gè)文件塊在文件中的范圍不重疊,則將文件偏移量為最值的文件塊放入合并數(shù)據(jù)結(jié)構(gòu),原指向文件偏移量為最值的文件塊的指針指向該路數(shù)據(jù)按照排序的下一個(gè)文件塊;
如果兩路數(shù)據(jù)指針指向的兩個(gè)文件塊在文件中的范圍重疊,則將兩個(gè)文件塊合并為一個(gè)新文件塊,新文件塊位于一路數(shù)據(jù)中,原指向合并前文件塊的指針一個(gè)指向新文件塊另一個(gè)指向該路數(shù)據(jù)按照排序的下一個(gè)文件塊;
如果兩路數(shù)據(jù)指針指向的兩個(gè)文件塊中的一個(gè)文件塊在文件中的范圍被另一個(gè)文件塊覆蓋,則將在文件中的范圍被另一個(gè)文件塊覆蓋的文件塊刪除,原指向被刪除文件塊的指針指向該路數(shù)據(jù)按照排序的下一個(gè)文件塊。
具體的,本步驟中,設(shè)置一個(gè)專用的合并數(shù)據(jù)結(jié)構(gòu)來(lái)存儲(chǔ)兩路文件塊合并后獲得的文件塊,合并數(shù)據(jù)結(jié)構(gòu)常選取為鏈表。
本步驟對(duì)指針指向的文件塊在文件中的范圍進(jìn)行比較,不同情況進(jìn)行不同的處理。步驟S101中,兩路數(shù)據(jù)的指針都已經(jīng)指向了一個(gè)文件塊,這兩個(gè)文件塊的文件偏移量相對(duì)于本路數(shù)據(jù)排序在后的其他文件塊都是極值(極大或極小),將兩個(gè)極值比較可以找到文件偏移量的最值(在兩個(gè)極值中是最大或最小的)。比較兩個(gè)文件塊在文件中的范圍是否重疊。重疊指兩個(gè)文件塊在文件中的范圍存在相同的部分,也有各自不同的部分,兩個(gè)文件塊有相同的數(shù)據(jù),但任何一個(gè)文件塊都有另一個(gè)文件塊沒有的數(shù)據(jù)。還有一種特殊的情況,兩個(gè)文件塊沒有相同的數(shù)據(jù),但它們?cè)谖募械姆秶o密連接,中間沒有任何空隙,例如一個(gè)文件塊在文件中的范圍6K-8K,另一個(gè)文件塊在文件中的范圍8K-10K,從節(jié)約存儲(chǔ)空間等角度考慮,這種特殊情況也視為文件塊重疊。如果兩個(gè)文件塊不重疊,則將文件偏移量為最值的文件塊放入合并數(shù)據(jù)結(jié)構(gòu),原指向文件偏移量為最值的文件塊的指針指向該路數(shù)據(jù)按照S101排序確定的下一個(gè)文件塊。如果兩個(gè)文件塊重疊,則進(jìn)行文件塊的合并,將兩個(gè)文件塊合并為一個(gè)新文件塊。合并的方法是將兩個(gè)文件塊中的一個(gè)刪除,另一個(gè)文件塊加入被刪除的文件塊所包含的其沒有的數(shù)據(jù)。對(duì)于特殊的文件塊,文件塊只用起始處和結(jié)尾處的文件偏移量表示,并不包含具體的數(shù)據(jù),則合并的方法將兩個(gè)文件塊中的一個(gè)刪除,另一個(gè)文件塊修改起始處或結(jié)尾處的文件偏移量即可。合并操作的結(jié)果新文件塊位于一路數(shù)據(jù)中,原指向合并前文件塊的指針一個(gè)指向新文件塊另一個(gè)指向該路數(shù)據(jù)按照S101排序確定的下一個(gè)文件塊。
對(duì)于將兩個(gè)文件塊合并為一個(gè)新文件塊的操作,新文件塊具體位于那一路數(shù)據(jù),需要滿足以下約束條件,即新文件塊在文件中的范圍與該路數(shù)據(jù)按照S101排序確定的下一個(gè)文件塊不重疊。這樣可以保證任何一路數(shù)據(jù)的指針都會(huì)按照S101確定的順序,一個(gè)文件塊一個(gè)文件塊的移動(dòng),在移動(dòng)時(shí)不會(huì)跳過(guò)某一個(gè)文件塊。實(shí)現(xiàn)該約束條件,可以采用如下方法:如果文件塊對(duì)應(yīng)的文件偏移量是從文件起始位置計(jì)算的,則比較兩個(gè)文件塊結(jié)尾處的文件偏移量,保留結(jié)尾處文件偏移量較大的文件塊,刪除結(jié)尾處文件偏移量較小的文件塊,在刪除前將待刪除的文件塊中從其起始處到保留的文件塊的起始處(通過(guò)文件偏移量可以知道保留的文件塊的起始處在待刪除的文件塊中的位置)的數(shù)據(jù)加入保留的文件塊。對(duì)于特殊的文件塊,文件塊只用起始處和結(jié)尾處的文件偏移量表示,并不包含具體的數(shù)據(jù),則將保留的文件塊起始處的文件偏移量修改為刪除的文件塊起始處的文件偏移量即可。
還有一種情況,兩路數(shù)據(jù)指針指向的文件塊中的一個(gè)文件塊在文件中的范圍被另一個(gè)文件塊覆蓋。覆蓋指一個(gè)文件塊在在文件中的范圍被另一個(gè)文件塊完全包含,一個(gè)文件塊的所有數(shù)據(jù)另一個(gè)文件塊都有。此時(shí)可以直接將在文件中的范圍被另一個(gè)文件塊覆蓋的文件塊刪除,原指向被刪除文件塊的指針指向該路數(shù)據(jù)按照S101排序確定的下一個(gè)文件塊。
S103:重復(fù)S102直到遍歷完兩路數(shù)據(jù)的所有文件塊。
具體的,本步驟中,不斷重復(fù)步驟S102直到遍歷完兩路數(shù)據(jù)的所有文件塊,這樣兩路數(shù)據(jù)中的所有文件塊都執(zhí)行了步驟S102中相應(yīng)的操作,合并數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)了最終合并結(jié)果。
下面通過(guò)一個(gè)簡(jiǎn)單的理想化示例對(duì)兩路文件塊合并的方法進(jìn)行進(jìn)一步的說(shuō)明,該理想化示例如圖2所示,圖中內(nèi)置黑色三角形的箭頭表示指針。為了簡(jiǎn)單起見,假設(shè)第一路數(shù)據(jù)只有文件塊11、12、13三個(gè)文件塊,第二路數(shù)據(jù)只有文件塊21、22兩個(gè)文件塊。這些文件塊在文件中的范圍圖2中已經(jīng)畫出,不再使用具體的數(shù)值表示。假設(shè)文件塊對(duì)應(yīng)的文件偏移量是從文件起始位置計(jì)算的,兩路數(shù)據(jù)的文件塊按照文件偏移量從小到大的順序排序,第一路數(shù)據(jù)的排序結(jié)果為文件塊11、13、12,第二路數(shù)據(jù)的排序結(jié)果為文件塊22、21。每路數(shù)據(jù)中設(shè)置一個(gè)指針,初始時(shí)第一路數(shù)據(jù)的指針指向文件塊11,第二路數(shù)據(jù)的指針指向文件塊22。比較文件塊11和文件塊22在文件中的范圍,發(fā)現(xiàn)兩個(gè)文件塊不重疊,而文件塊11的文件偏移量最小,此時(shí)將文件塊11放入合并數(shù)據(jù)結(jié)構(gòu),第一路數(shù)據(jù)的指針指向文件塊13,第二路數(shù)據(jù)的指針仍指向文件塊22。文件塊11放入合并數(shù)據(jù)結(jié)構(gòu)后,其在第一路數(shù)據(jù)中的對(duì)應(yīng)數(shù)據(jù)被刪除。
比較文件塊13和文件塊22在文件中的范圍,發(fā)現(xiàn)兩個(gè)文件塊重疊,需要把文件塊13和文件塊22合并為新文件塊。具體的合并方法可以是刪除文件塊22,修改文件塊13加入文件塊22中與文件塊13不相同的數(shù)據(jù)形成新文件塊。新文件塊位于第一路數(shù)據(jù),其在文件中的范圍與文件塊12不重疊,符合要求。第一路數(shù)據(jù)的指針指向新文件塊,第二路數(shù)據(jù)的指針指向文件塊21。比較新文件塊和文件塊21,發(fā)現(xiàn)兩個(gè)文件塊不重疊,新文件塊的文件偏移量最小,則將新文件塊放入合并數(shù)據(jù)結(jié)構(gòu),第一路數(shù)據(jù)的指針指向文件塊12,第二路數(shù)據(jù)的指針仍指向文件塊21。新文件塊放入合并數(shù)據(jù)結(jié)構(gòu)后,其在第一路數(shù)據(jù)中的對(duì)應(yīng)數(shù)據(jù)被刪除。
比較文件塊12和文件塊21在文件中的范圍,發(fā)現(xiàn)文件塊21在文件中的范圍被文件塊12覆蓋,則直接刪除文件塊21。刪除文件塊21后,第二路數(shù)據(jù)的所有文件塊已經(jīng)遍歷完畢,此時(shí)第二路數(shù)據(jù)的指針可以視為指向了文件結(jié)尾。比較文件塊12和第二路數(shù)據(jù)指針的指向在文件中的范圍,顯然不重疊并且文件塊12的文件偏移量最小,則將文件塊12放入合并數(shù)據(jù)結(jié)構(gòu),刪除其在第一路數(shù)據(jù)中的對(duì)應(yīng)數(shù)據(jù)。此時(shí)第一路數(shù)據(jù)的所有文件塊也已經(jīng)遍歷完畢。
至此,兩路文件塊的合并完成,合并數(shù)據(jù)結(jié)構(gòu)中存儲(chǔ)了五個(gè)文件塊的最終合并結(jié)果,而原第一路數(shù)據(jù)和第二路數(shù)據(jù)的存儲(chǔ)空間也都被釋放出來(lái)。
按照以上方法,如果第一路數(shù)據(jù)中有M個(gè)文件塊,第二路數(shù)據(jù)中有N個(gè)文件塊,則算法的時(shí)間復(fù)雜度為O(M+N),這已經(jīng)是最優(yōu)的時(shí)間復(fù)雜度。
在兩路文件塊合并的方法的基礎(chǔ)上,可以實(shí)現(xiàn)多路文件塊合并的方法。多路文件塊合并的方法的流程如圖3所示,包括:
S301:將多路數(shù)據(jù)中的各路數(shù)據(jù)按照兩路文件塊合并的方法進(jìn)行兩兩合并,直到未進(jìn)行合并的數(shù)據(jù)路數(shù)不超過(guò)一;
S302:重復(fù)S301直到多路數(shù)據(jù)合并為一路數(shù)據(jù)。
多路文件塊合并的方法的本質(zhì),是基于兩路文件塊合并的方法進(jìn)行多輪次的兩兩合并,降低多路數(shù)據(jù)的路數(shù),最終合并為一路數(shù)據(jù)。
下面通過(guò)一個(gè)理想化的簡(jiǎn)單示例對(duì)多路文件塊合并的方法進(jìn)行說(shuō)明。假設(shè)一共5路數(shù)據(jù)進(jìn)行合并,各路數(shù)據(jù)直接標(biāo)記為1路、2路、3路、4路、5路。
第一輪兩兩合并,利用兩路文件塊合并的方法將1路和2路合并為新1路,3路和4路合并為新3路。由于總的數(shù)據(jù)路數(shù)是單數(shù),5路數(shù)據(jù)無(wú)法進(jìn)行合并,但已經(jīng)滿足未進(jìn)行合并的數(shù)據(jù)路數(shù)不超過(guò)1的條件,第一輪兩兩合并結(jié)束。
第二輪兩兩合并,利用兩路文件塊合并的方法將新3路和5路合并為貳新5路。由于總的數(shù)據(jù)路數(shù)是單數(shù),新1路數(shù)據(jù)無(wú)法進(jìn)行合并,但已經(jīng)滿足未進(jìn)行合并的數(shù)據(jù)路數(shù)不超過(guò)1的條件,第二輪兩兩合并結(jié)束。
第三輪兩兩合并,利用兩路文件塊合并的方法將新1路和貳新5路合并為一路數(shù)據(jù)。至此多路文件塊的合并結(jié)束。
本發(fā)明提供多路文件塊合并的方法的時(shí)間復(fù)雜度為O(N*logK),其中N為多路數(shù)據(jù)中文件塊的總個(gè)數(shù),K為總的數(shù)據(jù)路數(shù)。這也是較優(yōu)的時(shí)間復(fù)雜度。
本領(lǐng)域技術(shù)人員在以上所描述的具體技術(shù)方案的基礎(chǔ)上,完全可以構(gòu)造出其他方案,在此不一一列舉。