版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
/折半查找及其改進(jìn)一、問題描述查找是在一個數(shù)據(jù)元素集合中查找關(guān)鍵字等于某個給個數(shù)據(jù)元素關(guān)鍵字的過程.也稱為檢索。給出一個特定的元素x.在含有n個元素的數(shù)列中判斷是否存在這個元素.如果存在.返回此元素在數(shù)列中的位置.否則返回零。數(shù)列查找在實(shí)際中的應(yīng)用十分廣泛.因此數(shù)列查找算法的好壞直接影響到程序的優(yōu)劣。本設(shè)計(jì)要求讀取文件中的數(shù)據(jù)建立查找表,并設(shè)計(jì)算法實(shí)現(xiàn)折半查找及其改進(jìn)查找。二、基本要求1、選擇合適的存儲結(jié)構(gòu).讀取已知文件數(shù)據(jù)建立查找表;2、完成基于遞歸和非逆歸的折半查找算法的設(shè)計(jì);3、完成基于區(qū)間約束對折半查找算法的改進(jìn)算法的設(shè)計(jì);4、完成三分查找算法的設(shè)計(jì)。三、測試數(shù)據(jù)文件in.txt中100個數(shù)據(jù):1,2,3…98,99,100。讀取文件in.txt中前50位數(shù).查找元素:58讀取文件in.txt中前50位數(shù).查找元素:18讀取文件in.txt中前100位數(shù).查找元素:18讀取文件in.txt中前100位數(shù).待查元素:58四、算法思想1、折半查找的算法思想是以處于區(qū)間中間位置記錄的關(guān)鍵字和給定值比較.若相等.則查找成功.如不等.則縮小范圍.直至新的區(qū)間中間位置記錄的關(guān)鍵字等于給定值或區(qū)間大小小于零時為止。2、縮小區(qū)間查找算法的思想是先求出有序數(shù)列中每相鄰兩個元素之差的最大值的一個上界.設(shè)為m.要查找的數(shù)值為key.然后在每次循環(huán)做折半之前先進(jìn)行一次篩選工作.即將low右移<key-a[low]/m>位.high值左移<a[high]-key>/m位.從而把盡可能多的不必要的元素過濾掉.縮小查找范圍繼續(xù)查找.直至新的區(qū)間中間位置記錄的關(guān)鍵字等于給定值或區(qū)間大小小于零時為止。3、三分查找的算法思想是在給出n個已經(jīng)排好序的數(shù).在n/3和2n/3處各取一個數(shù).跟給定值key比較.確定待查數(shù)所在的范圍,直至新的區(qū)間中間位置記錄的關(guān)鍵字等于給定值或區(qū)間大小小于零時為止。五、模塊劃分1、voidread_dat<SSTable*ST,intn>,讀取文件in.dat中的數(shù)據(jù)并建立一個含文件in.dat中前n個數(shù)據(jù)的靜態(tài)查找表ST。2、voidDestroyList<SSTable*ST>,銷毀表ST。3、intSearchB1<SSTableST,KeyTypekey>,利用折半查找的非遞歸算法.查找關(guān)鍵字等于key的數(shù)據(jù)元素.若存在.返回該元素在表中的位置.否則為0。4、SearchB2<SSTableST,intkey,intlow,inthigh>,利用折半查找的遞歸算法.查找關(guān)鍵字等于key的數(shù)據(jù)元素.若存在.返回該元素在表中的位置.否則為0。5、SearchB3<SSTableST,KeyTypekey>,對折半查找算法的一種改進(jìn)6、SearchB4<SSTableST,KeyTypekey>,利用三分查找法.查找關(guān)鍵字等于key的數(shù)據(jù)元素.若存在.返回該元素在表中的位置.否則為0。7、voidMainMenue<>,主菜單。8、main<>,主函數(shù)。六、數(shù)據(jù)結(jié)構(gòu)查找表類型定義如下:typedefintKeyType;typedefstruct{KeyTypekey;/*其它域:略*/}ElemType;typedefstruct{ElemType*elem;intlength;}SSTable;七、源程序/*查找*/#include"stdio.h"#include"stdlib.h"#defineEQ<a,b><<a>==<b>>#defineLT<a,b><<a><<b>>#defineLQ<a,b><<a><=<b>>/*查找表類型定義*/typedefintKeyType;typedefstruct{KeyTypekey;/*其它域:略*/}ElemType;typedefstruct{ElemType*elem;intlength;}SSTable;/*1.讀取文件數(shù)據(jù)并建立查找表*/voidread_dat<SSTable*ST,intn>{inti;FILE*fp;ST->elem=<ElemType*>malloc<<n+1>*sizeof<ElemType>>;ST->length=n;fp=fopen<"in.txt","r">;for<i=0;i<=n;i++> fscanf<fp,"%d,",&ST->elem[i].key>;printf<"SSTable:<%d>\t",ST->elem[0].key>;for<i=1;i<=n;i++>printf<"%5d",ST->elem[i].key>;fclose<fp>;}/*2.銷毀查找表*/voidDestroyList<SSTable*ST>{free<ST->elem>;}voidDestroy<SSTable*ST>{if<ST->elem>{free<ST->elem>;ST->length=0;}}/*3.折半查找的非遞歸算法*/intSearchB1<SSTableST,KeyTypekey>{intlow,high,mid;low=1;high=ST.length;while<low<=high>{mid=<low+high>/2;if<EQ<key,ST.elem[mid].key>>returnmid;elseif<LT<key,ST.elem[mid].key>>high=mid-1;elselow=mid+1;}return0;}/*4.折半查找的遞歸算法*/intSearchB2<SSTableST,intkey,intlow,inthigh>{intmid;if<low>high>return0;mid=<low+high>/2;if<EQ<key,ST.elem[mid].key>>returnmid;elseif<LT<key,ST.elem[mid].key>>returnSearchB2<ST,key,low,mid-1>;elsereturnSearchB2<ST,key,mid+1,high>;}/*5.對折半查找算法的一種改進(jìn)*/intMAX<SSTableST>{intmax,i;max=ST.elem[2].key-ST.elem[1].key;for<i=2;i<ST.length-1;i++>if<max<ST.elem[i+1].key-ST.elem[i].key>max=ST.elem[i+1].key-ST.elem[i].key;returnmax;}intSearchB3<SSTableST,KeyTypekey>{intlow,high,mid,l=0,h=0,m=MAX<ST>;low=1;high=ST.length;while<low<=high&&l>=0&&h>=0>{l=<key-ST.elem[low].key>/m;h=<ST.elem[high].key-key>/m;mid=<low+high>/2;if<EQ<key,ST.elem[mid].key>>returnmid;elseif<LT<key,ST.elem[mid].key>>high=mid-1;elselow=mid+1;}return0;}/*6.三分查找*/intSearchB4<SSTableST,KeyTypekey>{intmid1,mid2,low=1,high=ST.length;if<ST.elem[low].key>key||ST.elem[high].key<key>return0;while<low<=high>{mid1=<high+low>/3;mid2=<2*high+low>/3;if<EQ<key,ST.elem[mid1].key>>returnmid1;elseif<LT<key,ST.elem[mid1].key>>high=mid1-1;else{if<EQ<key,ST.elem[mid2].key>>returnmid2;elseif<LT<key,ST.elem[mid2].key>>{low=mid1+1;high=mid2-1;}elselow=mid2+1;}}return0;}/*7.主菜單*/voidMainMenue<>{printf<"\n**********************MainMenue***********************\n">;printf<"**1.折半查找的非遞歸算法**\n">;printf<"**2.折半查找的遞歸算法**\n">;printf<"**3.對折半查找算法的一種改進(jìn)**\n">;printf<"**4.三分查找**\n">;printf<"**5.Exit.**\n">;printf<"********************************************************\n">;}/*主函數(shù)*/main<>{SSTableT;KeyTypex;intn,flag=1;charc;printf<"\n請輸入表長:">;scanf<"%d",&n>;read_dat<&T,n>;MainMenue<>;while<flag>{printf<"\nPleaseinputyourchoice:">;scanf<"%s",&c>;switch<c>{ case'1':printf<"\n折半查找的非遞歸算法:">printf<"\n請輸入待查元素:">;scanf<"%d",&x>;printf<"\n元素%d在表中的位置:%d",x,SearchB1<T,x>>;break;case'2':printf<"\n折半查找的遞歸算法:">;printf<"\n請輸入待查元素:">;scanf<"%d",&x>;printf<"\n元素%d在表中的位置:%d",x,SearchB2<T,x,1,T.length>;break;case'3':printf<"\n對折半查找算法的一種改進(jìn):">;printf<"\n請輸入待查元素:">;scanf<"%d",&x>;printf<"\n元素%d在表中的位置:%d",x,SearchB3<T,x>>;break;case'4':printf<"\n三分查找:">;printf<"\n請輸入待查元素:">;scanf<"%d",&x>;printf<"\n元素%d在表中的位置:%d",x,SearchB4<T,x>>;break;case'5':exit<1>;default:printf<"Inputerror!\n">;break;}}return0;Destroy<&T>;}八、測試情況測試結(jié)果:讀取文件in.txt中前50位數(shù).查找元素:58輸出文件中前50位數(shù)和主菜單.運(yùn)行正確。查找58在表中位置.因?yàn)?8不在表中.所以輸出0.程序運(yùn)行結(jié)果正確。讀取文件in.txt中前50位數(shù).查找元素:18元素18在表中位置為18.結(jié)果正確讀取文件in.txt中前100位數(shù).查找元素:18輸出文件中前100位數(shù)和主菜單.運(yùn)行正確。元素18在表中位置為18.運(yùn)行結(jié)果正確。讀取文件in.txt中前100位數(shù).待查元素:58元素58在表中位置為58.運(yùn)行結(jié)果正確。九、參考文獻(xiàn)1、嚴(yán)蔚敏.《數(shù)據(jù)結(jié)構(gòu)C語言》.清華大學(xué)出版社。2、譚浩強(qiáng).《c語言程序設(shè)計(jì)》.清華大學(xué)出版社。小結(jié)通過本次課程設(shè)計(jì).我學(xué)到了很多。它讓我真正的理解了什么是程序.程序=算法+結(jié)構(gòu)。編程的第一要務(wù)是把事物分析清楚.把事件先后的邏輯關(guān)系和依賴關(guān)系搞清楚.從而確定相應(yīng)的數(shù)據(jù)結(jié)構(gòu).然后寫代碼去實(shí)現(xiàn)。所以只有學(xué)好數(shù)據(jù)結(jié)構(gòu).才能編好程序。編程不像做其它事.它要求編程人員有非??b密的思維.很好的整體把握能力和很好的調(diào)試程序的能力等。決定程序成功與否的往往不是程序的整體思路和整體算法.而是細(xì)節(jié).細(xì)節(jié)錯誤往往是程序失敗的終級殺手.我在此次課程設(shè)計(jì)中深有體會。如不同輸入法下的分號不同.有個分號我是在中文輸入法下輸入的.導(dǎo)致我的程序運(yùn)行的結(jié)果出錯.花了我一定時間才檢查出來錯誤。同時我也認(rèn)識到編譯工具的重要性.我用的是VC++6.0環(huán)境.提高我編寫程序的效率.如按回車后.它能自動空出一定距離.體現(xiàn)出程序的結(jié)構(gòu).不用人工輸入空格、制表符.還有它的調(diào)試功能.不用我人工輸出中間變量來查錯.就能看到中間變量。在實(shí)驗(yàn)編寫程序的過程中.遇到了很多的問題.這些在我以前的實(shí)驗(yàn)中都是沒遇到的.比如三分查找.在給出n個已經(jīng)排好序的數(shù).在n/3和2n/3處各取一個數(shù).跟給定值key比較.由于比較時會出現(xiàn)很多的情況.每一種情況都需要仔細(xì)考慮到.在編程中.因?yàn)闆]有認(rèn)真分析.考慮不周全.導(dǎo)致一些情況遺漏了.程序出現(xiàn)了錯誤.經(jīng)過后來認(rèn)真分析.最終找到了遺漏的情況.程序運(yùn)行成功。還有在編寫基于區(qū)間約束對折半查找算法的改進(jìn)算法的設(shè)計(jì)過程中.也遇到了類似的錯誤.考慮條件不周全.程序
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025高考物理步步高同步練習(xí)選修3第四章原子結(jié)構(gòu)和波粒二象性第1節(jié) 普朗克黑體輻射理論含答案
- 淺論教師的傾聽藝術(shù)
- 會計(jì)師事務(wù)所審計(jì)失敗案例分析
- 走進(jìn)化學(xué)科學(xué) 同步課時訓(xùn)練 高一上學(xué)期化學(xué)魯科版(2019)必修第一冊
- 初中教師工作總結(jié)
- 教師隨筆教學(xué)感悟(31篇)
- 教師培訓(xùn)工作總結(jié)
- 科學(xué)教師個人研修總結(jié)(3篇)
- 高中數(shù)學(xué)教師個人研修計(jì)劃(33篇)
- 歷史教師年度教學(xué)計(jì)劃
- 神經(jīng)病學(xué)常見病詳細(xì)目錄
- 分布式光伏發(fā)電項(xiàng)目咨詢服務(wù)協(xié)議(范本)
- 赤峰市國企招聘考試真題及答案
- 史密斯輸液泵的使用方法
- 機(jī)械制圖習(xí)題集(第7版)
- 農(nóng)業(yè)推廣的內(nèi)容同課異構(gòu)
- 2023年上海市英語高考一輪復(fù)習(xí)精講精練專題23:句子翻譯(下)含詳解
- 扣繳個人所得稅報(bào)告表-(Excel版)
- 2023年成人高考《英語》(高升專)真題庫及答案(單選題型)
- 25個吊籃事故案例
- GB/T 42249-2022礦產(chǎn)資源綜合利用技術(shù)指標(biāo)及其計(jì)算方法
評論
0/150
提交評論