Nghiên cứu và làm rõ những khái niệm, tính chất về cấu trúc dữ liệu hàng đợi, cây, cây nhị phân, cây nhị phân cân bằng, cây nhị phân tìm kiếm, cây đỏ đen
Trang 1MỤC LỤC
LỜI CẢM ƠN 4
PHẦN MỞ ĐẦU 5
1 Lý do chọn đề tài .5
2 Mục tiêu đề tài .5
3 Đối tượng và phạm vi nghiên cứu .6
3.1 Đối tượng nghiên cứu .6
3.2 Phạm vi nghiên cứu. 6
4 Cách tiếp cận và phương pháp nghiên cứu .6
4.1 Cách tiếp cận .6
4.2 Phương pháp nghiên cứu .6
CHƯƠNG 1: HÀNG ĐỢI 7
1 TỔNG QUAN VỀ CẤU TRÚC HÀNG ĐỢI 7
1.1 Định nghĩa .7
1.2 Tính chất .9
1.3 Trừu tượng hóa cấu trúc hàng đợi. 9
1.4 Các phép toán trên hàng đợi .9
2.5 Cài đặt hàng đợi .9
2.5.1 Cài đặt hàng đợi bằng mảng 10
2.2 Cài đặt hàng đợi bằng danh sách liên kết 16
CHƯƠNG 2: CÂY 20
2.1 Tổng quan về cấu trúc cây. 20
2.1.1 Định nghĩa và các khái niệm 20
Trang 22.2 Cây nhị phân 22
2.2.1 Định nghĩa 22
2.2.2 Tính chất 23
2.2.3 Các thao tác trên cây nhị phân 25
2.2.4 Cài đặt cây nhị phân 25
2.3 Cây nhị phân tìm kiếm 28
2.3.1 Định nghĩa 28
2.3.2 Các thao tác trên CNPTK 29
2.3.3 Cài đặt cây nhị phân tìm kiếm 29
2.3.4 Phân tích đánh giá 32
2.4 Cây nhị phân cân bằng tìm kiếm 32
2.4.1 Cây nhị phân cần bằng hoàn toàn 32
2.4.1.1 Định nghĩa: 32
2.4.1.2 Đánh giá: 32
2.4.2.Cây nhị phân tự cân bằng (cây AVL) 32
2.4.2.1 Định nghĩa: 32
2.4.2.3 Các thao tác trên cây AVL 33
2.4.2.4 Cài đặt cây AVL 33
2.4.2.5 Đánh giá 37
CHƯƠNG 3 MÔ PHỎNG TRỰC QUAN CÁC PHÉP TOÁN TRÊN HÀNG ĐỢI VÀ CÂY 39
3.1 Phân tích và ý tưởng 39
3.1.1 Phân tích 39
3.1.2.Ý tưởng 40
3.2 Giao diện chính. 40
Trang 3KẾT LUẬN 45
1 Ưu điểm 45
2 Nhược điểm 45
3 Hướng phát triển 45
NHẬN XÉT CỦA GIÁO VIÊN HƯỚNG DẪN 46
NHẬN XÉT CỦA GIÁO VIÊN PHẢN BIỆN 47
Trang 4LỜI CẢM ƠN
Sau thời gian học tập, tìm hiểu và nghiên cứu tại khoa Đào Tạo quốc tế - trường Đai học Duy Tân, được sự giúp đỡ quý báu của các thầy giáo, cô giáo nhóm chúng em đã hoàn thành bài nghiên cứu khoa học của mình
Để hoàn thành bài nghiên cứu một cách hoàn thiện nhất có thể, trước hết cho phép chúng em được bày tỏ lời cảm ơn chân thành tới cô Nguyễn Thị Bảo Trang đã hướng dẫn tận tình, giúp đỡ chúng em trong suốt quá trình hoàn thành bài nghiên cứu
Ngoài ra em xin cảm ơn các thầy, các cô với sự giúp đỡ nhiệt tình trong quá trình giảng dạy đã trang bị cho chúng em một nền tảng kiến thức vững chắc cũng như các tài liệu thao khảo về lập trình
Đây là lần đầu tiên chúng em làm một bài nghiên cứu cũng như kinh nghiệm bản thân còn hạn chế nên bài nghiên cứu của chúng em không thể tránh khỏi những sai sót Vì vậy, chúng em rất mong nhận được sự chỉ bảo, đóng góp ý kiến của các thầy cô để chúng em có điều kiện bổ sung, nâng cao kiến thức của mình, phục vụ tốt hơn các công tác thực tế sau này
Em xin chân thành cảm ơn!
Đà Nẵng ngày , tháng , năm
Trang 5PHẦN MỞ ĐẦU
1 Lý do chọn đề tài
Trong khoa học máy tính, cấu trúc dữ liệu là một cách lưu dữ liệu trong máy tính sao cho nó có thể được sử dụng một cách hiệu quả Một cấu trúc dữ liệu được lựa chọn cẩn thận
sẽ cho phép thực hiện thuật toán hiệu quả hơn
Việc xây dựng chương trình này nhằm hỗ trợ tốt nhất về cấu trúc dữ liệu Hàng đợi ueue và Cây Tree góp phần giúp cho quá trình giảng dạy của Giảng viên về môn cấu trúc dữ liệu & giải thuật được tốt Nhằm tìm hiểu những thuật toán cơ bản của cấu trúc dữ liệu và giải thuật, tạo điều kiện cho sinh viên có khả năng tìm tòi, tự học và làm việc độc lập
Những hình ảnh cụ thể luôn tạo cho sinh viên có một cái nhìn trực quan hơn về việc học, với những quá trình mô phỏng bằng hình ảnh của đề tài sẽ hỗ trợ cho người học có thể tiếp thu kiến thức một cách nhanh nhất và nắm được vấn đề ngay tại lớp có thể hiểu r về cấu trúc dữ liệu của Hàng đợi và Cây được lưu trữ trong máy tính như thế nào và nắm được
t ng bước thực hiện của các giải thuật trên hai cấu trúc dữ liệu này Đề tài sẽ thúc đẩy chất lượng của việc học cao hơn, tạo một nền tảng lập trình vững chắc cho sinh viên sau này
uá trình giảng dạy của giảng viên luôn là vấn đề quan trọng, nó luôn ảnh hưởng tới việc học và tiếp thu của sinh viên Vậy nên chương trình nhằm nâng cao chất lượng giảng dạy và đào tạo của giảng viên dành cho sinh viên công nghệ thông tin tại trường ĐH Duy Tân nói riêng và các trường cao đẳng, đại học trên toàn quốc nói chung
Tạo ra một sản phẩm trí tuệ ảnh hưởng tới việc học cũng như việc giảng dạy nhằm quảng bá uy tín và thương hiệu của trường Đại học Duy Tân, tạo niềm tin cho những học sinh và sinh viên đam mê lập trình muốn theo con đường công nghệ, nhằm hướng đến một trường Đại học có chất lượng giảng dạy cao và nhằm đáp ứng nhu cầu tuyển dụng Công nghệ thông tin ngày một tăng của các doanh nghiệp
2 Mục tiêu đề tài
Đề tài nghiên cứu những khái niệm, tính chất, các phép toán chèn, xóa, tìm kiếm về cấu trúc dữ liệu Hàng đợi, Cây, Cây nhị phân , Cây nhị phân cân bằng, Cây nhị phân tìm
Trang 6kiếm, Cây đỏ đen rồi t đó mô phỏng các phép toán trên Hàng đợi, Cây, Cây nhị phân, Cây nhị phân cân bằng, Cây nhị phân tìm kiếm, Cây đỏ đen một cách trực quan nhất
3 Đối tượng và phạm vi nghiên cứu
3.1 Đối tượng nghiên cứu
- Lý thuyết về cấu trúc dữ liệu Hàng đợi và Cây
- Hoạt động của Hàng đợi, Cây và việc áp dụng các giải thuật của Hàng đợi, Cây trong một số bài toán cơ bản
- Ngôn ngữ lập trình Java dùng để phục vụ cho hướng phát triển là mô phỏng trực quan cấu trúc dữ liệu và các giải thuật trên Hàng đợi và Cây
3.2 Phạm vi nghiên cứu
- Nghiên cứu và làm r những khái niệm, tính chất về cấu trúc dữ liệu Hàng đợi,
Cây, Cây nhị phân, Cây nhị phân cân bằng, Cây nhị phân tìm kiếm, Cây đỏ đen
- Nghiên cứu các phép toán chèn, xóa, tìm kiếm trên Hàng đợi, Cây, Cây nhị phân,
Cây nhị phân cân bằng, Cây nhị phân tìm kiếm, Cây đỏ đen
- Thực hiện mô phỏng các phép toán trên Hàng đợi, Cây, Cây nhị phân, Cây nhị phân cân bằng, Cây nhị phân tìm kiếm, Cây đỏ đen
4 Cách tiếp cận và phương pháp nghiên cứu
4.1 Cách tiếp cận
Tiếp cận t lý thuyết thực tiễn giải pháp
4.2 Phương pháp nghiên cứu
- Tìm hiểu lý thuyết về cây, hàng đợi và đồ họa qua các tài liệu
- Trong quá trình tìm hiểu thì học hỏi bạn bè, giáo viên về mặt lý thuyết cũng như
các thao tác khi xây dựng đồ án
- Thực hành và xây dựng t ng bước đến khi hoàn chỉnh
Trang 7Xếp hàng mua vé xe lửa là hình ảnh của hàng đợi, người đến trước mua vé trước, người đến sau mua vé sau
in
a queue
head của hàng đợi
tail của hàng đợi
T cần chèn vào more
Hình 1.1: Hàng đợi trước khi không thêm gì
Trang 8store
in
a queue more
head của hàng đợi
tail của hàng đợi
Hình 1.3: Hàng đợi sau khi xóa từ words
wods store
in
a queue more head của hàng đợi
tail của hàng đợi
Hình 1.2: Hàng đợi sau khi thêm từ more
Trang 91.2 Tính chất
Vào trước ra trước (First in First out: FIFO)
1.3 Trừu tượng hóa cấu trúc hàng đợi
Mô tả dữ liệu
A = (a0, a1, ,an) Trong đó:
a0: Phần tử ở đầu của hàng đợi A
an: Phần tử ở cuối hàng đợi của A
Ví dụ: A = (1, 3, 5, 7, 9)
khi đó:
1: phân tử đầu hàng đợi
9: phần tử cuối hàng đợi
1.4 Các phép toán trên hàng đợi
Peek: Trả về phần tử ở đầu hàng đợi nhưng không xóa nó
Trang 10Cài đặt hàng đợi bằng mảng bằng cách sử dụng một cặp chỉ số theo d i các trường hợp ở đầu và ở đuôi của hàng đợi Việc cài đặt hàng đợi bằng mảng xoay tròn khi sử dụng các chỉ số đầu và đuôi có thể rất hiệu quả khi kích thước hàng đợi là cố định
Cài đặt hàng đợi bằng danh sách liên kết thì rất tốt khi kích thước hàng đợi không cố định
2.5.1 Cài đặt hàng đợi bằng mảng
Cài đặt hàng đợi bằng cách sử dụng mảng thì rất hiệu quả khi biết trước số phần tử tối
đa của hàng đợi
Việc loại bỏ một phần tử trong hàng đợi được thực hiện ở đầu mảng và việc thêm phần tử mới vào hàng đợi được thực hiện ở cuối mảng, sử dụng cặp chỉ số đầu và đuôi và khởi tạo một mảng vòng
Trang 11Hình 2.5.3: Hàng đợi mảng vòng sau khi chèn t Second
Trang 12Head của hàng đợi Trả về t First
First
1 Size
0
Hình 2.5.4: Hàng đợi mảng vòng sau khi xóa t First
4
Trang 13Hình 2.5.7: Hàng đợi mảng vòng sau khi chèn t Third
T cần chèn vào
Second
2
Head của hàng đợi
5
0 Tail của hàng đợi
Hình 2.5.6: Hàng đợi mảng vòng sau khi chèn t
Second
Hàng đợi
Hàng đợi
Trang 14đợi
0 Tail của hàng đợi
1 Size
6
1 Tail của hàng đợi
Hình 2.5.8: Hàng đợi mảng vòng sau khi xóa t First
Trả về t First sau khi xóa
Hàng đợi
Trang 15Ở hai ví dụ trên, ta thấy rằng khi head = tail có nghĩa là hàng đợi rỗng Nhưng khi hàng đợi đầy thì chỉ số head cũng bằng chỉ số tail Vì vậy ta cần xử lý 2 chỉ số này để tránh
sự mơ hồ giữa hàng đợi rỗng và đầy Để loại bỏ sự mơ hồ chúng ta cần kiểm tra số phần tử (size) của hàng đợi, khi số phần tử bằng kích thước tối đa của hàng đợi thì khi đó hàng đợi
đã đầy, còn khi số phần tử hàng đợi bằng 0 thì lúc đó hàng đợi rỗng
Việc xác định kích thước của hàng đợi là rất quan trọng, và việc thay đổi lại kích thước của hàng đợi thì có thể thực thi được, nhưng đòi hỏi rất tốn chi phí Chúng ta phải chắc rằng hàng đợi có kích thước quá nhỏ thì mới yêu cầu thay đổi lại kích thước Nhưng nếu kích thước hàng đợi quá lớn thì sẽ dẫn đến lãng phí bộ nhớ
Như vậy, để tạo ra hàng đợi, ta cần dùng một mảng gồm các phần tử có kiểu E nào
đó
Thêm phần tử vào cuối hàng đợi (Push)
Nếu hàng đợi đầy thì phát sinh thêm một ngoại lệ Nếu hàng đợi chưa đầy thì thêm phần tử mới vào cuối hàng đợi tại vị trí tail, cập nhật lại vị trí tail và nếu vị trí tail quay vòng lại đầu mảng thì quay về lại vị trí 0, tăng số phần tử hàng đợi lên 1 và phương thức này nhận giá trị true
Size
0
Third Trả về t Third sau khi xóa
1 Tail của hàng đợi
1
Hình 2.5.10: Hàng đợi mảng vòng sau khi xóa t Third
Trang 16public boolean push(E e){
if(size >= a.length){
System.out.println("Queue if full");
System.exit(0);
} a[tail++] = e;
tail = tail % a.length;
size++;
return true;
}
Xóa phần tử đầu hàng đợi (Pop)
Nếu hàng đợi rỗng thì phát sinh thêm một ngoại lệ Ngược lại thì xóa phần tử ở đầu hàng đợi tại vị trí head, cập nhật lại vị trí head và nếu vị trí head quay vòng lại đầu mảng thì quay về lại vị trí 0, giảm phần tử hàng đợi xuống 1 và phương thức này trả về phần tử đã bị xóa
Trả về phần tử ở đầu hàng đợi (Peek)
Nếu kích thước mảng < 0 thì trả về giá trị null, ngược lại thì trả về phần tử đầu hàng đợi
2.2 Cài đặt hàng đợi bằng danh sách liên kết
Cài đặt hàng đợi bằng danh sách liên kết là một phương pháp tốt khi ta không cần cố định kích thước của hàng đợi
Ví dụ:
Trang 17Hình 2.2.3: Hàng đợi sau khi xóa t words
words
Head của hàng đợi
Trả về t words sau khi xóa
a
in
queue Tail của hàng đợi
store
more
Hình 2.2.1: Hàng đợi trước khi chèn t more
a more
words
in
queue
Head của hàng đợi
Tail của hàng đợi
Trang 18Như vậy, để tạo ra hàng đợi chứa một vài tham số kiểu E, ta cần một Node gồm 2 thuộc tính, một thuộc tính tham chiếu đến giá trị kiểu E, thuộc tính còn lại tham chiếu đến một Node khác
Vì lớp Node này chỉ được biết bởi lớp hàng đợi, nên lớp Node sẽ được cài đặt như là lớp lồng trong lớp hàng đợi
Vì kích thước của hàng đợi không cần cố định, nên ta chỉ cần dùng một hàm khởi tạo
Thêm phần tử vào cuối hàng đợi
Cấp phát bộ nhớ cho node p, nếu hàng đợi rỗng thì p v a là head v a là tail, ngược lại thì trỏ link liên kết tail tới node p
public boolean push(E e){
Node<E> temp = new Node<E> (e,null);
Tail của hàng đợi Trả về t words sau khi xóa
Trang 19 Lấy phần tử ra khỏi hàng đợi
Trang 20CHƯƠNG 2: CÂY
2.1 Tổng quan về cấu trúc cây
2.1.1 Định nghĩa và các khái niệm
Cây là một cấu trúc phi tuyến tính Một cây tree là một tập hữu hạn các nút trong đó
có một nút đặc biệt gọi là nút gốc (root), giữa các nút có mối quan hệ phân cấp gọi là quan
hệ "cha-con"
Có thể định nghĩa cây một cách đệ quy như sau:
Một nút là một cây Nút đó cũng là gốc của cây ấy
Nếu T1, T2, , Tn là các cây, với n1, n2, nk lần lượt là các gốc, n là một nút
và n có quan hệ cha - con với n1, n2, nk thì lúc đó một cây mới T sẽ được tạo lập, với n là gốc của nó n được gọi là cha của n1, n2, nk, ngược lại n1, n2, nkđược gọi là con của n Các cây T1, T2, , Tn được gọi là các cây con substrees của n
Ta quy ước: Một cây không có nút nào được gọi là cây rỗng (null tree)
Có nhiều đối tượng có cấu trúc cây
Ví dụ:
Mục lục của một quyển sách, hoặc một chương trong sách có cấu trúc cây
Cấu trúc thư mục trên đĩa cũng có cấu trúc cây, thư mục gốc có thể coi là gốc của cây đó với các cây con là các thư mục con và tệp nằm trên thư mục gốc
Gia phả của một họ tốc cũng có cấu trúc cây
Một biểu thức số học gồm các phép toán cộng, tr , nhân, chia cũng có thể lưu trữ trong một cây mà các toán hạng được lưu trữ ở nút lá, các toán tử được lưu trữ
ở các nút nhánh, mỗi nhánh là một biểu thức con
Ta có một cây tổng quát như sau:
Trang 21Hình CTQ Đối với cây, chẳng hạn xét cây ở Hình CTQ:
Nút A được gọi là gốc của cây
B, C, D là gốc của các cây con gốc của A
A là cha của B, C, D còn B, C, D là con của A
Số các con của một nút gọi là cấp (degree) của nút đó Ví dụ nút A có 3 con là B, C,
D nên cấp của A là 3, cấp của C là một, D là 2, B là 3
Nút có cấp bằng 0 gọi là lá leaf hay nút tận cùng terminal node Ví dụ các nút E, F, G, H, I, J Nút không là lá được gọi là nút nhánh branch node
Cấp cao nhất của nút trên cây gọi là cấp của cây đó Như hình trên là cây cấp 3 Gốc của cây có số mức level là 1 Nếu nút cha có số mức là i thì nút con có số mức
Ở Hình CTQcây có chiều cao là 3
Nếu n1, n2, nk là dãy các nút mà ni là cha của ni+1 với 1≤ i ≤k, thì dãy đó là đường
đi path tử n1 đế nk Độ dài của đường đi path length t nút nk đến nq là số nút phải đi qua
để đi t nk đến nq ( bằng chiều cao của nq - chiều cao của nk)
Ví dụ nhưHình CTQ độ dài đường đi t A đến G là 2
Trang 22Nếu thứ tự các cây con của một nút được coi trọng thì cây đang xét là cây thứ tự ordered tree , ngược lại là cây không có thứ tự unordered tree Thường thứ tự các cây con của một nút được đặt t trái sang phải
2.2 Cây nhị phân
2.2.1 Định nghĩa
Cây nhị phân là cây mà mỗi nút có tối đa 2 cây con
Đối với cây con của một nút người ta phân biệt cây con trái và cây con phải Như vậy cây nhị phân là cây có thứ tự
Cây nhị phân suy biến có một danh sách tuyến tính
Các cây nhị phân a, b, c, d là các cây nhị phân suy biến
Cây a lệch trái, cây b lệch phải, cây c và d là cây zíc zắc
Cây nhị phân hoàn chỉnh: là cây nhị phân mà các nút ở các mức tr mức cuối đều đạt tối đa
Ví dụ: cây sau đây là cây nhị phân hoàn chỉnh
Trang 23Cây nhị phân đầy đủ : Là cây nhị phân có các nút tối đa ở mọi mức
Ví dụ: Cây sau đây là cây nhị phân đầy đủ
2.2.2 Tính chất
Trong các cây nhị phân cùng có số lượng nút như nhau thì cây nhị phân suy biến có chiều cao lớn nhất, cây nhị phân hoàn chỉnh hoặc cây nhị phân gần đầy có chiều cao nhỏ nhất, loại cây này cũng là cây có dạng "cân đối" nhất
Số lượng tối đa các nút ở mức i trên 1 cây nhị phân là 2i-1 i≥1
Số lượng tối đa các nút trên 1 cây nhị phân có chiều cao h là
1) Lượng tối đa các nút ở mức i trên 1 cây nhị phân là 2i-1 (i≥1)
Chứng minh bằng quy nạp: ta biết:
Ở mức 1: i=1, cây nhị phân có tối đa 1=20 nút
Ở mức 2: i=2, cây nhị phân có tối đa 2 =21
nút