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
CẤU TRÚC DỮ LIỆU VÀ THUẬT
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 và 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 và
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 (đếm←0; đế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