Giáo trình Cấu trúc dữ liệu và thuật toán 2

20 11 0
Giáo trình Cấu trúc dữ liệu và thuật toán 2

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Coù theå xem lôùp laø coâng cuï ñeå löu tröõ caùc ñoái töôïng thoâng qua caáu truùc döõ lieäu ñeå bieåu dieãn chuùng vaø caû nhöõng phöông thöùc cô baûn thao taùc treân chuùng!. Khi la[r]

(1)

TRƯỜNG ĐẠI HỌC ĐAØ LẠT

F7 G

GIÁO TRÌNH

CU TRÚC D LIU VÀ THUT

TOÁN

(2)

Giáo trình cấu trúc liệu thuật tốn - –

MỤC LỤC

MỤC LỤC

LỜI NĨI ĐẦU

CHƯƠNG I

I/ GIỚI THIỆU TẬP TIN

I.1 Định nghóa tập tin (file)

I.2 Các thao tác sơ cấp tập tin C++

A/ Các phương thức dùng chung cho hai kiểu tập tin văn nhị phân

1) Mở tập tin

2) Đóng tập tin .9

3) Kiểm tra cuối tập tin

4) Kiểm tra trạng thái đọc, ghi liệu:

B/ Các phương thức dùng cho tập tin kiểu văn

1/ Đọc chuỗi ký tự:

2/ Ghi chuỗi ký tự:

3/ Ghi ký tự .10

4) Đọc ký tự .10

C/ Các phương thức dùng cho tập tin kiểu nhị phân 10

1/ Ghi số bytes: 10

2/ Đọc số bytes: 10

3/ Chuyển trỏ định vị việc ghi file: 10

4/ Chuyển trỏ định vị việc đọc file: 11

I.3 Tổ chức tập tin 11

II CÁC THAO TÁC CƠ BẢN TREÂN FILE 13

II.1 Tập tin 13

II.2 Tập tin mục 16

III SẮP XẾP TRÊN FILE 23

III.1 Trộn trực tiếp (Straight Merge) 23

III.2 Trộn tự nhiên (Natural Merge) 27

III.3 Trộn nhiều đường cân bằng (Balanced Multiway Merge) 29

CHƯƠNG II: CẤU TRÚC CÂY 31

I ĐỊNH NGHĨA VÀ CÁC KHÁI NIỆM CƠ BẢN 31

I.1 Định nghóa 31

I.2 Các khái niệm khác 31

II CÂY NHỊ PHÂN 33

II.1 Định nghĩa: cây nhị phân là (có thứ tự) mà số lớn nút con nút 2. 33

II.2 Vài tính chất nhị phân 33

II.3 Biểu diễn nhị phân 34

II.4 Duyệt nhị phân 35

II.4.1 Định nghóa: 35

II.4.2 Các thuật tốn duyệt nhị phân 35

(3)

Giáo trình cấu trúc liệu thuật toán - –

II.5 Một cách biểu diễn khác nhị phân 38

II.7 Xây dựng nhị phân cân hồn tồn 39

II.7.1 Định nghóa: 39

II.7.2 Xây dựng nhị phân cân hồn tồn 39

III.CÂY NHỊ PHÂN TÌM KIẾM (BST) 40

III.1 Định nghóa nhị phân tìm kiếm (BST) 40

III.2 Tìm kiếm phần tử BST 41

III.2.1 Thuật tốn tìm kiếm dạng đệ qui: 41

III.2.2 Thuật tốn tìm kiếm dạng lặp: 41

III.3 Chèn phần tử vào BST, xây dựng BST 42

III.3.1 Thao taùc chèn nút Item vào BST (dạng lặp): 43

III.3.2 Thủ tục chèn nút Item vào BST (dạng đệ qui): 43

III.3.3 Xây dựng BST 44

III.4 Phương pháp xếp BST 44

III.5 Xóa phần tử khỏi BST, hủy nhị phân 45

IV CÂY NHỊ PHÂN TÌM KIẾM CÂN BẰNG 48

IV.1 Định nghóa 48

IV.2 Chiều cao cân 49

IV.3 Chỉ số cân việc cân lại AVL 50

IV.4 Chèn phần tử vào AVL 56

IV.5 Xóa phần tử khỏi AVL 57

CHƯƠNG III: B - CÂY 60

I ĐẶC ĐIỂM CÂY NHIỀU NHÁNH 60

II ĐỊNH NGHĨA B – CÂY (bậc n) 61

III TÌM KIẾM MỘT PHẦN TỬ TRÊN B - CÂY 61

IV THÊM MỘT PHẦN TỬ VAØO B - CÂY 63

Quá trình tìm kiếm thêm phần tử vào B - 64

IV.1 Giải thuật tìm thêm phần tử vào B - 64

IV.2 Giải thuật xây dựng B - 65

V XÓA MỘT PHẦN TỬ KHỎI B - CÂY 67

V.1 Hai tình loại bỏ khóa B-cây 67

V.2 Giải thuật loại bỏ khóa B-cây 68

CHƯƠNG IV: BẢNG BĂM 72

I.ĐẠT VẤN ĐỀ, MỤC ĐÍCH, Ý NGHĨA 72

II PHƯƠNG PHÁP BIẾN ĐỔI KHÓA 72

H : K → A 72

III HAØM BIẾN ĐỔI KHÓA (hàm băm) 73

H[k] = k mod M 73

IV GIẢI QUYẾT SỰ ĐỤNG ĐỘ 75

IV.1 Phương pháp băm liên kết 75

IV.1.1 Phương pháp băm liên kết trực tiếp 75

IV.1.2 Phương pháp băm liên kết kết hợp 77

IV.2 Băm theo phương pháp địa mở 78

IV.2.1 Phương pháp băm (thử) tuyến tính 79

(4)

Giáo trình cấu trúc liệu thuật tốn - –

IV.2.3 Phương pháp băm kép 81

BÀI TẬP “CẤU TRÚC DỮ LIỆU & THUẬT TỐN 2” 85

Bài tập chương (File) 85

Bài tập chương (Cấu trúc cây) 88

Bài tập chương (B - cây) 91

Bài tập chương (Bảng băm) 91

(5)

Giáo trình cấu trúc liệu thuật toán - –

LỜI NĨI ĐẦU

Giáo trình nhằm cung cấp cho sinh viên kiến thức nâng cao cấu trúc liệu thuật tốn có liên quan Để nắm bắt kiến thức trình bày giáo trình, sinh viên cần nắm kiến thức tin học đại cương, kỹ thuật lập trình, nhập mơn cấu trúc liệu thuật tốn Các kiến thức tạo điều kiện cho sinh viên học tiếp kiến thức kỹ thuật lập trình nâng cao, đồ họa, lập trình hệ thống, trí tuệ nhân tạo,

Nội dung giáo trình gồm chương:

- Chương 1: Giới thiệu thao tác file C++, kiểu file mục

- Chương 2: Giới thiệu loại cấu trúc liệu động khác thao tác nhị phân, nhiều nhánh đặc biệt nhị phân tìm kiếm, AVL

- Chương 3: Trình bày loại nhiều nhánh đặc biệt B – Nó có nhiều ứng dụng việc lưu trữ tìm kiếm liệu lớn

- Chương 4: Giới thiệu phương pháp tìm kiếm hiệu liệu lớn dựa vào bảng băm: phương pháp băm liên kết, băm theo địa mở

Chắn chắn giáo trình cịn nhiều khiếm khuyết, tác giả mong muốn nhận biết ơn ý kiến q báu đóng góp đồng nghiệp bạn đọc để giáo trình hồn thiện mặt nội dung hình thức lần tái sau

Đà lạt, 06/2002

Tác giả

(6)(7)

Giáo trình cấu trúc liệu thuật tốn - –

CHƯƠNG I

I/ GIỚI THIỆU TẬP TIN

I.1 Định nghóa tập tin (file)

Tập tin tập thông tin đối tượng có quan hệ với nhau, lưu giữ thành đơn vị nhớ

Trên thực tế, ta thường cần dùng đến tập tin để lưu lâu dài thông tin với số lượng lớn Các phương pháp xếp tìm kiếm giới thiệu giáo trình “Cấu trúc liệu thuật tốn 1” áp dụng lượng liệu không lớn lưu giữ nhớ

I.2 Các thao tác sơ cấp tập tin C++

Ta xét hai kiểu tập tin ngôn ngữ C++: tập tin nhị phân tập tin văn

- Tập tin nhị phân: dữ liệu ghi tập tin theo bytes nhị phân giống chúng lưu trữ nhớ chúng khơng bị biến đổi trong q trình nhập xuất Khi đọc đến cuối tập tin ta nhận mã kết thúc tập tin EOF

- Tập tin văn bản: tập tin lưu trữ từ dịng Nó khác tập tin kiểu nhị phân xử lý ký tự chuyển dòng ký tự kết thúc tập tin văn trong thao tác đọc ghi

C++ ngôn ngữ phục vụ cho phương pháp lập trình hướng đối tượng Trong phương pháp này, khái niệm quan trọng lớp Có thể xem lớp công cụ để lưu trữ đối tượng thông qua cấu trúc liệu để biểu diễn chúng phương thức thao tác chúng Khi làm việc với tập tin C++, thao tác

tập tin phương thức thuộc lớp ifstream, ofstream, fstream, ios

(8)

Giáo trình cấu trúc liệu thuật toán - –

1) Mở tập tin

* Trước làm việc với tập tin (đọc hay ghi) ta phải mở để nhận tên ngồi (tên file thực tế nằm đĩa), thực số việc

kiểm tra phân tích cú pháp, trao đổi với hệ điều hành tạo tên

nội đại diện (biến file hình thức) để dùng sau việc đọc hay ghi lên tập tin Tên nội trỏ (gọi trỏtập tin), trỏ tới cấu trúc chứa thông tin tập tin, chẳng hạn như: vị trí đệm file, vị trí byte đệm, tập tin đọc hay ghi, nối thêm,

* Khai báo mở tập tin theo cú pháp sau:

fstream BienFileHinhThuc(const char *FileName, int mode);

trong FileName là tên tập tin có kiểu xâu ký tự, mode nhận số

trong giá trị sau (và chúng nối kết tốn tử logic bit ¦ ):

ios::in: mở tập tin để đọc Nếu tập tin chưa tồn bị lỗi

Phần chọn bỏ qua thay lớp fstream bởi ifstream

ios::out: mở tập tin để ghi mới Nếu tập tin tồn bị

xóa Phần chọn bỏ qua thay lớp fstream bởi ofstream

ios::app: mở tập tin để ghi bổ sung Nếu tập tin chưa tồn tạo tập tin

ios::binary: mở tập tin theo kiểu nhị phân Nếu khơng có phần tập

tin mở theo kiểu văn bản

* Chú ý:

- Nếu mở tập tin chưa tồn để ghi hay nối thêm tập tin

được tạo

- Mở tập tin có để ghi làm cho nội dung cũ bị mất

trước ghi mới!

- Mở tập tin chưa có để đọc sinh lỗi

- Nếu có lỗi mở tập tin BienFileHinhThuc nhận giá trị NULL

* Ví dụ: Khai báo

char TenFile[] = “Tam.dat”;

fstream f(TenFile, ios::in ¦ios::out ¦ ios::binary);

if (!f) cout <<”\nLoi mo file ” << TenFile << “ de doc va ghi !”;

(9)

Giáo trình cấu trúc liệu thuật tốn - –

2) Đóng tập tin

Sau mở tập tin làm thao tác đọc ghi xong, ta phải đóng tập

tin theo cú pháp:

BienFileHinhThuc.close();

Phương thức phá vỡ mối liên hệ BienFileHinhThuc tên

ngồi thiết lập Ngồi ra, cịn có tác dụng đẩy nốt nội dung

đệm file (an toàn liệu)

3) Kiểm tra cuối tập tin

BienFileHinhThuc.eof ();

Hàm cho giá trị khác gặp cuối tập tin khi đọc, trái lại hàm cho trị (ta thường dùng phương thức để kiểm tra cuối tập tin sau lệnh đọc trình bày phần sau)

4) Kiểm tra trạng thái đọc, ghi liệu: BienFileHinhThuc.good();

Hàm trả gặp lỗi đọc hay ghi giá trị khác không trường hợp ngược lại

B/ Các phương thức dùng cho tập tin kiểu văn 1/ Đọc chuỗi ký tự:

char *BienFileHinhThuc.getline(char *line, int maxLine, char delim);

Hàm đọc dòng (kể dấu xuống dòng khoảng trắng)

từ tập tin định BienFileHinhThuc vào chuỗi ký tự line, nhiều

nhất maxLine-1 ký tự đọc vào; việc đọc kết thúc gặp ký tự delim Dòng kết qủa kết thúc ‘\0’ Thông thường hàm trả địa chuỗi line, trừ gặp cuối tập tin gặp lỗi cho trị NULL

Phương thức int BienFileHinhThuc.gcount() trả số ký tự vừa

đọc

2/ Ghi chuỗi ký tự:

BienFileHinhThuc<< Chuoãi;

(10)

Giáo trình cấu trúc liệu thuật tốn - 10 –

3/ Ghi ký tự

BienFileHinhThuc.put(char c);

Hàm ghi ký tự ra file định bởiBienFileHinhThuc

4) Đọc ký tự

char BienFileHinhThuc.get();

* Hàm đọc ký tự từ file được định

BienFileHinhThuc làm dời chỗ vị trí trỏ định vị việc đọc tập tin đến vị trí kế tiếp

* Hàm get trả ký tự đọc được, thành công.

C/ Các phương thức dùng cho tập tin kiểu nhị phân 1/ Ghi số bytes:

BienFileHinhThuc.write(const char *buf, int size);

Hàm ghi vào file định BienFileHinhThuc số

size bytes, địa buf 2/ Đọc số bytes:

BienFileHinhThuc.read(char *buf, int size);

Hàm đọc từ file định BienFileHinhThuc số size

bytes gán chúng vào mảng ký tự xác định bởi buf

Có thể dùng phương thức int BienFileHinhThuc.gcount() để biết số

bytes vừa đọc

3/ Chuyển trỏ định vị việc ghi file:

BienFileHinhThuc.seekp(long offset, int origin);

Để truy cập ngẫu nhiên tập tin ghi ta dùng hàm để đặt

trỏ định vị việc ghi trong tập tin định BienFileHinhThuc di

chuyển offset bytes từ vị trí xuất phát xác định theo giá

trị sau origin:

ios::beg tìm từ đầu tập tin

ios::cur tìm từ vị trí hành

ios::end tìm từ cuối tập tin Phương thức

long BienFileHinhThuc.tellp();

(11)

Giáo trình cấu trúc liệu thuật toán - 11 –

4/ Chuyển trỏ định vị việc đọc file:

BienFileHinhThuc.seekg(long offset, int origin);

Để truy cập ngẫu nhiên tập tin đọc ta dùng hàm để đặt

trỏ định vị việc đọc trong tập tin định BienFileHinhThuc di

chuyển offset bytes từ vị trí xuất phát xác định theo giá trị origin Phương thức

long BienFileHinhThuc.tellg();

trả vị trí hành trỏ định vị việc đọc tập tin

Lưu ý truy cập ngẫu nhiên tập tin để đọc hay ghi, bytes

đánh số 0.

I.3 Tổ chức tập tin

Dựa thao tác sơ cấp truy nhập file đây, ta xây

dựng thuật toán phức tạp hữu ích khác file chứa đối tượng

có cấu trúc Khi xét đến độ hiệu thuật toán (đặc biệt mặt thời gian), ta tổ chức file theo kiểu: hay có mục

* Khi lưu truy cập đối tượng theo kiểu file, ta có kiểu file

Ví dụ 1: Giả sử ta cần lưu đối tượng A, C, B kiểu T vào file

f.

f A C B

Tuy cách lưu trữ đơn giản cài đặt ta gặp nhiều nhược điểm

(về mặt thời gian) khi gặp tình sau Nếu ta cần chèn thêm đối tượng D vào

trước A ta phải dời phần tử từ A qua phải vị trí; ta muốn xóa đối tượng A, ta phải dời phần tử từ A qua trái vị trí Đối với tập tin lưu nhiều đối

tượng có kiểu liệu T (trên thực tế, ta thường gặp trường hợp T có kích thước

(bytes) lưu trữ lớn), phải dùng nhiều thao tác chèn xóa sẽ mất nhiều thời

gian cho việc dời chỗ phần tử Để khắc phục nhược điểm trên, ta tổ chức tập

tin theo kiểu mục đơn giản như sau:

* Khi cần lưu dãy đối tượng có kiểu T vào file f,

(12)

Giáo trình cấu trúc liệu thuật tốn - 12 – chỉ mục f_idx tương ứng để chứa địa (hay thứ tự) đối tượng

thực file f Khi đó, các thao tác chèn, xóa thực nhanh hơn

Ví dụ 2: với mục đích ví dụ 1, ta dùng file: file f để chứa

các đối tượng thực A, B, C file f_idx dùng để chứa số thứ tự bắt đầu

của đối tượng tương ứng f như sau:

0 f A B C

f_idx -1

trong đó: phần tử f_idx: 0,1,2 số thứ tự (bắt đầu) đối

tượng A, B, C file f; –1 (EOF) để kiện kết thúc file

Việc chèn D vào f trước A, thực sau:

0 f A B C D

f_idx -1 Việc xóa A, ta đánh dấu xóa A (nếu cần thiết !) cách

gán số –2 (XOA) cho mẩu tin tương ứng f_idx và đổi lại số thứ tự

bắt đầu mẩu tin tương ứng f trước A (là D) sau:

f A B C D

f_idx -2 -1

Tất nhiên, việc dùng kèm thêm file mục có ưu điểm làm tăng tốc độ thực thao tác chèn, xóa; ngược lại, tốn thêm bộ nhớ cho f_idx làm phức tạp thêm viết thao tác

trên file, đặc biệt thuật tốn chèn, xóa đối tượng * Vài lưu ý thiết kế thuật toán tập tin:

Khi thiết kế thuật tốn tập tin, ngồi phép toán

(13)

Giáo trình cấu trúc liệu thuật tốn - 13 – chú ý nhiều tới số lần đọc ghi đối tượng lên file, thời gian cho thao

tác chiếm thời gian lớn

II CÁC THAO TÁC CƠ BẢN TREÂN FILE

Các thao tác thường sử dụng làm việc file chứa đối tượng có

cùng cấu trúc là: tạo (xây dựng) file, duyệt khai thác file, tìm hay xóa một đối

tượng có tính chất file, chèn (thêm) đối tượng vào sau đối

tượng thỏa tính chất file, sửa (thay thế) đối tượng thỏa

tính chất file đối tượng khác

II.1 Tập tin

* Thao tác tạo file (hay nhập liệu vào file) f : thao tác xây dựng file mà

dữ liệu lấy từ nguồn đó, ta dùng hàm

Boolean LấyĐượcMộtĐốiTượng(ĐT)

Hàm trả trị true nếu lấy đối tượng trả trị false

trong trường hợp ngược lại TạoFile (f)

- Bước 1: Mở file f để ghi (hay nối thêm);

- Bước 2: Trong LấyĐượcMộtĐốiTượng(ĐT)

GhiMộtĐốiTượng(ĐT) vào file f;

- Bước 3: Đóng file f;

* Thao tác duyệt file (hay khai thác file) f : thao tác xử lý tất các đối

tượng (mỗi đối tượng xét lần) thỏa tính chất TC nào

file f

DuyệtFile (f, TC)

- Bước 1: Mở file f để đọc

- Bước 2: Trong ĐọcĐượcMộtĐốiTượng(ĐT) từ file f

Nếu (ĐT có tính chất TC)

thì XửLýĐốiTượng(ĐT); // khơng làm thay đổi ĐT

trong f

(14)

Giáo trình cấu trúc liệu thuật toán - 14 –

* Thao tác tìm (tuần tự) một đối tượng A có tính chất TC nào

đó file f: thao tác trả trị True tìm thấy False trường

hợp ngược lại Ngồi trường hợp tìm thấy đối tượng A, cịn trả

lại vị trí bắt đầu ĐốiTượngThứ (các mẫu tin đánh số bắt đầu từ 0) của

A trong file f

Boolean Tìm (f, TC, &A, &ĐốiTượngThứ)

- Bước 1: Mở file f để đọc; Thấy ← False; ĐốiTượngThứ ← -1;

- Bước 2: Lặp lại bước sau:

Đọc đối tượng B (từ file f );

ĐốiTượngThứ ĐốiTượngThứ +1; Nếu (B có tính chất TC) thì:

A B; Thấy ← True;

Cho đến khi: ((kết thúc file f) Thấy);

- Bước 3: Đóng file f;

- Bước 4: Trả trị Thấy;

* Thao tác sửa đối tượng có tính chất TC nào file f

thành đối tượng B (cùng kiểu với A): thao tác trả trị True tìm

thấy False trường hợp ngược lại Boolean Sửa (f, TC, B)

- Bước 1: Thấy Tìm(f, TC, A, Thứ);

- Bước 2: If not(Thay) SửaĐược ← False;

Else

Bước 21: Mở file f để ghi (và đọc);

Bước 22: Nhảy đến đầu đối tượng thứ Thứ; Ghi B vào

file f;

Bước 23: Đóng file f ;

Bước 24: SửaĐược ←True;

- Bước 3: Trả trị SửaĐược;

* Thao tác xoá đối tượng có tính chất TC nào file f

: thao tác trả trị True tìm thấy đối tượng có tính chất TC

False trường hợp ngược lại Boolean Xoá (f, TC)

- Bước 1: Thấy Tìm(f, TC, A, Thứ);

- Bước 2: If not(Thay) XoáĐược ← False;

(15)

Giáo trình cấu trúc liệu thuật toán - 15 –

Bước 21: Mở file f để đọc; Mở file phụ f_phu để ghi;

Bước 22: for (đếm0; đếm<Thứ ; Thứ++)

Đọc đối tượng B từ file f ;

Ghi đối tượng B lên file f_phu;

Bước 23: Đọc đối tượng B từ file f ;

// bỏ qua đối tượng B có tính chất TC, không ghi lên

file f_phu

Bước 24: Lặp lại bước sau:

Đọc đối tượng B từ file f; Ghi đối tượng B lên file f_phu; Cho đến khi: kết thúc file f;

Bước 25: Đóng file f ; Đóng file f_phu;

Xoá file f ; Đổi tên file f_phu thành f;

Bước 26: XoáĐược ←True;

- Bước 3: Trả trị XoáĐược;

* Thao tác chèn đối tượng C sau đối tượng có tính

chất TC nào file f : thao tác trả trị True tìm thấy đối

tượng có tính chất TC và False trường hợp ngược lại

Boolean Cheøn (f, C, TC)

- Bước 1: Thấy Tìm (f, TC, A, Thứ);

- Bước 2: If not(Thấy) ChènĐược ← False;

Else

Bước 21: Mở file f để đọc ghi;

Bước 22: Nhảy đến đầu đối tượng thứ (Thứ+1);

Bước 23: Lặp lại bước sau:

Xem đối tượng B của file f ;

// Đọc đối tượng B và nhảy lại đầu đối tượng B

vừa đọc được;

Ghi đối tượng C lên file f ;

C B;

Cho đến khi: kết thúc file f; Bước 24: Ghi đối tượng C lên file f ;

Bước 25: Đóng file f ; ChènĐược ←True;

- Bước 3: Trả trị ChènĐược;

(16)

Giáo trình cấu trúc liệu thuật toán - 16 –

II.2 Tập tin mục

Khi làm việc với file mục, ta xét file f (chứa đối tượng thật sự) kèm với file mục f_idx tương ứng (chứa số thứ tự bắt đầu đối tượng tương

ứng file f) Ký hiệu:F=(f,f_idx), EOF = -1 số kết thúc file, CHỈSỐXÓA

= -2 số mẩu tin bị xóa

Trong thuật tốn trình bày phần này, ta sử dụng thao tác sơ cấp sau đây:

- Đọc1ĐốiTượngTrongFileDat(f, Thứ_Dat, &ĐốiTượng): có tác dụng

đọc đối tượng ĐốiTượng ở vị trí thứ Thứ_Dat từ file liệu f Việc đọc bị thất bại Thứ_Dat=EOF (hết file logic !) Thứ_Dat=

CHỈSỐXĨA(mẩu tin bị xóa);

2=ThứDat

f

A E C = ĐốiTượng D

f_idx -2 -1

Đã xóa Kết thúc file

logic

- Đọc1ĐốiTượngTrongFileIdx (f_idx, Thứ_Idx, &ChỉSốDat): có tác

dụng đọc nội dung file mục f_idx tại vị trí thứ Thứ_Idx, cho

kết số ChỉSốDat trong file f (nếu ChỉSốDat =EOF: hết file

logic !);

f

A E C D

f_idx -2 -1

Thứ_Idx = 0; 1=Thứ_Idx; Thứ_Idx

=

ChỉSốDat = 3; ChỉSốDat = -2 = CHỈSỐXÓA; ChỉSốDat = -1 = EOF

(17)

Giáo trình cấu trúc liệu thuật tốn - 17 –

- Ghi_1_PTửTạiVịTrí(g, Thứ, PTử): có tác dụng ghi phần tử

PTử tại vị trí thứ Thứ vào file g

- ThứSau_Dat = NextDat(f_idx, ThứTrước_Dat): có tác dụng trả lại

số thứ tự bắt đầu ThứSau_Dat của mẩu tin (theo mục)

của mẩu tin vị trí thứ ThứTrước_Dat trong file f (chính nội

dung mẩu tin thứ ThứTrước_Dat+1 file f_idx) (nếu

ThứSau_Dat =EOF: hết file logic !);

ThứSau_Dat=1 ThứTrước_Dat=3

f

A E C D

f_idx -2 -1

(nếu ThứTrước_Dat =2 ThứSau_Dat=-1=EOF: hết file lôgic)

- ThứSau_Idx = NextIdx (f_idx, ThứTrước_Idx, &ChỉSốDat): có tác

dụng trả lại nội dung ChỉSốDat của mẩu tin thứ ThứTrước_Idx trong

file f_idx số thứ tự bắt đầu ThứSau_Idx (ThứSau_Idx chính

ChỉSốDat +1) của mẩu tin theo thứ tự mục mẩu tin vị trí thứ ThứTrước_Idx trong file f_idx

ChỉSốDat=3 f

A E C D

f_idx -2 -1

ThứTrước_Idx = 0 ThứSau_Idx=4

* Thao tác tạo file (hay nhập liệu vào file) mục F : thao tác xây

dựng file mà liệu lấy từ dãy đối tượng đó, ta dùng hàm

Boolean LấyĐượcMộtĐốiTượng(ĐT)

Hàm trả trị true nếu lấy đối tượng trả trị false

trong trường hợp ngược lại

(18)

Giáo trình cấu trúc liệu thuật toán - 18 – f

A B C D

f_idx -1 TaïoFileIdx (f)

- Bước 1: Mở file F để ghi; SốĐốiTượngLấyĐược ← 0;

- Bước 2: Trong (LấyĐượcMộtĐốiTượng(ĐT)), lặp lại

bước sau:

Bước 21: GhiMộtĐốiTượng(ĐT) vào cuối file f;

Bước 22: GhiMộtSố (SốĐốiTượngLấyĐược) vào cuối

file f_idx;

Bước 23: SốĐốiTượngLấyĐược

SốĐốiTượngLấyĐược + 1;

- Bước 3: GhiMộtSố (EOF) vào cuối file f_idx; Đóng file F;

* Thao tác duyệt file mục F: thao tác xử lý tất đối tượng

thỏa tính chất TC nào file F

Duyệt

F

A E C D

f_idx -2 -1

ChỉSốDat = Thứ_Idx

=4

Đã xóa Kết thúc file logic

DuyeätIdx (F, TC)

- Bước 1: Mở file F để đọc; Đọc1ĐốiTượngTrongFileIdx (f_idx, 0,

&ChỉSốDat);

// hay: Đọc mẩu tin (đầu) ChỉSốDat của f_idx;

- Bước 2: Trong (ChỉSốDat EOF) // hay chưa hết file lôgic

lặp lại bước sau:

Đọc1ĐốiTượngTrongFileDat(f,ChỉSốDat,ĐốiTượng);

If (ĐốiTượng có tính chất TC) XửLý(ĐốiTượng); ChỉSốDat = NextDat(f_idx, ChỉSốDat);

(19)

Giáo trình cấu trúc liệu thuật toán - 19 –

* Thao tác tìm (tuần tự) một đối tượng (chưa bị xóa) A có tính

chất TC nào file mục F: thao tác trả trị True tìm thấy False trường hợp ngược lại Ngồi ra, trường hợp tìm thấy,

cịn trả lại vị trí Thứ_Idx của mẩu tin file mục f_idx mà nội dung

của vị trí bắt đầu đối tượng tìm thấy A

Tìm (TC)

f

A B C D

f_idx -1

Thứ_Idx =

4

Boolean TìmIdx (F, TC, &A, &Thứ_Idx)

- Bước 1: Mở file F để đọc; Thấy ← False; Thứ_Idx ← 0;

ThứSau_Idx = NextIdx (f_idx, Thứ_Idx,ChỉSốDat);

- Bước 2: Trong (ChỉSốDat EOF or Chưa Thấy) lặp lại

bước sau:

Đọc1ĐốiTượngTrongFileDat(f,ChỉSốDat,ĐốiTượn g);

If (ChỉSốDat == CHỈSỐXÓA)

Thông báo lỗi cập nhật sai đối tượng bị xoá;

Chuyển sang bước 3;

If (ĐốiTượng có tính chất TC)

A ĐốiTượng; Thấy ← True;

Else Thứ_Idx ThứSau_Idx;

ThứSau_Idx = NextIdx (f_idx, Thứ_Idx,ChỉSốDat);

- Bước 3: Đóng file F;

- Bước 4: Trả trị Thấy;

* Thao tác sửa đối tượng (chưa bị xố) có tính chất TC

nào file mục F thành đối tượng B: thao tác trả trị True

nếu tìm thấy đối tượng cần sửa False trường hợp ngược lại

Tìm (TC)

(20)

Giáo trình cấu trúc liệu thuật tốn - 20 – f

A E C D

f_idx -1

Thứ_Idx

=4

Sửa ChỉSốDat = (TC)

F

B E C D

f_idx -1

Thứ_Idx

=4

Boolean SửaIdx (F, TC, B)

- Bước 1: Thấy TìmIdx (F, TC, A, Thứ_Idx);

- Bước 2: If not(Thấy) SửaĐược ← False;

Else

Bước 21: Mở file F để ghi (và đọc);

Bước 22: Đọc1ĐốiTượngTrongFileIdx

(f_idx,Thứ_Idx,ChỉSốDat);

Ghi_1_PTửTạiVịTrí(f, ChỉSốDat, B);

Bước 23: Đóng file F;SửaĐược ←True;

- Bước 3: Trả trị SửaĐược;

* Thao tác xoá đối tượng (chưa bị xố) có tính chất TC

nào file mục F: thao tác trả trị True tìm thấy đối

tượng cần xóa False trường hợp ngược lại

Tìm (TC)

3

f

A B C D

f_idx 1 -1

Thứ_Idx

=4

Ngày đăng: 11/03/2021, 11:31

Tài liệu cùng người dùng

Tài liệu liên quan