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