版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1問題描述 2設(shè)計2. 1存儲結(jié)構(gòu)設(shè)計2. 2主要算法設(shè)計2. 3測試用例設(shè)計 3調(diào)試報告3. 1調(diào)試過程中遇到的問題的解決3. 2對設(shè)計和編碼的討論和分析 4經(jīng)驗(yàn)和體會4.1收獲4. 2對算法改進(jìn)的設(shè)想 5附源程序清單和運(yùn)行結(jié)果5. 1源程序代碼125. 2運(yùn)行結(jié)果與分析參考文獻(xiàn)索引順序查找1問題描述這個課程設(shè)計的題目是“索引順序查找”,其實(shí)就是分塊查找是介于順序查 找和折半查找之間的查找方法。將數(shù)據(jù)分別放入幾個塊中,其中塊之間是有序的,即前邊的最大數(shù)小于后邊的最小數(shù),塊內(nèi)數(shù)據(jù)可以是無序的。編寫出一個 能進(jìn)行索引順序查找的程序,要求能自動建立索引表;對任意待查找的關(guān)鍵字, 若查找成功,給出其
2、關(guān)鍵字比較次數(shù);測試用例自己設(shè)計。我的設(shè)計思想是建立一個數(shù)組用來存放數(shù)據(jù),所存放的數(shù)據(jù)之間是按塊有 序的,所以設(shè)計之前要想好自己怎樣分塊。每個數(shù)據(jù)都只有自己的地址address,每塊內(nèi)都有一個最大值max。比較關(guān)鍵字key時先比較最大值,符合條件后再 進(jìn)入塊內(nèi)比較。不管所比較的關(guān)鍵字在比較關(guān)鍵字時是不是恰好和最大值相等, 都要進(jìn)入塊再重新比較,并且從相應(yīng)塊的首地址開始比較,然后向后依次比較。 從比較一開始,就會有一個計數(shù)關(guān)鍵字count開始計數(shù)。因此,分塊查找過程需分兩步進(jìn)行。先確定待查記錄所在的塊(子表),然后在塊 中順序查找。假設(shè)給定值key=38,則先將key依次和索引表中各最大關(guān)鍵字進(jìn)
3、行 比較,因?yàn)?2<key<48,則關(guān)鍵字為38的記錄若存在,必定在第二個子表中, 由于同一索引項(xiàng)中的指針指示第二個子表中的第一個記錄是表中第7個記錄,則 自第7個記錄起進(jìn)行順序查找,直到l.data10=key為止。假如此子表中沒有關(guān)鍵 字等于key的記錄(例如:key=29時自第7個記錄起至第12個記錄的關(guān)鍵字和key 比較都不等),則查找不成功。索引順序查找的性能分析:分塊查找的平均查找長度為:其中,d為查找索引表確定所在塊的平均查找長度zir為在塊中查找元素的平均查找長度。若用順序查找的方法確定所在的塊,貝!hv jsbi o ihi£a & o若用折半查
4、找確定所在的塊,貝!has%= £»+ =+丄辦=扇叫a些罟s u2£2設(shè)計2.1存儲結(jié)構(gòu)設(shè)計這個程序首先用到了2個結(jié)構(gòu)體,typedef struct datatype datamaxsize; int length; list;> typedef structf datatype max;int address;index> 分另u表 示定義索引表、定義塊表。其中key表示待查找的索引值;max表示塊內(nèi)索引的 最大值,即為最大關(guān)鍵字,address為塊內(nèi)第一個索引的地址;datasize表示數(shù)組所能容納的最多元素,length表示表內(nèi)元素的個數(shù)。在
5、創(chuàng)建塊表時,int intput (list *l, index *index),定義了l為list的引用, index為index的數(shù)據(jù)成員。先將表的長度l-length定義為0,每輸入一個數(shù),表長 度隨之加1,然后輸入要建的塊數(shù),并且輸入每個塊的首地址。指明每個塊的最大 值,以便在下一個函數(shù)indexsearch中直接將key與最大值進(jìn)行比較。在查找時,我定義了 函數(shù)int indexsearch(list ljndex index9int lendatatypekey),現(xiàn)將關(guān)鍵字key與每一塊的最大<indexi.key進(jìn)行比較,從第一塊開始,依次向 后比較,當(dāng)計數(shù)器i超過塊的個
6、數(shù)時,返回1;當(dāng)符合條件ivlen&&key>indeximax時, 進(jìn)入塊進(jìn)行比較。從當(dāng)前塊的首地址元素開始依次向后比較。無論是比較最大值還是比 較塊中元素,比較次數(shù)計數(shù)器count直在計數(shù)。當(dāng)存在塊中元素與關(guān)鍵字相等時,輸 出關(guān)鍵字的比較次數(shù)conn併且返回當(dāng)前元素的地址addresso若當(dāng)前塊中沒有元素與關(guān) 鍵字相等,返回12.2主要算法設(shè)計為了體現(xiàn)程序的簡單與高效,我將程序最終到造成了只用兩個函數(shù)就完成了 主要功能的實(shí)現(xiàn),在函數(shù)index中輸入所有數(shù)據(jù)元素與地址和要分的塊數(shù),以及 每一塊的最大值。在函數(shù)indexsearch中實(shí)現(xiàn)了關(guān)鍵字的比較,其中包括關(guān)鍵字 與
7、最大元素的比較和響應(yīng)塊中每個元素的比較,直到找到相應(yīng)元素為止。而且 比較次數(shù)與相應(yīng)元素的地址也在這個函數(shù)中體現(xiàn)出來。根據(jù)索引順序査找的原理,得知分塊查找需兩步進(jìn)行,要先確定待查所在的 塊(子表),然后在塊中順序查找,所以至少需要兩個查找函數(shù)。查找塊函數(shù)可 用折半查找或者順序查找。一般情況下進(jìn)行分塊查找,可以將長度為n的表均勻地分成b塊,每塊含有 s個記錄,即b= rn/s ;假定表中每個記錄的查找概率相等,則每塊查找的概率 為1/b,塊中每個記錄的查找概率為1/so若用順序查找確定所在塊,則分塊查找的平均查找長度為aslbs=l/2(n/s+s)+lo可見,此時的平均查找長度不僅和表 長n有關(guān)
8、,而且和每一塊中的記錄個數(shù)s有關(guān)。在給定n的前提下,s是可以選擇的。容易證明,當(dāng)s取徧時,ass取小值奶+ 1。這個值比順序查找有了很大改進(jìn),但遠(yuǎn)不及折半查找。若用折半查找確定所在塊,則分塊查找的平均 查找長度 aslbs 約為 log2(n/s+l)+s/2o雖然通過平均查找長度的比較,對塊的查找用折半查找較先進(jìn),但我這里的 int indexsearch()函數(shù)還是用的一般人較易理解的順序查找。這里用到的是順序 查找,若key值小于或等于第一塊的最大關(guān)鍵字indexl.max,則key值可能在 第一塊中;若key值大于最后一塊的最大關(guān)鍵字indexlen.max,則key值必定 不在任何一
9、個塊中,查找失??;若key值大于前一塊的最大關(guān)鍵字,小于或等 于后一塊的最大關(guān)鍵字,則key值肯能在后一塊中。這樣就能確定key值所在 的塊了。通過我的思考,我覺得順序查找較簡單些,所以在程序中就用了順序 查找。再者是在塊中查找關(guān)鍵字用到的int indexsearch ()函數(shù),由于塊中的元素是 無序排列,所以只能用順序查找。l->data是通過所查到的塊中的元素建立的 數(shù)組,再通過把每個塊中的元素依次和key值做比較,就可查到是否存在key 這個元素。若從該塊的第一個元素查到最后一個元素都沒有找到與key相等的 值,則查找失敗,這個是根據(jù)該塊的長度(塊中元素的個數(shù))控制的。若找到 與
10、kty相等的值,就返回該元素所在的位置。2.3測試用例設(shè)計1 對創(chuàng)建表的函數(shù)int input(),通過手動輸入所有元素(按塊有序進(jìn)行輸入,以0 為結(jié)束輸入的標(biāo)志)和塊數(shù),如輸入一些簡單易操作的數(shù)32 16549870 2然后輸入每塊的首地址以及每塊的最大值,這樣就將塊確定了下來。如:輸入要建立的3個塊表,每個塊表的最大關(guān)鍵字和首地址分別是:3, 0; 6, 3; 9, 6。得到的結(jié)果為:index0.max=3 indexleinax=6 index2<max=9index o.address=o index l.address=3 index 2>address=63 對查找關(guān)
11、字所在的塊以及對比找到確切位置的函數(shù)int indexsearch()通過對要查找的key值分別與每一塊的最大關(guān)鍵字進(jìn)行比較,得出key值可 能位于哪一塊中。如i:當(dāng)key=5時,先與第一塊最大關(guān)鍵字進(jìn)行比較,key>index0.max=3, 再與第二塊最頭關(guān)鍵字進(jìn)行比較,key<index2.max=6,所以5可能在第二塊中, 返回第二塊的首地址;然后比較key<l.datao,所以再與下一個元素比較,有 key=l.datal,所以可以確定在第二塊第二個位置,比較次數(shù)為4次。當(dāng)key=12時,先與第一塊最大關(guān)鍵字進(jìn)行比較,key>index0.max=3;再 進(jìn)行
12、比較,key>index2.max=9,所以12不可能位于這些塊表中,查找失敗, 則不再需要進(jìn)入塊中進(jìn)行比較。與第二塊最大關(guān)鍵字進(jìn)行比較,key>indexl.max=6;再與第三塊最大關(guān)鍵字3調(diào)試報告3.1調(diào)試過程中遇到的問題的解決1 對存放元素的數(shù)組的大小定義一開始過小,導(dǎo)致我后來存放的元素超出了數(shù)組 空間,產(chǎn)生溢出,于是我將數(shù)組大小改為100,問題得以解決2對創(chuàng)建索引順序表的函數(shù)int input()這個函數(shù)還算簡單,在此函數(shù)中我同時實(shí)現(xiàn)了表中元素的輸入,每塊的首地 址以及塊內(nèi)最大值,當(dāng)時設(shè)計的時候沒有使表的首地址和塊的首地址做到統(tǒng)一, 在建立完函數(shù)時我將它們的首地址統(tǒng)一設(shè)置
13、成0,這樣元素的名義地址為i,實(shí) 際地址為i+1.3對于搜索函數(shù)indexsearch出現(xiàn)的錯誤雖然不多,但是很嚴(yán)重,而且在當(dāng)時按 我當(dāng)?shù)某踉O(shè)計思路來改很難改。從一開始設(shè)計搜索函數(shù)時,我考慮的太多,想 實(shí)現(xiàn)這個函數(shù)的“智能化”:在比較最大值時,我考慮了 key是不是恰好是某一 塊的最大值,這樣將不再進(jìn)入塊中進(jìn)行比較,而且考慮到這一點(diǎn)我在塊中搜索 時,是從后往前搜索的,即搜索的初值我設(shè)計為j=indexi+l.address-l,h這樣 當(dāng)key在最后一塊時,上邊的這一公式卻不能再用,只能另外處理。而且在當(dāng) 初計算比較次數(shù)時由于這樣設(shè)計的比較繁瑣,我忘記了對比較塊最后一個值時 對計數(shù)器加1。由于
14、對搜索函數(shù)的數(shù)次盲目改動都以失敗告終,我最后用了一種簡單的思 路進(jìn)行比較,即先比較每塊的最大值,如果沒有直接返回1,不再進(jìn)入塊;若有 符合條件得塊,則直接進(jìn)入此塊,并且不管最大值是否就是key,都從首地址再 次重新進(jìn)行比較。這樣計數(shù)器在查找塊時和在塊內(nèi)查找時都在計數(shù)。在計數(shù)時由于程序自身的缺陷,在比較找到符合條件的塊以及在塊中尋找 都符合條件的元素時,計數(shù)器都不會對最后一次的比較加1,因?yàn)樵诒容^時我使 用的是while循環(huán)語句,這樣當(dāng)條件符合時,就不會再進(jìn)入下邊的結(jié)構(gòu)對計數(shù)器 加1 所以我在當(dāng)每次查找成功后都會再對計數(shù)器加1 這樣就保證了計數(shù)器的值 就是真正的比較的次數(shù)?,F(xiàn)在想想我當(dāng)初設(shè)計搜索
15、函數(shù)時之所以出現(xiàn)那種負(fù)責(zé)的比較,只是因?yàn)槲?在潛意識里將塊的最大值和塊的最后一個值給混淆了,這也是為什么我當(dāng)初按 大小順序輸入元素得到的比較次數(shù)并沒有錯的原因。而當(dāng)我按照混亂的順序輸 入元素時就出錯了。4對主函數(shù)main()在最初自己電腦上調(diào)試時沒有出現(xiàn)錯誤,但是到了實(shí)驗(yàn)室里出現(xiàn)了跳屏現(xiàn) 象,即結(jié)果輸出來的時候窗口隨之就關(guān)閉了,在老師加入兩個getcharo后,問 題得到解決。3.2對設(shè)計和編碼的討論和分析我覺得我的程序非常簡便,絕對體現(xiàn)了程序的高效性和簡單性,我看過其他 類似的程序但都顯得過分冗雜,程序非常長,看起來很復(fù)雜,但是最終實(shí)現(xiàn)的 主要的還是那兩個函數(shù),我的函數(shù)之所以只有兩個,是因?yàn)?/p>
16、我的操作都隱含在 這兩個函數(shù)中了,函數(shù)雖少,功能不少,充分借助了函數(shù)內(nèi)的數(shù)據(jù),這讓我可 以從一開始的冗雜到現(xiàn)在的簡單。4經(jīng)驗(yàn)和體會4.1收獲通過這次課程設(shè)計,我對索引順序查找有了更加深入的了解,我基本學(xué)會了 用索引順序查找來解決類似的查找問題。雖然在程序的編譯過程中遇到了不少 問題,但是我通過查資料,跟同學(xué)討論等方式,把問題都逐步的解決了。所以, 在這次的實(shí)踐中,我也學(xué)到了不少解決問題的方法,讓我獲益匪淺。我希望以 后老師能多給我們安排一些類似的課程設(shè)計,我認(rèn)為通過我們的自主設(shè)計,自 主思考,不僅能提高我們的專業(yè)技能,而且能提高我們自主解決問題的能力, 使我們獲得了更多在平時學(xué)不到的知識。這同
17、時也是一種經(jīng)驗(yàn),為以后的工作 奠定了一定的基礎(chǔ)。4.2對算法改進(jìn)的設(shè)想我的搜索函數(shù)indexsearch無論怎么改都有自身的局限性,這也我我本身的設(shè)計 思路有關(guān),而且關(guān)鍵問題在while循環(huán)上,我在查找塊成功進(jìn)入塊內(nèi)查找時,對 于前幾個塊的查找都沒問題只是到了最后一個,因?yàn)槲业膚hile循環(huán)語句是wh訂e(j<=(indexi+l.address)&&key!=l.data|jj),這樣導(dǎo)致若關(guān)字在最后一塊時,產(chǎn)生錯誤,因?yàn)闆]有indexi+l.addresso這樣我不得不將語改為(j<=(indexi.address+2)&&key!=l.data
18、j),這樣改是因?yàn)槲乙婚_始測試時所使用的塊 長是3,雖然這樣該解決了最后一塊的問題,但是也就產(chǎn)生了局限性,使每塊的個數(shù)被固定了。這也有解決辦法,就是設(shè)將 indexi.address+2 改為indexi.address+x,這樣每塊的個數(shù)就可以隨意變動了。由于時間關(guān)系,我并未將其改動,但我相信改動后一定會產(chǎn)生期望的效果的。5附源程序清單和運(yùn)行結(jié)果5.1源程序代碼#include nstdio.hn#define maxsize 100 typedef int datatype;typedef structdatatype datafmaxsize; int length;list;typed
19、ef structdatatype max;int address;index;int intpul(list *l,index * index)datatype x,y;int i,j;l->length=o;printf("輸入表,以'o'結(jié)束nnh);scanf(“d”,&x);while(x!=0)l->datal->length=x;l->length+; scanf(h%dh,&x);printf(nn輸入塊的長度:”);scanf(” d”,&y);printf(nn輸入每一塊的地址:”); for(i=0
20、;i<y;i+)scanf(”d”,&x); indexij.address=x;printf("n輸入每一塊的最大值:”);for(j=0;j<y;j+)scanf(”d”,&x); indexj.max=x;return y;int indexsearch(list l,index indexjnt len,datatype key) int i=0,count=0,j;while(i<le n&&key>indexi.max) i4-+;count+; if(i>=len)returnelsecount+;while
21、(j<=indexi.address+2&&key!=l.dataj)j+;count+;if(j>indexi.address+2)return -1;else count+; printf(nn 搜索次數(shù)是:%dh,count); return j;int main()list l;index indexmaxsizej;int x,y,m;intlen;len=intput(&l,index); printf(mn輸入關(guān)鍵字:”); scanf(,'n%d",&x);y=indexsearch(l,index jen,x);if(y=-l)printf(,n 沒有 %du,x); else printf("n地址:%d",y+l );printf(nn是否還要繼續(xù)?若是,請按1: h); scanf(,n%d",&m);while(m=l)printf(nn輸入關(guān)鍵字
溫馨提示
- 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年度鋼結(jié)構(gòu)工程勞務(wù)分包合同范本6篇
- 2025版智能物流股份買賣合同示范文本3篇
- 2025版腳手架施工工程驗(yàn)收報告編制合同3篇
- 2025版房產(chǎn)過戶全權(quán)代理服務(wù)合同樣本6篇
- 2025版教育培訓(xùn)機(jī)構(gòu)教師聘用與培訓(xùn)合同3篇
- 2025版商業(yè)秘密保護(hù)合同模板及范本6篇
- 2025年度綠色建筑節(jié)能施工工程合同3篇
- 2025版租賃房產(chǎn)居間合同電子版簽訂與審核指南3篇
- 2025年度企業(yè)內(nèi)部股權(quán)激勵計劃評估與調(diào)整合同3篇
- 2025版綠色建筑認(rèn)證及工程總承包管理服務(wù)合同范本3篇
- 瑞幸咖啡品牌營銷策略研究報告
- 醫(yī)學(xué)科研的道德與倫理
- 小學(xué)一年級上冊數(shù)學(xué)口算訓(xùn)練題
- 江西省景德鎮(zhèn)市2023-2024學(xué)年高二上學(xué)期1月期末考試物理試題
- 期末試卷-2023-2024學(xué)年語文六年級上冊統(tǒng)編版
- 2024年1月國開電大法律事務(wù)??啤斗勺稍兣c調(diào)解》期末考試試題及答案
- 快速響應(yīng)客戶需求機(jī)制
- 北京市東城區(qū)2023-2024學(xué)年九年級上學(xué)期期末語文試題(含答案)
- 汽車安全與法規(guī) (第3版) 課件 第4-6章 汽車被動安全性、汽車主動安全系統(tǒng)、汽車被動安全性能試驗(yàn)
- 劉鐵敏《金融專業(yè)英語》(第2版)-習(xí)題參考答案20
- 交通事故的處理流程
評論
0/150
提交評論