亚洲成年人黄色一级片,日本香港三级亚洲三级,黄色成人小视频,国产青草视频,国产一区二区久久精品,91在线免费公开视频,成年轻人网站色直接看

重復(fù)代碼片段查詢方法和裝置與流程

文檔序號:12801713閱讀:488來源:國知局
重復(fù)代碼片段查詢方法和裝置與流程
本發(fā)明涉及信息技術(shù),尤其涉及一種重復(fù)代碼片段查詢方法和裝置。
背景技術(shù)
:在軟件開發(fā)過程中,經(jīng)常會將工作量較大的軟件開發(fā)項目分割為工作量較小的子項目,并由不同的程序員分別對子項目編寫程序代碼。當兩個不同的子項目均需要用到同一個程序段時,往往會出現(xiàn)兩個不同的子項目中出現(xiàn)完全相同的程序代碼,在這種情況下,若需要對該程序段進行修改,則需要對各子項目中重復(fù)出現(xiàn)的全部該程序段均進行修改,工作量較大且容易出現(xiàn)錯誤。因此,在對子項目進行整合之后,需要對整合所獲得的項目進行優(yōu)化,具體來說,需要針對項目的程序代碼進行重復(fù)代碼片段的查詢,將查詢出的重復(fù)代碼片段進行復(fù)用或者說合并,從而提高可維護性。現(xiàn)有技術(shù)中在查詢重復(fù)代碼片段時,需要針對每一個代碼片段依次與其余代碼片段進行比較,從而判斷出是否存在重復(fù)代碼片段,由于這種方式需要將全部的代碼片段數(shù)據(jù)存儲在內(nèi)存中,因此運行開銷較大。技術(shù)實現(xiàn)要素:本發(fā)明提供一種重復(fù)代碼片段查詢方法和裝置,用于解決現(xiàn)有技術(shù)中查詢是否存在重復(fù)代碼片段時,運行開銷較大的技術(shù)問題。為達到上述目的,本發(fā)明的實施例采用如下技術(shù)方案:第一方面,提供了一種重復(fù)代碼片段查詢方法,包括:獲取包含多個代碼片段的代碼序列的各后綴;將各后綴所包含的代碼片段在所述代碼序列中的排序位置作為元素,構(gòu)造所述代碼序列的第一后綴數(shù)組;根據(jù)由所述第一后綴數(shù)組中的各元素所得到的后綴,計算各后綴之間的公共部分;利用所述公共部分,查詢所述多個代碼片段中的重復(fù)代碼片段。第二方面,提供了一種重復(fù)代碼片段查詢裝置,包括:后綴模塊,用于獲取包含多個代碼片段的代碼序列的各后綴;構(gòu)造模塊,用于將各后綴所包含的代碼片段在所述代碼序列中的排序位置作為元素,構(gòu)造所述代碼序列的第一后綴數(shù)組;計算模塊,用于根據(jù)由所述第一后綴數(shù)組中的各元素所得到的后綴,計算各后綴之間的公共部分;查詢模塊,用于利用所述公共部分,查詢所述多個代碼片段中的重復(fù)代碼片段。本發(fā)明實施例提供的重復(fù)代碼片段查詢方法和裝置,通過對多個代碼片段所構(gòu)成的代碼序列確定各后綴之后,將各后綴所包含的代碼片段在代碼序列中的排序位置作為元素,構(gòu)造代碼序列的后綴數(shù)組,從而根據(jù)由后綴數(shù)組中的各元素所計算出的各后綴之間的公共部分,查詢所述多個代碼片段中的重復(fù)代碼片段。由于所構(gòu)造的后綴數(shù)組中存儲的僅為一個指示后綴中代碼片段所在排序位置的數(shù)值,而不是將后綴中代碼片段的內(nèi)容存儲在后綴數(shù)組中,因此,也就不必將全部的代碼片段內(nèi)容存儲在內(nèi)存中,從而運行的開銷較小,解決了現(xiàn)有技術(shù)中查詢是否存在重復(fù)代碼片段時,運行開銷較大的技術(shù)問題。上述說明僅是本發(fā)明技術(shù)方案的概述,為了能夠更清楚了解本發(fā)明的技術(shù)手段,而可依照說明書的內(nèi)容予以實施,并且為了讓本發(fā)明的上述和其它目的、特征和優(yōu)點能夠更明顯易懂,以下特舉本發(fā)明的具體實施方式。附圖說明通過閱讀下文優(yōu)選實施方式的詳細描述,各種其他的優(yōu)點和益處對于本領(lǐng)域普通技術(shù)人員將變得清楚明了。附圖僅用于示出優(yōu)選實施方式的目的,而并不認為是對本發(fā)明的限制。而且在整個附圖中,用相同的參考符號表示相同的部件。在附圖中:圖1為本發(fā)明實施例一提供的一種重復(fù)代碼片段查詢方法的流程示意圖;圖2為重復(fù)代碼片段查詢方法的執(zhí)行示意圖;圖3為本發(fā)明實施例二提供的一種重復(fù)代碼片段查詢方法的流程示意圖;圖4為逐個源文件進行處理的流程示意圖;圖5為逐行對源文件的代碼進行處理的流程示意圖;圖6為高度數(shù)組的計算示意圖;圖7為本發(fā)明實施例三提供的一種重復(fù)代碼片段查詢裝置的結(jié)構(gòu)示意圖;圖8為本發(fā)明實施例四提供的一種重復(fù)代碼片段查詢裝置的結(jié)構(gòu)示意圖。具體實施方式下面將參照附圖更詳細地描述本公開的示例性實施例。雖然附圖中顯示了本公開的示例性實施例,然而應(yīng)當理解,可以以各種形式實現(xiàn)本公開而不應(yīng)被這里闡述的實施例所限制。相反,提供這些實施例是為了能夠更透徹地理解本公開,并且能夠?qū)⒈竟_的范圍完整的傳達給本領(lǐng)域的技術(shù)人員。為了便于理解本發(fā)明所提供的重復(fù)代碼片段查詢方法和裝置,在描述具體實施例之前,對實施例中所涉及的技術(shù)術(shù)語進行解釋:序列(sequence):元素的有序排列。在本發(fā)明實施例中,將代碼片段作為元素,對這些代碼片段進行有序排列所獲得的序列稱為代碼序列。后綴(suffix):后綴是指從某一個位置i開始到整個序列結(jié)尾的一個子序列,也叫子串或余串,記做suffix(i)。后綴數(shù)組:后綴數(shù)組是一個一維數(shù)組,它用于記錄后綴的有序排列。在本發(fā)明實施例中,第一后綴數(shù)組中的元素為后綴中所包含的代碼片段在代碼序列中的排序位置,第二后綴數(shù)組中的元素為后綴的內(nèi)容。名次數(shù)組:名次數(shù)組rank[i]保存的是suffix(i)在所有后綴中從小到大排列的“名次”。高度數(shù)組:定義高度數(shù)組中的元素height[i]=suffix(sa[i-1])和suffix(sa[i])的最長公共前綴,也就是排名相鄰的兩個后綴的最長公共前綴。那么對于j和k,不妨設(shè)rank[j]<rank[k],則有以下性質(zhì):suffix(j)和suffix(k)的最長公共前綴為height[rank[j]+1],height[rank[j]+2],height[rank[j]+3],…,height[rank[k]]中的最小值。最長公共前綴:最長公共前綴是指從兩個后綴的第一個元素開始,所能夠獲得的兩后綴之間具有的最長相同部分,這里的最長相同部分也稱為公共部分,這個最長相同部分所包含的元素數(shù)稱為最長公共前綴的長度。例如兩個后綴分別為“accs”和“acbsa”則兩個后綴的最長公共前綴為“ac”,長度為2。停用詞:可以明確表示整行為非有效代碼的詞,如“#include”,“import”。根據(jù)語言的不同,停用詞會各不相同。此處簡要解釋了技術(shù)術(shù)語的含義,以上技術(shù)術(shù)語會在后續(xù)結(jié)合具體實施例進行進一步地解釋。下面結(jié)合附圖對本發(fā)明實施例提供的重復(fù)代碼片段查詢方法和裝置進行詳細描述。實施例一在程序開發(fā)過程中,程序員從網(wǎng)絡(luò)或者其他位置復(fù)制了同一段代碼并將其粘貼到當前所開發(fā)的程序中的不同位置時,便會在多個源文件中的不同位置中出現(xiàn)重復(fù)代碼片段。由于重復(fù)代碼片段極易導(dǎo)致程序的維護性差,因此,作為程序質(zhì)量評價的指標之一,需要對源文件中各代碼片段所構(gòu)成的代碼序列中是否存在重復(fù)代碼片段進行查詢。作為一種可能的實現(xiàn)方式,本實施例所提供的方法可以由代碼質(zhì)量評價工具執(zhí)行。圖1為本發(fā)明實施例一提供的一種重復(fù)代碼片段查詢方法的流程示意圖,如圖1所示,方法包括:步驟101、獲取包含多個代碼片段的代碼序列的各后綴。其中,源文件中的代碼被預(yù)先劃分為各個代碼片段,每一個代碼片段包括預(yù)設(shè)行的程序代碼,這里的預(yù)設(shè)行數(shù)可以根據(jù)查詢精度進行確定,若需要較高的查詢精度,可以設(shè)置較低的預(yù)設(shè)行數(shù),若需要較低的查詢精度,可以設(shè)置較高的預(yù)設(shè)行數(shù),但預(yù)設(shè)行數(shù)的取值至少為一。在不同次的查詢中,各次查詢所劃分的代碼片段之間可以具有相同的行數(shù),也可以具有不同的行數(shù)。為了便于代碼片段的劃分,每一次查詢中,各代碼片段之間可以具有相同的行數(shù)。作為一種可能的實現(xiàn)方式,根據(jù)各個代碼片段在源文件中所在行的前后位置,按照預(yù)設(shè)順序,例如由前至后的順序或者由后至前的順序,對代碼片段進行排序,獲得代碼序列,在代碼序列中,每一個元素對應(yīng)源文件中的一個代碼片段。進而,將代碼序列中每一個代碼片段依次作為起始元素,選取從該起始元素到代碼序列中的最后一個元素為止的一段子序列,作為該代碼片段所對應(yīng)的后綴,也就是后綴的總個數(shù)與代碼序列中元素的個數(shù)相同。步驟102、將各后綴所包含的代碼片段在代碼序列中的排序位置作為元素,構(gòu)造代碼序列的第一后綴數(shù)組。具體的,對代碼序列的各后綴按照字典序進行排序,按照各后綴的排序,將各后綴中的代碼片段在代碼序列中的排序位置依次作為第一后綴數(shù)組中對應(yīng)元素的取值。由于第一后綴數(shù)組中存儲的僅為一個指示后綴中代碼片段所在排序位置的數(shù)值,而不是將后綴中代碼片段的內(nèi)容存儲在后綴數(shù)組中,因此,也就不必將全部的代碼片段內(nèi)容存儲在內(nèi)存中,從而運行的開銷較小,解決了現(xiàn)有技術(shù)中查詢源文件中是否存在重復(fù)代碼片段時,運行開銷較大的技術(shù)問題。步驟103、根據(jù)由所述第一后綴數(shù)組中的各元素所得到的后綴,計算各后綴之間的公共部分。具體的,首先,從代碼序列中,讀取第一后綴數(shù)組中元素所指示的排序位置得到后綴,根據(jù)得到的后綴所對應(yīng)代入得到的第二后綴數(shù)組,計算得到代碼序列的高度數(shù)組,其中高度數(shù)組中的元素用于指示各后綴之間的最長公共前綴。具體來說,從代碼序列中,讀取到第一后綴數(shù)組中元素所指示的排序位置得到后綴之后,將得到的后綴對應(yīng)記錄到第一后綴數(shù)組中從而代入第一后綴數(shù)組得到第二后綴數(shù)組。根據(jù)第二后綴數(shù)組構(gòu)造出名次數(shù)組,該名次數(shù)組和第二后綴數(shù)組為對偶關(guān)系。進而采用倍增算法對第二后綴數(shù)組和名次數(shù)組進行計算,獲得高度數(shù)組。高度數(shù)組中的元素為第二后綴數(shù)組中所指示的相鄰兩后綴的最長公共前綴的長度,這里的最長公共前綴便是相鄰兩后綴的公共部分,且該公共部分出現(xiàn)的位置為兩后綴的起始位置。這里提及的最長公共前綴的長度便是相鄰兩后綴的公共部分中所包含的代碼片段的個數(shù)。由于第一后綴數(shù)組中的元素僅為指示后綴中代碼片段在代碼序列中所在位置的數(shù)值,而不是將后綴中代碼片段的內(nèi)容存儲在第一后綴數(shù)組中,因此,在計算高度數(shù)組時,若需要讀取后綴中代碼片段的內(nèi)容可根據(jù)第一后綴數(shù)組中的元素,從磁盤或者非內(nèi)存的存儲位置讀取代碼序列中對應(yīng)的排序位置。由于在計算高度數(shù)組時不是對全部的后綴均進行讀取,而是僅對需要計算重復(fù)部分的后綴進行讀取,并且在計算出公共部分后還可以釋放所讀取的后綴,因此,節(jié)省了內(nèi)存空間。步驟104、利用公共部分,查詢多個代碼片段中的重復(fù)代碼片段。具體的,在上一步驟中所計算出的高度數(shù)組中,每一個高度數(shù)組元素對應(yīng)指示第一后綴數(shù)組中相鄰的兩個元素指示的后綴的公共部分,高度數(shù)組元素的具體取值指示了公共部分中所包含的代碼片段的個數(shù)。因此,在查詢重復(fù)代碼片段時,若高度數(shù)組中存在非零元素,則說明至少兩個后綴之間存在公共部分,據(jù)此可以判定存在重復(fù)代碼片段。進而還可以根據(jù)高度數(shù)組中的非零元素的取值,確定該非零元素所指示的公共部分在兩個后綴中的相對位置,以及公共部分所包含的代碼片段的個數(shù)。具體的,當高度數(shù)組中的非零元素的取值為q時,q為自然數(shù),相對位置即為從后綴的首個代碼片段開始的q個代碼片段。例如:非零元素的取值為3,則相對位置為后綴的第一個代碼片段至第三個代碼片段。通過結(jié)合第一后綴數(shù)組中對應(yīng)的這兩個后綴的元素的取值,可以確定兩個后綴在代碼序列中的排序位置。最終,根據(jù)兩個后綴在代碼序列中的排序位置,和公共部分在兩個后綴中的相對位置,確定該公共部分對應(yīng)的重復(fù)代碼片段在所述代碼序列中的位置。需要說明的是,這里的需要計算是否存在公共部分的兩個后綴可以是相鄰的,也可以是不相鄰的。若為相鄰的情況,則僅需查看高度數(shù)組中的對應(yīng)的一個元素的取值,該元素的取值即為相鄰兩個后綴之間的公共部分所具有的代碼片段的個數(shù)。若為不相鄰的情況,則需要查看后綴之間任兩相鄰的后綴對應(yīng)的高度數(shù)組中的元素取值,從中選擇最小值,將其作為不相鄰的這兩個后綴之間的公共部分所具有的代碼片段的個數(shù),公共部分的相對位置為從首個代碼片段開始的符合該個數(shù)的代碼片段。進一步,還可以對查詢出的重復(fù)代碼片段進行修正,這是由于盡管已查詢出了重復(fù)代碼片段,但由于本實施例中該重復(fù)代碼片段是用于進行代碼質(zhì)量評價的,一般來說同一源文件中的重復(fù)代碼片段是有其特殊意義的,從而若在同一源文件中的兩個不同位置出現(xiàn)了重復(fù)代碼片段,則進行忽略,不計入代碼質(zhì)量評價結(jié)果中。本實施例所提供的方法,如圖2所示,通過對多個代碼片段所構(gòu)成的代碼序列確定各后綴之后,將各后綴所包含的代碼片段在代碼序列中的排序位置作為元素,構(gòu)造代碼序列的后綴數(shù)組,從而根據(jù)由后綴數(shù)組中的各元素所計算出的各后綴之間的公共部分,查詢所述多個代碼片段中的重復(fù)代碼片段。由于所構(gòu)造的后綴數(shù)組中存儲的僅為一個指示后綴中代碼片段所在排序位置的數(shù)值,而不是將后綴中代碼片段的內(nèi)容存儲在后綴數(shù)組中,因此,也就不必將全部的代碼片段內(nèi)容存儲在內(nèi)存中,從而運行的開銷較小,解決了現(xiàn)有技術(shù)中查詢是否存在重復(fù)代碼片段時,運行開銷較大的技術(shù)問題。實施例二為了清楚說明上一實施例,本實施例提供了一種重復(fù)代碼片段查詢方法的具體執(zhí)行流程,用于實現(xiàn)高精度查詢,本實施例中所提及的后綴數(shù)組sa對應(yīng)第一后綴數(shù)組,本實施例中所提及的后綴數(shù)組sa’對應(yīng)第二后綴數(shù)組。圖3為本發(fā)明實施例二提供的一種重復(fù)代碼片段查詢方法的流程示意圖,一般情況下,一個項目由于內(nèi)容較多,該項目的代碼通常分別由多個源文件進行存儲,在這一應(yīng)用場景下,本實施例中,為了提高查詢精度,將一行代碼作為一個代碼片段進行重復(fù)代碼片段查詢,如圖3所示,包括:步驟201、對各個源文件中的代碼進行預(yù)處理。具體的,預(yù)處理過程可以依據(jù)預(yù)設(shè)規(guī)則進行,預(yù)設(shè)規(guī)則包括三個子規(guī)則:a、針對每一行代碼,刪除以停用詞為開頭的代碼所在行。b、針對每一行代碼,刪除預(yù)設(shè)字符;預(yù)設(shè)字符包括空格和制表符。c、在每一源文件的結(jié)尾增加源文件對應(yīng)的分隔行,分隔行為該源文件的唯一標識或該文件的存儲路徑。設(shè)置子規(guī)則a是由于:停用詞為開頭的代碼一般用于進行標記和解釋,該代碼沒有實際意義,因此在子規(guī)則a中刪除以停用詞為開頭的代碼所在行。設(shè)置子規(guī)則b是由于:空格和制表符不僅沒有實際意義,同時空格的數(shù)量和制表符的位置還容易對代碼是否重復(fù)的判斷造成干擾,為了提高重復(fù)代碼片段查詢的準確度,在子規(guī)則b中將這些容易造成干擾的預(yù)設(shè)字符去除。設(shè)置子規(guī)則c是由于:由于不同源文件作為相對獨立的代碼,因此,這里所說的重復(fù)代碼片段不能跨文件,也就是說重復(fù)代碼片段中的各行代碼均應(yīng)當在同一個源文件中。若一個源文件的結(jié)尾部分代碼和下一個源文件的開頭部分代碼構(gòu)成一個代碼片段,該代碼片段即使與第三個源文件中部分代碼重復(fù),這里不將其認作重復(fù)代碼片段。為了避免將其認作重復(fù)代碼片段的情況出現(xiàn),子規(guī)則c中在兩源文件之間插入不重復(fù)的特殊行,即分隔行,從而進一步提高了重復(fù)代碼片段查詢的準確性。步驟202、將預(yù)處理所獲得的每一行代碼作為一個元素,生成代碼序列sequence。具體的,將全部源文件中的代碼進行排序,獲得代碼序列。還可以生成一個待處理串文件,用于記錄代碼序列中每一個元素對應(yīng)的源文件、行號和行內(nèi)容,其中,行內(nèi)容便是代碼序列中的元素的取值,行號對應(yīng)該元素對應(yīng)的代碼在源文件中所在行。從而可以在代碼序列中查詢到重復(fù)代碼時,反查重復(fù)代碼在源文件中的位置。為了清楚說明具體執(zhí)行過程,本實施例提供了步驟201和202具體的執(zhí)行流程說明,圖4為逐個源文件進行處理的流程示意圖,如圖4所示,當確定存在下一個待處理源文件時,在當前源文件結(jié)尾插入對應(yīng)的分隔行,進而逐行對當前源文件的代碼進行處理,并將處理結(jié)果記錄到待處理串文件中。具體針對每一行代碼的處理過程參考圖5,圖5為逐行對源文件的代碼進行處理的流程示意圖,如圖5所示,首先判斷當前行的代碼是否以停用詞開頭,若是,則不再對該行進行處理,反之則進行清除空格和制表符的處理,并在清楚之后判斷處理后的當前行的代碼是否為空字符串,若否,則將當前行的代碼的內(nèi)容記錄到待處理串文件中,并在待處理串文件中所記錄的當前行的對應(yīng)位置添加文件名和當前行的行號等信息。從而待處理串文件中的每一條記錄應(yīng)當至少包含有行號、行內(nèi)容和文件名。進而針對所最終獲得的待處理串文件中的行內(nèi)容按照行號和文件名排列,獲得代碼序列sequence。步驟203、構(gòu)建代碼序列sequence的后綴數(shù)組sa。代碼序列sequence的后綴suffix包括了至少一行代碼,具體來說包含了從sequence中的某一個元素開始到最后一個元素。按照預(yù)設(shè)字典序,將sequence的各個后綴按照字典序進行排序之后,確定每一個排好序的后綴中的代碼在sequence中的起始排序位置,并將排序位置作為后綴數(shù)組sa中的元素記錄到后綴數(shù)組sa中。例如:針對如下代碼序列sequence構(gòu)建后綴數(shù)組sa,其中,下表第一列為元素在sequence中的排序,下表第二列為元素在sequence中的取值。表1sequence示意表為了便于描述,將sequence中的每一個元素記為一個字母:a=“a(ind)=b(ind);”b=“b(ind)=tmp;”獲得如下代碼序列sequence{a,a,b,a,a,a,a,b}。代碼序列sequence的各后綴及其對應(yīng)的起始行號分別為:1a,a,b,a,a,a,a,b2a,b,a,a,a,a,b3b,a,a,a,a,b4a,a,a,a,b5a,a,a,b6a,a,b7a,b8b表2sequence的各后綴及其對應(yīng)的起始行號按照字典序,對表2中各后綴進行排序,并根據(jù)后綴的排序?qū)Ρ?按照行進行重排,具體來說,排序越靠前的后綴,在下表中該后綴所在行也靠前。需要說明的是,字典序中規(guī)定了字符之間的相互順序,這里的字符包括字母、符號和數(shù)字等,例如:根據(jù)ascii(americanstandardcodeforinformationinterchange,美國標準信息交換代碼)中,各字符的二進制編碼的順序作為字符之間的相互順序。表3重排后的sequence的各后綴表3中的第一列便是后綴數(shù)組sa中的元素的取值,第一列中行號的排列順序便是后綴數(shù)組sa中的元素的排序,所構(gòu)造出的后綴數(shù)組sa={4,5,6,1,7,2,8,3}。步驟204、根據(jù)后綴數(shù)組sa計算高度數(shù)組ha。從代碼序列sequence中,讀取后綴數(shù)組sa中元素所指示的排序位置得到后綴,根據(jù)得到的后綴所對應(yīng)代入的后綴數(shù)組sa’,計算得到高度數(shù)組ha,高度數(shù)組ha中的元素用于指示后綴數(shù)組sa’中對應(yīng)的相鄰兩個后綴的最長公共前綴(longestcommonprefix)。對兩個后綴u和v從首個字符開始順次比較u和v的對應(yīng)字符是否相同,若相同則繼續(xù)比較直到確定出對應(yīng)字符持續(xù)相等的最終位置,將首個字符至這個最終位置稱為這兩個后綴的最長公共前綴。若首個字符便為不同字符,則兩個后綴的最長公共前綴為0。圖6為高度數(shù)組的計算示意圖,如圖6所示,橫線上方為代碼序列,橫線下方為該代碼序列的各后綴,各后綴的排序是按照所對應(yīng)的后綴數(shù)組sa’中各元素順序進行排列的。左側(cè)為相鄰兩個后綴的最長公共前綴的長度,也就是高度數(shù)組ha中各元素的取值。例如:第一行后綴{a,a,a,a,b}第二行后綴{a,a,a,b}的最長公共前綴為{a,a,a},包含有3個元素,從而最長公共前綴的長度為3。又例如:第六行后綴{a,b,a,a,a,a,b}第二行后綴的最長公共前綴為空集,包含0有個元素,從而最長公共前綴的長度為0。相似的對其余相鄰后綴計算最長公共前綴的長度,得到ha={3,2,3,1,2,0,1}。步驟205、根據(jù)高度數(shù)組ha映射回代碼序列確定是否存在重復(fù)代碼片段。已知ha={3,2,3,1,2,0,1},sa={4,5,6,1,7,2,8,3}。以ha[1]舉例,ha[1]表示sa[1]與sa[2]指示的排序位置對應(yīng)的后綴具有最長公共前綴,最長公共前綴長度3。sa[1]=4,sa[2]=5,即表示從代碼序列中第4個元素開始的后綴和從代碼序列中第5個元素這個位置開始的后綴具有長度為3的重復(fù)行。就是說代碼序列中的兩個范圍,即第4個元素至第6個元素,以及第5個元素至第7個元素,具有重復(fù)代碼,可以記為[4,6]=[5,7]。根據(jù)高度數(shù)組不僅可以計算相鄰兩后綴之間的最長公共前綴,還可以計算任兩后綴之間的最長公共前綴,比如sa[2]與sa[6],則根據(jù)高度數(shù)組ha確定sa[2]至sa[6]中相鄰兩后綴之間的最長公共前綴的長度依次為2,3,1和2,從中取最小值1作為sa[2]與sa[6]的最長公共前綴的長度,即代碼序列中第2個元素和第6個元素重復(fù)[2]=[6]。同理,可以得到更多的具有重復(fù)行的組合,例如:sa[2],sa[3]有長度2的重復(fù)[5,6]=[6,7];sa[3],sa[4]有長度3的重復(fù)[6,8]=[1,3];......sa[7],sa[8]有長度1的重復(fù)[8,8]=[3,3]。其中,有一些具有重復(fù)的范圍是重疊的,如[4,6]=[5,7],其中第5至6個元素是重疊的,可以拋棄掉。剩下的都是有效的重復(fù)元素。例如:[6,8]=[1,3]所指示的代碼序列的第6至8個元素中的代碼片段與第1至3個元素中的代碼片段重復(fù)。步驟206、根據(jù)重復(fù)代碼片段在代碼序列中的排序位置,確定重復(fù)代碼片段在源文件中的位置。具體的,在確定代碼序列中存在重復(fù)代碼片段之后,可以根據(jù)待處理串文件,確定代碼序列中的該重復(fù)代碼片段在源文件中的位置,包括源文件的文件名和行號。實施例三圖7為本發(fā)明實施例三提供的一種重復(fù)代碼片段查詢裝置的結(jié)構(gòu)示意圖,如圖7所示,包括:計算模塊31、后綴模塊32、構(gòu)造模塊33和查詢模塊35。后綴模塊32,用于獲取包含多個代碼片段的代碼序列的各后綴。構(gòu)造模塊33,用于將各后綴所包含的代碼片段在所述代碼序列中的排序位置作為元素,構(gòu)造所述代碼序列的第一后綴數(shù)組。計算模塊31,用于根據(jù)由所述第一后綴數(shù)組中的各元素所得到的后綴,計算各后綴之間的公共部分。查詢模塊35,用于利用公共部分,查詢多個代碼片段中的重復(fù)代碼片段。實施例四圖8為本發(fā)明實施例四提供的一種重復(fù)代碼片段查詢裝置的結(jié)構(gòu)示意圖,在圖7的基礎(chǔ)上,計算模塊31進一步包括:讀取單元311和計算單元312。讀取單元311,用于從所述代碼序列中,讀取第一后綴數(shù)組中元素所指示的排序位置得到后綴。計算單元312,用于根據(jù)得到的后綴對應(yīng)代入第一后綴數(shù)組所得到的第二后綴數(shù)組,計算得到各后綴之間的最長公共前綴。查詢模塊35進一步包括:判定單元351、位置單元353和確定單元354。判定單元351,用于當至少兩個后綴之間存在公共部分時,確定所述多個代碼片段中存在重復(fù)代碼片段。位置單元353,用于根據(jù)兩個后綴所具有的公共部分在后綴中的相對位置,以及根據(jù)所述后綴所包含的代碼片段在所述代碼序列中的排序位置,確定所述公共部分對應(yīng)的重復(fù)代碼片段在所述代碼序列中的排序位置。確定單元354,用于根據(jù)最長公共前綴的長度,確定所述公共部分在所述兩個后綴中的相對位置。還用于根據(jù)所述后綴數(shù)組中對應(yīng)所述兩個后綴的元素的取值,確定所述兩個后綴所包含的代碼片段在所述代碼序列中的排序位置。進一步,代碼序列是根據(jù)各代碼片段在源文件中的位置,對各代碼片段進行排序得到的,基于此,重復(fù)代碼片段查詢裝置還包括:定位模塊34。定位模塊34,用于根據(jù)所述重復(fù)代碼片段在所述代碼序列中的排序位置,確定所述重復(fù)代碼片段在所述源文件中的位置。進一步,構(gòu)造模塊33,包括:排序單元331和取值單元332。排序單元331,用于對所述代碼序列的各后綴按照字典序進行排序。取值單元332,用于將排序后的各后綴所包含的第一個代碼片段在所述代碼序列中的排序位置作為所述后綴數(shù)組中對應(yīng)元素的取值。進一步,該裝置還包括:預(yù)處理模塊36。預(yù)處理模塊36,用于根據(jù)預(yù)設(shè)規(guī)則對代碼片段中的各行代碼進行預(yù)處理。具體的,預(yù)設(shè)規(guī)則包括:針對每一行代碼,刪除以停用詞為開頭的代碼所在行;和/或,針對每一行代碼,刪除預(yù)設(shè)字符;和/或,若所述代碼片段分別屬于至少兩個源文件,在每一個源文件的結(jié)尾增加所述源文件對應(yīng)的分隔行。其中,分隔行包括所述源文件的唯一標識和/或所述文件的存儲路徑;所述預(yù)設(shè)字符包括空格和/或制表符。本領(lǐng)域普通技術(shù)人員可以理解:實現(xiàn)上述各方法實施例的全部或部分步驟可以通過程序指令相關(guān)的硬件來完成。前述的程序可以存儲于一計算機可讀取存儲介質(zhì)中。該程序在執(zhí)行時,執(zhí)行包括上述各方法實施例的步驟;而前述的存儲介質(zhì)包括:rom、ram、磁碟或者光盤等各種可以存儲程序代碼的介質(zhì)。最后應(yīng)說明的是:以上各實施例僅用以說明本發(fā)明的技術(shù)方案,而非對其限制;盡管參照前述各實施例對本發(fā)明進行了詳細的說明,本領(lǐng)域的普通技術(shù)人員應(yīng)當理解:其依然可以對前述各實施例所記載的技術(shù)方案進行修改,或者對其中部分或者全部技術(shù)特征進行等同替換;而這些修改或者替換,并不使相應(yīng)技術(shù)方案的本質(zhì)脫離本發(fā)明各實施例技術(shù)方案的范圍。當前第1頁12
當前第1頁1 2 
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1