intTypePromotion=1
zunia.vn Tuyển sinh 2024 dành cho Gen-Z zunia.vn zunia.vn
ADSENSE

Giáo trình phân tích quy trình ứng dụng nguyên lý sử dụng cấu trúc dữ liệu và giải thuật p3

Chia sẻ: Sdfasf Fasf | Ngày: | Loại File: PDF | Số trang:5

46
lượt xem
4
download
 
  Download Vui lòng tải xuống để xem tài liệu đầy đủ

Tham khảo tài liệu 'giáo trình phân tích quy trình ứng dụng nguyên lý sử dụng cấu trúc dữ liệu và giải thuật p3', kỹ thuật - công nghệ, kiến trúc - xây dựng phục vụ nhu cầu học tập, nghiên cứu và làm việc hiệu quả

Chủ đề:
Lưu

Nội dung Text: Giáo trình phân tích quy trình ứng dụng nguyên lý sử dụng cấu trúc dữ liệu và giải thuật p3

  1. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N . y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o c u -tr a c k c u -tr a c k f. Caøi ñaët thuaät toaùn khoâng ñeä quy: Haøm NRecBinarySearch coù prototype: int NRecBinarySearch (T M[], int N, T X); Haøm thöïc hieän vieäc tìm kieám phaàn töû coù giaù trò X trong maûng M coù N phaàn töû ñaõ coù thöù töï taêng. Neáu tìm thaáy, haøm traû veà moät soá nguyeân coù giaù trò töø 0 ñeán N-1 laø vò trí töông öùng cuûa phaàn töû tìm thaáy. Trong tröôøng hôïp ngöôïc laïi, haøm traû veà giaù trò –1 (khoâng tìm thaáy). Noäi dung cuûa haøm NRecBinarySearch nhö sau: int NRecBinarySearch (T M[], int N, T X) { int First = 0; int Last = N – 1; while (First Last Mid M[Mid] X= X< X> M[Mid] M[Mid] M[Mid] Ban ñaàu 0 9 False 4 8 False True False 1 0 3 False 1 3 False False True 2 2 3 False 2 4 False False True 3 3 3 False 3 5 True Trang: 13
  2. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N . y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o Keát quaû sau 3 laàn laëp (ñeä quy) thuaät toaùn keát thuùc. c u -tr a c k c u -tr a c k - Baây giôø ta thöïc hieän tìm kieám phaàn töû coù giaù trò X = 7 (khoâng tìm thaáy): Laàn laëp First Last First > Last Mid M[Mid] X= X< X> M[Mid] M[Mid] M[Mid] Ban ñaàu 0 9 False 4 8 False True False 1 0 3 False 1 3 False False True 2 2 3 False 2 4 False False True 3 3 3 False 3 5 False False True 4 4 3 True Keát quaû sau 4 laàn laëp (ñeä quy) thuaät toaùn keát thuùc. Löu yù: Thuaät toaùn tìm nhò phaân chæ coù theå vaän duïng trong tröôøng hôïp daõy/maûng ñaõ coù thöù töï. Trong tröôøng hôïp toång quaùt chuùng ta chæ coù theå aùp duïng thuaät toaùn tìm kieám tuaàn töï. Caùc thuaät toaùn ñeä quy coù theå ngaén goïn song toán keùm boä nhôù ñeå ghi nhaän maõ leänh chöông trình (moãi laàn goïi ñeä quy) khi chaïy chöông trình, do vaäy coù theå laøm cho chöông trình chaïy chaäm laïi. Trong thöïc teá, khi vieát chöông trình neáu coù theå chuùng ta neân söû duïng thuaät toaùn khoâng ñeä quy. 2.3. Caùc giaûi thuaät tìm kieám ngoaïi (Tìm kieám treân taäp tin) 2.3.1. Ñaët vaán ñeà Giaû söû chuùng ta coù moät taäp tin F löu tröõ N phaàn töû. Vaán ñeà ñaët ra laø coù hay khoâng phaàn töû coù giaù trò baèng X ñöôïc löu tröõ trong taäp tin F? Neáu coù thì phaàn töû coù giaù trò baèng X laø phaàn töû naèm ôû vò trí naøo treân taäp tin F? 2.3.2. Tìm tuyeán tính a. Tö töôûng: Laàn löôït ñoïc caùc phaàn töû töø ñaàu taäp tin F vaø so saùnh vôùi giaù trò X cho ñeán khi ñoïc ñöôïc phaàn töû coù giaù trò X hoaëc ñaõ ñoïc heát taäp tin F thì keát thuùc. b. Thuaät toaùn: B1: k=0 B2: rewind(F) //Veà ñaàu taäp tin F B3: read(F, a) //Ñoïc moät phaàn töû töø taäp tin F B4: k = k + sizeof(T) //Vò trí phaàn töû hieän haønh (sau phaàn töû môùi ñoïc) B5: IF a ≠ X AND !(eof(F)) Laëp laïi B3 B6: IF (a = X) Tìm thaáy taïi vò trí k byte(s) tính töø ñaàu taäp tin B7: ELSE Khoâng tìm thaáy phaàn töû coù giaù trò X Trang: 14
  3. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N . y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o B8: Keát thuùc c u -tr a c k c u -tr a c k c. Caøi ñaët thuaät toaùn: Haøm FLinearSearch coù prototype: long FLinearSearch (char * FileName, T X); Haøm thöïc hieän tìm kieám phaàn töû coù giaù trò X trong taäp tin coù teân FileName. Neáu tìm thaáy, haøm traû veà moät soá nguyeân coù giaù trò töø 0 ñeán filelength(FileName) laø vò trí töông öùng cuûa phaàn töû tìm thaáy so vôùi ñaàu taäp tin (tính baèng byte). Trong tröôøng hôïp ngöôïc laïi, hoaëc coù loãi khi thao taùc treân taäp tin haøm traû veà giaù trò –1 (khoâng tìm thaáy hoaëc loãi thao taùc treân taäp tin). Noäi dung cuûa haøm nhö sau: long FLinearSearch (char * FileName, T X) { FILE * Fp; Fp = fopen(FileName, “rb”); if (Fp == NULL) return (-1); long k = 0; T a; int SOT = sizeof(T); while (!feof(Fp)) { if (fread(&a, SOT, 1, Fp) == 0) break; k = k + SOT; if (a == X) break; } fclose(Fp); if (a == X) return (k - SOT); return (-1); } d. Phaân tích thuaät toaùn: - Tröôøng hôïp toát nhaát khi phaàn töû ñaàu tieân cuûa taäp tin coù giaù trò baèng X: Soá pheùp gaùn: Gmin = 1 + 2 = 3 Soá pheùp so saùnh: Smin = 2 + 1 = 3 Soá laàn ñoïc taäp tin: Dmin = 1 - Tröôøng hôïp xaáu nhaát khi khoâng tìm thaáy phaàn töû naøo coù giaù trò baèng X: Soá pheùp gaùn: Gmax = N + 2 Soá pheùp so saùnh: Smax = 2N + 1 Soá laàn ñoïc taäp tin: Dmax = N - Trung bình: Soá pheùp gaùn: Gavg = ½(N + 5) Soá pheùp so saùnh: Savg = (3 + 2N + 1) : 2 = N + 2 Soá laàn ñoïc taäp tin: Davg = ½(N + 1) Trang: 15
  4. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N . y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o c u -tr a c k 2.3.3. Tìm kieám theo chæ muïc (Index Search) c u -tr a c k Nhö chuùng ta ñaõ bieát, moãi phaàn töû döõ lieäu ñöôïc löu tröõ trong taäp tin döõ lieäu F thöôøng coù kích thöôùc lôùn, ñieàu naøy cuõng laøm cho kích thöôùc cuûa taäp tin F cuõng khaù lôùn. Vì vaäy vieäc thao taùc döõ lieäu tröïc tieáp leân taäp tin F seõ trôû neân laâu, chöa keå söï maát an toaøn cho döõ lieäu treân taäp tin. Ñeå giaûi quyeát vaán ñeà naøy, ñi keøm theo moät taäp tin döõ lieäu thöôøng coù theâm caùc taäp tin chæ muïc (Index File) ñeå laøm nhieäm vuï ñieàu khieån thöù töï truy xuaát döõ lieäu treân taäp tin theo moät khoùa chæ muïc (Index key) naøo ñoù. Moãi phaàn töû döõ lieäu trong taäp tin chæ muïc IDX goàm coù 2 thaønh phaàn: Khoùa chæ muïc vaø Vò trí vaät lyù cuûa phaàn töû döõ lieäu coù khoùa chæ muïc töông öùng treân taäp tin döõ lieäu. Caáu truùc döõ lieäu cuûa caùc phaàn töû trong taäp tin chæ muïc nhö sau: typedef struct IdxElement {T IdxKey; long Pos; } IdxType; Taäp tin chæ muïc luoân luoân ñöôïc saép xeáp theo thöù töï taêng cuûa khoùa chæ muïc. Vieäc taïo taäp tin chæ muïc IDX seõ ñöôïc nghieân cöùu trong Chöông 3, trong phaàn naøy chuùng ta xem nhö ñaõ coù taäp tin chæ muïc IDX ñeå thao taùc. a. Tö töôûng: Laàn löôït ñoïc caùc phaàn töû töø ñaàu taäp tin IDX vaø so saùnh thaønh phaàn khoùa chæ muïc vôùi giaù trò X cho ñeán khi ñoïc ñöôïc phaàn töû coù giaù trò khoùa chæ muïc lôùn hôn hoaëc baèng X hoaëc ñaõ ñoïc heát taäp tin IDX thì keát thuùc. Neáu tìm thaáy thì ta ñaõ coù vò trí vaät lyù cuûa phaàn töû döõ lieäu treân taäp tin döõ lieäu F, khi ñoù chuùng ta coù theå truy caäp tröïc tieáp ñeán vò trí naøy ñeå ñoïc döõ lieäu cuûa phaàn töû tìm thaáy. b. Thuaät toaùn: B1: rewind(IDX) B2: read(IDX, ai) B3: IF ai.IdxKey < X AND !(eof(IDX)) Laëp laïi B2 B4: IF ai.IdxKey = X Tìm thaáy taïi vò trí ai.Pos byte(s) tính töø ñaàu taäp tin B5: ELSE Khoâng tìm thaáy phaàn töû coù giaù trò X B6: Keát thuùc c. Caøi ñaët thuaät toaùn: Haøm IndexSearch coù prototype: long IndexSearch (char * IdxFileName, T X); Haøm thöïc hieän tìm kieám phaàn töû coù giaù trò X döïa treân taäp tin chæ muïc coù teân IdxFileName. Neáu tìm thaáy, haøm traû veà moät soá nguyeân coù giaù trò töø 0 ñeán filelength(FileName)-1 laø vò trí töông öùng cuûa phaàn töû tìm thaáy so vôùi ñaàu taäp tin döõ lieäu (tính baèng byte). Trong tröôøng hôïp ngöôïc laïi, hoaëc coù loãi khi thao taùc treân taäp tin chæ muïc haøm traû veà giaù trò –1 (khoâng tìm thaáy). Noäi dung cuûa haøm nhö sau: Trang: 16
  5. h a n g e Vi h a n g e Vi XC XC e e F- F- w w PD PD er er ! ! W W O O N N . y y bu bu to to Giaùo trình: Caáu Truùc Döõ Lieäu vaø Giaûi Thuaät k k lic lic C C w w m m w w w w o o .c .c .d o .d o long IndexSearch (char * IdxFileName, T X) c u -tr a c k c u -tr a c k { FILE * IDXFp; IDXFp = fopen(IdxFileName, “rb”); if (IDXFp == NULL) return (-1); IdxType ai; int SOIE = sizeof(IdxType); while (!feof(IDXFp)) { if (fread(&ai, SOIE, 1, IDXFp) == 0) break; if (ai.IdxKey >= X) break; } fclose(IDXFp); if (ai.IdxKey == X) return (ai.Pos); return (-1); } d. Phaân tích thuaät toaùn: - Tröôøng hôïp toát nhaát khi phaàn töû ñaàu tieân cuûa taäp tin chæ muïc coù giaù trò khoùa chæ muïc lôùn hôn hoaëc baèng X: Soá pheùp gaùn: Gmin = 1 Soá pheùp so saùnh: Smin = 2 + 1 = 3 Soá laàn ñoïc taäp tin: Dmin = 1 - Tröôøng hôïp xaáu nhaát khi moïi phaàn töû trong taäp tin chæ muïc ñeàu coù khoùa chæ muïc nhoû hôn giaù trò X: Soá pheùp gaùn: Gmax = 1 Soá pheùp so saùnh: Smax = 2N + 1 Soá laàn ñoïc taäp tin: Dmax = N - Trung bình: Soá pheùp gaùn: Gavg = 1 Soá pheùp so saùnh: Savg = (3 + 2N + 1) : 2 = N + 2 Soá laàn ñoïc taäp tin: Davg = ½(N + 1) Caâu hoûi vaø Baøi taäp 1. Trình baøy tö töôûng cuûa caùc thuaät toaùn tìm kieám: Tuyeán tính, Nhò phaân, Chæ muïc? Caùc thuaät toaùn naøy coù theå ñöôïc vaän duïng trong caùc tröôøng hôïp naøo? Cho ví duï? 2. Caøi ñaët laïi thuaät toaùn tìm tuyeán tính baèng caùc caùch: - Söû duïng voøng laëp for, - Söû duïng voøng laëp do … while? Coù nhaän xeùt gì cho moãi tröôøng hôïp? Trang: 17
ADSENSE

CÓ THỂ BẠN MUỐN DOWNLOAD

 

Đồng bộ tài khoản
2=>2