




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
2/6數(shù)據(jù)結(jié)構(gòu)上機(jī)報告——找出最長公共子串?實(shí)驗(yàn)描述:給定串T=t1t2……tn,則串,(即T中順序、連續(xù)的一部分)稱為串T的子串。例如“sing”、“ua”和“Tsinghua”都是字符串“Tsinghua”的子串,而“Thu”和“xyz”不是。若串同時是多個串的子串,則稱為的公共子串。結(jié)合課上所學(xué)的算法設(shè)計思想,設(shè)計算法,對于給定的兩個字符串,找出長度最長的公共子串。?算法描述:按照題目要求,需要找出兩個字符串的最大公共字串。我設(shè)計的算法為用一個矩陣(intIs_equal[][])來記錄兩個字符串的所有字符之間的匹配情況,如果不匹配則即為0,否則不為0,而這里的計數(shù)規(guī)則下面將繼續(xù)進(jìn)行說明。從上面的敘述中可以知道,當(dāng)用矩陣來記錄兩個字符串的匹配情況時,如果出現(xiàn)匹配字串,那么在矩陣中一定是在對角線的位置,而最長的對角線即對應(yīng)最長的字符字串。在構(gòu)造矩陣的時候,如果出現(xiàn)字符匹配那么就按照語句Is_equal[i][j]=Is_equal[i-1][j-1]+1給矩陣元素賦值,即匹配位置的元素的大小為其左上角元素加1。用一個變量max_len來記錄最長字串的長度,另一個變量flag_x記錄最長字串中的最后一個字符在字符串1中的位置。這樣,在構(gòu)造完矩陣之后也就找到了最長的字串。?復(fù)雜度分析:由上面算法描述中的分析可以知道,該算法的時間復(fù)雜度即為構(gòu)造矩陣的時間復(fù)雜度,兩重循環(huán),總時間復(fù)雜度為。其實(shí)在些這個代碼的過程中我最開始并未采用上述算法,我在構(gòu)建矩陣的時候是按照出現(xiàn)匹配則賦值為1,否則賦值為0。這樣得到的最終矩陣中0的位置是不匹配的位置,1的位置則是匹配的位置。但是構(gòu)造完矩陣之后并不能立刻得到最長字串,這是還需再次遍歷矩陣尋找最長的對角線。這時時間復(fù)雜度出了構(gòu)造矩陣之外還有遍歷矩陣所花銷的時間,為上面復(fù)雜度的兩倍,即。后面進(jìn)過改進(jìn)后,發(fā)現(xiàn)其實(shí)只需要在構(gòu)造矩陣的時候增加兩個記錄變量,記錄所找到的最長字串的位置,那么在構(gòu)造完矩陣之后就可以得到最長字串。?實(shí)驗(yàn)中遇到的問題:這次實(shí)驗(yàn)相對來說比較容易,思路來得也比較快。在實(shí)驗(yàn)過程中主要遇到的問題就是在給矩陣賦值的時候開始沒有考慮到要單獨(dú)將i=0或j=0的元素拿出來單獨(dú)討論,以致出現(xiàn)數(shù)組越界的情況,后來發(fā)現(xiàn)之后及時解決了問題。其他的基本沒有遇到太詭異的情況了。核心代碼:if(str1[i]==str2[j]) { if(j==0||i==0)//為避免出現(xiàn)Is_equal[-1][j]或Is_equal[i][-1]或Is_equal[-1][-1]的情況發(fā)生,邊界處的元素單獨(dú)討論 { Is_equal[i][j]=1; if(Is_equal[i][j]>max_len) { max_len=Is_equal[i][j];//如果當(dāng)前的字串長度大于已經(jīng)找到的字串長度,更新字串長度 flag_x=i;//更新當(dāng)前最長字串最后一個元素在str1中的位置 } } else { Is_equal[i][j]=Is_equal[i-1][j-1]+1;//出現(xiàn)匹配時,該處的元素的值等于左上角元素值加 if(Is_equal[i][j]>max_len) { max_len=Is_equal[i][j]; flag_x=i; } } } else Is_equal[i][j]=0;//源代碼//LCS.h#include<iostream>#include<string>usingnamespacestd;voidLCS(char*str1,char*str2,intstr1_len,intstr2_len,ofstream&outfile){ int**Is_equal;//記錄串和串的匹配情況的矩陣 Is_equal=newint*[str1_len]; for(inti=0;i<str1_len;i++) { Is_equal[i]=newint[str2_len]; } intflag_x=0;//記錄所發(fā)現(xiàn)的最長斜線的的最后一個元素的橫坐標(biāo); intmax_len=0;//記錄最長公共字符串的長度 for(inti=0;i<str1_len;i++) { for(intj=0;j<str2_len;j++) { if(str1[i]==str2[j]) { if(j==0||i==0)//為避免出現(xiàn)Is_equal[-1][j]或Is_equal[i][-1]或Is_equal[-1][-1]的情況發(fā)生,邊界處的元素單獨(dú)討論 { Is_equal[i][j]=1; if(Is_equal[i][j]>max_len) { max_len=Is_equal[i][j];//如果當(dāng)前的字串長度大于已經(jīng)找到的字串長度,更新字串長度 flag_x=i;//更新當(dāng)前最長字串最后一個元素在str1中的位置 } } else { Is_equal[i][j]=Is_equal[i-1][j-1]+1;//出現(xiàn)匹配時,該處的元素的值等于左上角元素值加 if(Is_equal[i][j]>max_len) { max_len=Is_equal[i][j]; flag_x=i; } } } else Is_equal[i][j]=0; } } if(max_len==0) { cout<<"0\n"; outfile<<"0\n"; } else { outfile<<max_len<<endl; cout<<max_len<<endl; for(intk=flag_x-max_len+1;k<=flag_x;k++) { cout<<str1[k]; outfile<<str1[k]; } cout<<endl; outfile<<endl; }}//Readinfile.h#include<iostream>#include<fstream>#include<string>usingnamespacestd;voidReadinfile(ifstream&infile,char*str1,char*str2){ //讀入字符串 intcount=0; str1[count]=infile.get(); while(str1[count]!='\n') { count++; str1[count]=infile.get(); } count++; str1[count]='\n';//標(biāo)記字符串末尾 //讀入字符串 count=0; str2[count]=infile.get(); while(str2[count]!=EOF) { count++; str2[count]=infile.get(); } count++; str2[count]='\n';//標(biāo)記字符串末尾}//main.cpp#include<iostream>#include<string>#include<fstream>#include"Readinfile.h"#include"LCS.h"usingnamespacestd;intmain(intargc,char*argv[]){ if(argc!=3) { cout<<"Usage:*.exe<input.txt><output.txt>"<<endl; return0; } ifstreaminfile(argv[1],ios_base::in);//infile為輸入流文件對象 if(!infile.is_open()) { cout<<"openinfilefail!"<<endl; return0; } ofstreamoutfile(argv[2],ios_base::out);//outfile為輸出流文件對象 if(!outfile.is_open()) { cout<<"openoutfilefail!"<<endl; return0; } charstr1[4000],str2[4000];//字符串長度短于 intstr1_len=0,str2_len=0;//分別記錄兩個字符串的長度 Readinfile(i
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 階段性復(fù)習(xí)2024年特許金融分析師考試試題及答案
- 績效管理中的關(guān)鍵績效指標(biāo)試題及答案
- 護(hù)理健康教育質(zhì)控標(biāo)準(zhǔn)解讀
- 齒輪鏈條年終總結(jié)
- 英語 第四冊(五年制高職)2課件 Unit2 From Ideas to Products
- 山西省晉中市太谷區(qū)職業(yè)中學(xué)校2024-2025學(xué)年高一上學(xué)期期末考試地理試題(解析版)
- 食管癌患者放化療護(hù)理
- 高效復(fù)習(xí)2024年CFA考試試題及答案
- 投資風(fēng)險控制與管理試題及答案
- 高中生語文知識競賽
- 湖南省長沙市2024-2025學(xué)年九年級下學(xué)期入學(xué)考試英語試卷(含答案無聽力原文及音頻)
- 2025年國家會展中心上海有限責(zé)任公司招聘筆試參考題庫含答案解析
- 《卓越領(lǐng)導(dǎo)力》課件
- 2024國家電投集團(tuán)中國電力招聘(22人)筆試參考題庫附帶答案詳解
- 《餐廳案例》課件
- 《大數(shù)據(jù)時代對會計行業(yè)產(chǎn)生的影響探究》10000字【論文】
- 2025年中國中信集團(tuán)有限公司招聘筆試參考題庫含答案解析
- 阜陽PLC基礎(chǔ)知識培訓(xùn)課件
- 2025年教育革新:利用AI技術(shù)打造個性化學(xué)習(xí)
- 2025年廣東省第二季度廣州市城市規(guī)劃勘測設(shè)計研究院招聘56人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年中小學(xué)生研學(xué)(勞動)實(shí)踐教育基地申報流程
評論
0/150
提交評論