Trong cây nhị phân tìm kiếm thì phần tử nhỏ hơn nút gốc thì sẽ được chứa trong cây con trái, phần tử lớn hơn nút gốc sẽ được chứa trong cây con phải.. Trong đề tài này, chúng ta sẽ tìm h
Trang 122:54 06/06/2023 Documents Downloader
TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI
Khoa Công nghệ thông tin -
-BÁO CÁO MÔN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
ĐỀ TÀI:
XÂY DỰNG LỚP TÌM KIẾM CÂY NHỊ PHÂN ÁP DỤNG QUẢN LÍ TỪ
ĐIỂN ANH – VIỆT
Giáo viên hướng dẫn: Nguyễn Việt Hưng Nhóm sinh viên thực hiện:
1 Nguyễn Thị Thùy Dương – MSV: 211203480
2 Hoàng Dương – MSV: 211211444
Trang 222:54 06/06/2023 Documents Downloader
Trang 322:54 06/06/2023 Documents Downloader
Lời mở đầu
Cây tìm kiếm nhị phân (Binary Tree) trong C++ là một cấu trúc dữ liệu dựa trên các nút, mỗi nút gồm 2 cây con được gọi là cây con trái và cây con phải Trong cây nhị phân tìm kiếm thì phần tử nhỏ hơn nút gốc thì sẽ được chứa trong cây con trái, phần tử lớn hơn nút gốc sẽ được chứa trong cây con phải Vì vậy khi tìm kiếm một phần tử trong cây nhị phân chúng ta sẽ bỏ qua một nửa tổng sổ phần tử, do đó dẫn đến thời gian tìm kiếm nhanh hơn và độ phức tạp về thời gian tốt hơn với độ phức tạp O(logn)
Trong đề tài này, chúng ta sẽ tìm hiểu cách xây dựng một lớp cây nhị phân tìm kiếm sau đó áp dụng vào quả lí từ điển với các chức năng thêm, sửa, xóa
Trang 422:54 06/06/2023 Documents Downloader
Mục lục
Lời mở đầu 1
Mục lục 2
I Giới thiệu đề tài 3
1 Giới thiệu 3
2 Mục tiêu 3
II Xây dựng đề tài 4
1 Xây dựng lớp Data 4
2 Cây nhị phân tìm kiếm 5
3 Thêm một từ vào trong cây 6
4 Đọc - ghi file 6
5 Cập nhật một từ trong từ điển 9
6 Tìm kiếm một từ trong cây 10
7 Xóa một từ trong cây 11
III Kết luận 14
Tài liệu tham khảo 15
Trang 522:54 06/06/2023 Documents Downloader
I Giới thiệu đề tài
1 Giới thiệu
Từ điển là một kho dữ liệu chứ đến hàng trăm, hàng nghìn, thậm chí là hàng trăm nghìn, hàng triệu từ, vì vậy khi chúng ta muốn tìm kiếm một từ hoặc nghĩa của từ đó sẽ tốn khá nhiều thời gian và công sức Để cải thiện chúng ta sử dụng cây tìm kiếm nhị phân vào cài đặt từ điển sẽ tối ưu được thời gian tìm kiếm và sẽ tìm kiếm được nhanh hơn Trong đề tài này chúng ta sẽ sử dụng cây tìm kiếm nhi phân để cài đặt một file dữ liệu từ điển Anh-Việt để phục vụ thực hện các thao tác: thêm từ vào cây, duyệt cây, xóa từ trong cây, cập nhật từ, tìm kiếm
2 Mục tiêu
Dựa trên những yêu cầu của đề bài, các mục tiêu của đề tài hướng đến:
1.1 Xây dựng lớp tìm kiếm cây nhị phân 1.2 Viết chương trình quản lí từ điển Anh – Việt, từ điển được lưu vào cây nhị phân mà tại mỗi nút của nó lưu một từ tiếng Anh và nghĩa tiếng Việt của nó có các chức năng:
a Đọc từ điển từ file để xây dựng cây
b Ghi từ điển trong cây vào file (duyệt theo thứ tự giữa, duyệt đến nút nào ghi vào file giá trị của nút đó)
c Thêm một từ mới vào từ điển đang lưu trong cây
d Xóa bỏ một từ trong từ điển đang lưu trong cây
e Cập nhật lại một từ đang lưu trong cây
f Tìm kiếm một từ đang lưu trong cây
Trang 622:54 06/06/2023 Documents Downloader
II Xây dựng đề tài
1 Xây dựng lớp Data
Hình 1: Cấu trúc của lớp Data
Trong lớp dữ liệu Data chúng ta gồm có:
+ string tu: khai báo kiểu dữ liệu cho từ tiếng Anh
+ string nghia: khai báo liểu dữ liệu cho nghĩa tiêng Việt tương ứng của từ
Trang 722:54 06/06/2023 Documents Downloader
+ Có các phương thức nhập >> và xuất <<
2 Cây nhị phân tìm kiếm
- Mỗi cây nhị phân phải đam bảo nguyên tắc bố trí khóa tại mỗi nút:
+ Các nút nhỏ hơn nút gốc thì được bố trí tại cây con trái
+ Các nút lớn hơn nút gốc thì được bố trí tại cây con phải
- Lớp cây nhị phân tìm kiếm của chúng ta là BTree chứa dữ liệu, một con trỏ trái và một con trỏ phải
Hình 2: Cấu trúc 1 node của cây nhị phân tìm kiếm
- Thuộc tính:
+ Dữ liệu của lớp Data: là phần dữ liệu cho vào các nút cảu cây
+ BTree *left: là con trỏ trỏ đến node lưu trữ địa chỉ của cây con trái
+ BTree *right: là con trỏ trỏ đến node lưu trữ địa chỉ của cây con phải
- Phương thức:
+ BTree(): hàm khởi tạo cây con trái, cây con phải
Trang 822:54 06/06/2023 Documents Downloader
+ BTree(Data x): hàm khởi tạo node gốc khi cây rỗng
3 Thêm một từ vào trong cây
nếu node được thêm vào bé hơn node gốc thì chúng ta sẽ thêm node đó vào cây con trái, nếu node được thêm vào lớn hơn node gốc thì chúng ta sẽ thêm node
đó vào cây con phải
Thực hiện thuật toán:
Hình 3: Hàm thêm một phần tử vào cây
Đầu tiên chúng ta sẽ kiểm tra xem nếu cây rỗng thì sẽ trả về hàm khởi tạo node
thêm vào cây con trái, còn nếu node được thêm vào lớn hơn node gốc thì ta sẽ
4 Đọc - ghi file
Để đọc – ghi file trong C++ ta sử dụng cú pháp: ifstream và ofstream trong đó:
+ ofstream dùng để ghi file
Trang 922:54 06/06/2023 Documents Downloader
Đối với yêu cầu đọc file (txt) để xây dựng cây trước tiên chúng ta có cấu trúc file như sau:
Hình 4: Cấu trúc file txt
Hình 5: Đọc file xây dựng cây
Tiếp đó, chúng ta khởi tạo một biến in để đọc file tudien.txt bằng cách sử dụng
Trang 1022:54 06/06/2023 Documents Downloader
đang mở hay không, nếu file đang được mở chúng ta sẽ sử dụng vòng lặp
số lượng từ cho trước và khi đọc đến từ nào thì chúng ta sẽ gọi lại hàm insert và
cây
Đối với yêu cầu ghi file thì trước tiên chúng ta khởi tạo một file txt có tên
Hình 6-1: Duyệt cây – ghi file
được ghi trước đó Đầu tiên, chúng ta sẽ kiểm tra xem cây có rỗng hay không, nếu không thì chúng ta sẽ duyệt cây con trái của node gốc trước tiên, sau khi duyệt hết thì in ra dữ liệu của node rồi sau đó duyệt sang cây con phải Đây là phương pháp duyệt giữa
Sau khi thực hiện duyệt cây theo duyệt giữa và ghi file ta sẽ có được một file sau khi ghi có cấu trúc như sau:
Trang 1122:54 06/06/2023 Documents Downloader
Hình 6-2: Cấu trúc của file sau khi duyệt và ghi
5 Cập nhật một từ trong từ điển
node của cây đến khi tìm ra node cần cập nhật, nếu tìm thấy thì chúng ta sẽ cho
cây
Thực hiện thuật toán:
Hình 5-1: Hàm cập nhật 1 từ trong từ điển
Đầu tiên chúng ta kiểm tra xem nếu cây rỗng thì thoát khỏi hàm Tiếp đó, kiểm tra xem nếu phần tử cần cập nhật nhỏ hơn node gốc thì chúng ta gọi đệ quy lại hàm và duyệt sang cây con trái, nếu phần tử cần cập nhật lớn hơn node gốc thì chúng ta gọi đệ quy lại hàm và duyệt sang cây con phải Nếu chúng ta tìm thấy
Trang 1222:54 06/06/2023 Documents Downloader
và thoát khỏi hàm
Hình 5-2: Thực thi hàm cập nhật
cần cập nhật Ngược lại, thì tìm thấy chúng ta sẽ nhập vào sự thay đổi của từ và duyệt lại cây để cập nhật lại sự thay đổi của từ điển
6 Tìm kiếm một từ trong cây
của cây, nếu tìm thấy node cần tìm thì cho biếnck = 1 rồi in ra từ cần tìm
Thực hiện thuật toán:
Hình 6-1: Hàm tìm kiếm một từ trong cây
Trang 1322:54 06/06/2023 Documents Downloader
Đầu tiên chúng ta sẽ kiểm tra xem cây có rỗng hay không nếu câu rỗng thì thoát khỏi hàm Nếu không thì chúng ta sẽ so sánh từ cần tìm với node gốc nếu từ cần tìm nhỏ hơn node gốc thì gọi đệ quy lại hàm duyệt sang cây con trái, nếu từ cần tìm lớn hơn node gốc thì gọi đệ quy lại hàm duyệt sang cây con phải Nếu tìm
Hình 6-2: Thực thi hàm tìm kiếm
ta sẽ in ra từ cần tìm
7 Xóa một từ trong cây
Ý tưởng: khi xóa 1 node trong cây sẽ có 3 trường hợp xảy ra:
+ Xóa node lá + Xóa node có 1 cây con: tìm mối liên kết của node cha của node cần xóa với node con của node cần xóa
+ Xóa node có 2 cây con: tìm node nhỏ nhất của cây con phải hoặc node lớn nhất của cây con trái để làm node thay thế node bị xóa liên kết hai cây con của node bị xóa
Thực hiện thuật toán:
Trang 1422:54 06/06/2023 Documents Downloader
Hình 7-1: Hàm tìm node thay thế
xuống để tìm ra node thay thế rồi trả về giá trị của noderes
Hình 7-2: Hàm xóa một node trong cây
Trang 1522:54 06/06/2023 Documents Downloader
Đầu kiểm kiểm tra xem nếu cây rỗng thì trả về giá trị của node gốc Nếu không thì chúng ta so sánh từ cần xóa với node gốc nếu từ cần xóa nhỏ hơn node gốc thì gọi đệ quy lại hàm và duyệt sang trái, nếu từ cần xóa lớn hơn node gốc thì gọi đệ quy lại hàm và duyệt sang phải Khi tìm thấy từu cần xóa chúng ta sẽ kiểm tra xem nếu từ cần xóa không có cây con trái thì ta cần tìm mối liên hệ của node con node cần xóa với node cha của node cần xóa Ta sẽ gán dữ liệu ở cây
xóa không có cây con phải Nếu node cần xóa có hai cây con thì chúng ta cần tìm ra tìm node nhỏ nhất của cây con phải hoặc node lớn nhất của cây con trái
node nhỏ nhất ở cây con phải sau đó sao chép dữ liệu của node kế nhiệm vào node này rồi xóa node kế nhiệm
Hình 7-3: Thực thi hàm xóa một node
trong cây
Trang 1622:54 06/06/2023 Documents Downloader
III Kết luận
Sau đề tài này chúng ta đã tìm hiểu rõ hơn về cây nhị phân tìm kiếm cúng như cách nó hoạt động với các phương thức: thêm, sửa, xóa, duyệt cây, Đặc biệt là đã áp dụng nó vào quản lí một từ điển Anh – Việt bằng một cây nhị phân tìm kiếm Tuy nhiên, vẫn còn một số phương thức chưa được cài đặt, code vẫn chưa được tối ưu hoàn toàn trong phần đề tài này Tuy vây, nhưng cũng phần nào thể hiện rõ được cách thức hoạt động của một cây nhị phân tìm kiếm
Trang 1722:54 06/06/2023 Documents Downloader
Tài liệu tham khảo
[1] Slide bài giảng môn Cấu trúc dữ liệu và giải thuật của thầy Nguyễn Việt Hưng