Lý do và động lựcĐể đáp ứng yêu cầu môn học cũng như mong muốn tìm hiểu, mở rộng kiếnthức về ngôn ngữ lập trình nói chung và môn cấu trúc dữ liệu và giải thuậtnói riêng, nhóm chúng em đã
Trang 1ĐẠI HỌC BÁCH KHOA HÀ NỘI
Sinh viên thực hiện: Trần Đình Vương 20214154
Cao Danh Khang 20213967 Ngô Thái Bình 20213820 Cao Việt Bình 20213818
Giảng viên: Trần Thị Thanh Hải
Hà N i-202 ộ 3
Trang 2Mc lc
I Giới thiệu 2
1 Lý do và động lực 2
2 Định nghĩa bài toán 2
3 Bảng phân công nhiệm vụ và đánh giá mức độ hoàn thành 3
II Phương pháp lựa chọn 4
1 Cấu trúc dữ liệu 4
2. Giải thuật 8
III Triển khai cài đặt 11
1 Ngôn ngữ lập trình và thư viện 11
3 Khó khăn khi học tập môn học 19
VI Tài liệu tham khảo 20 VII Lời cảm ơn 20
Trang 3I Giới thiệu
1 Lý do và động lực
Để đáp ứng yêu cầu môn học cũng như mong muốn tìm hiểu, mở rộng kiếnthức về ngôn ngữ lập trình nói chung và môn cấu trúc dữ liệu và giải thuậtnói riêng, nhóm chúng em đã cùng nhau hướng đến những đề tài hướng vớinhững tiêu chí:
Đây là một chủ đề mở, có rất nhiều hướng đi cũng như hướng phát triển
2 Định nghĩa bài toán
Input: Dữ liệu của sinh viên:
Output: Những kết quả đã qua xử lý
Danh sách các sinh viên xếp theo MSSV
Điểm quá trình của sinh viên
Sinh viên được tìm kiếm
File danh sách lớp
3 Bảng phân công nhiệm vụ và đánh giá mức độ hoàn thành
Trang 4Họ và tên MSSV Nhiệm vụ Mức độ
hoàn thành
Trần Đình Vương 20214154
Tìm hiểu đề tàiLên ý tưởngTriển khai và cài đặt chươngtrình- Coder phụ
Phát triển sản phẩmLàm báo cáo phần I,II,II
Đã hoàn thành
Cao Danh Khang 20213967
Tìm hiểu đề tài Lên ý tưởngTriển khai và cài đặt chươngtrình-Coder chính
Phổ biến kiến thức mới cho cảnhóm
Phát triển sản phẩmLàm báo cáo phần I,II,III
Đã hoàn thành
Ngô Thái Bình 20213820
Tìm hiểu đề tàiTìm hiểu CSDL LinkedListTìm hiểu thư việnTheo dõi tiến trình Làm báo cáo phần IV,V
Đã hoàn thành
Cao Việt Bình 20213818
Tìm hiểu đề tài Tìm hiểu giải thuậtBinary Search và QuickSortTìm hiểu thư việnLàm PowerPoint giới thiệuLàm báo cáo phần IV,V,VI
Trang 5Các phần tử trong linked list được gọi là các node.
Mỗi node sẽ chưa một key và một con trỏ trỏ tới node kế tiếp của nó, được
gọi là next
Thuộc tính tên là head trỏ tới phần tử đầu tiên của linked list
Phần tử cuối cùng của linked list có tên là tail
Một số loại linked list có thể kể tới bao gồm:
Singly linked list: Duyệt qua các phẩn tử chỉ có thể thực hiện theo chiều hướng về phía trước
Doubly linked list: Duyệt qua các phẩn tử có thể thực hiện theo cả chiều tiến
và lùi Các node sẽ bao gồm thêm một con trỏ được gọi là pre, trỏ tới node trước đó
Circular linked list: Là một doubly linked list đặc biệt, khi mà con trỏ prev của head trỏ tới tail và con trỏ next của tail trỏ tới head
Các phép toán trên linked list
Tìm kiếm: Tìm phần tử đầu tiên với key là trong một linked list được cho k
trước được thực hiện đơn giản bằng một quá trình duyệt tuần tự và trả về con trỏ trỏ tới phần tử đó
Thêm: Để thêm một key vào một linked list có sẵn, ta có thể thực hiện theo
3 cách: thêm vào đầu list, thêm vào giữa list hoặc thêm vào cuối của list.Xoá: Xoá một phần tử khỏi một linked list cho trước Ta không thể xoá x
một node với chỉ một bước Việc xoá một node có thể thực hiện theo 3 cách: xoá từ đầu danh sách, xoá từ giữa danh sách hoặc xoá từ cuối danh sách
Ưu điểm:
Tiết kiếm bộ nhớ và cấp phát động: Không như array cần 1 lượng chỉ định ô nhớ trên bộ nhớ ngay khi khỏi tạo Linked list chỉ sử dụng bộ nhớ để lưu trữ khi dữ liệu thực sự được lưu vào linked list
Nó còn có thể lưu các phần tử ở bất cứ đâu được phép trên bộ nhớ mà khôngcần các ô nhớ liền kề nhau như array
Trang 6Quick insertion (Thêm rất nhanh với complexity chỉ là O(1))
Quick deletion (Xóa nhanh)
Một số áp dụng Linked List trong chương trình:
Xóa sinh viên:
Thêm sinh viên:
Trang 7Thêm học phần
Xóa học phần
Điểm danh:
Trang 82 Giải thuật
Binary Search
Thuật toán tìm kiếm nhị phân (Binary Search) hay còn được gọi là tìm
kiếm một nửa là thụât toán tiếp kiếm được sử dụng rất nhiều trong thực tếcho phép tìm kiếm vị trí của một phần tử trong một mảng đã được sắp xếp
Thụât toán tìm kiếm nhị phân thực hiện tìm kiếm một mảng đã sắp xếp
bằng cách liên tục chia các khoảng tìm kiếm thành 1 nửa
+ Bắt đầu với một khoảng từ phần tử đầu mảng, tới cuối mảng
Trang 9+ Nếu giá trị của phần tử cần tìm nhỏ hơn giá trị của phần từ nằm ở giữa khoảng thì thu hẹp phạm vi tìm kiếm từ đầu mảng tới giửa mảng và ngược lại.
+ Cứ thế tiếp tục chia phạm vi thành các nửa cho dến khi tìm thấy hoặc đã duyệt hết
Thuật toán tìm kiếm nhị phân tỏ ra tối ưu hơn so với tìm kiếm tuyết tính ở các mảng có độ dài lớn và đã được sắp xếp
Ngược lại, tìm kiếm tuyến tính sẽ tỏ ra hiệu quả hơn khi triển khai trên các mảng nhỏ và chưa được sắp xếp
Ý tưởng triển khai thuật toán
Cho một mảng đã sắp xếp arr[] có n phần tử, viết một hàm tìm kiếm trả vềchỉ số của phần tử có giá trị x trong arr[]
+ Xét một đoạn trong mảng arr[left right] Lúc này giá trị của left và right lần luợt là 0 và số phần tử của mảng - 1
+ So sánh x với phần tử nằm ở vị trí chính giữa của mảng (mid = (left + right) /2) Nếu x bằng arr[mid] thì trả về vị trí và thoát vòng lặp.
+ Nếu x < arr[mid] thì chắc chắn x sẽ nằm ở phía bên trái tức là
từ arr[left mid-1]
+ Nếu x > arr[mid] thì chắc chắn x sẽ nằm ở phía bên phải mid tức là ở khoảng arr[mid+1 right]
+ Tiếp tục thực hiện chia đôi các khoảng tìm kiếm tới khi nào tìm thấy được
vị trí của x trong mảng hoặc khi đã duyệt hết mảng
Độ phức tạp:
+ Trường hợp tốt nhất là O(1)
+ Trường hợp xấu nhất là O(log2n)
+ Trung bình cũng là O(log2n)
Trang 10Áp dụng giải thuật Binary Search trong chương trình:
Giải thuật sắp xếp nhanh QuickSort:
- Quick sort là thuật toán sắp xếp, hoạt động theo cách sau: Chọn một phần
tử trong mảng làm điểm đánh dấu và sau đó chia mảng thành hai mảng conbằng cách so sánh các phần tử trong mảng với điểm đánh dấu Mảng 1 sẽchứ các phần tử nhỏ hơn hoặc bằng điểm đánh dấu và mảng 2 sẽ gồm cácphần tử lớn hơn điểm đánh dấu
- Thực hiện:
Chọn phần tử chốt
Khai báo 2 biến con trỏ để trỏ để duyệt 2 phía của phần tử chốt
Biến bên trái trỏ đến từng phần tử mảng con bên trái của phần tử chốt.Biến bên phải trỏ đến từng phần tử mảng con bên phải của phần tử chốt.Khi biến bên trái nhỏ hơn phần tử chốt thì di chuyển sang phải
Khi biến bên phải nhỏ hơn phần tử chốt thì di chuyển sang trái
Trang 11Nếu không xảy ra trưởng hợp 5 và 6 thì tráo đổi giá trị 2 biến trái và phải.Nếu trái lớn hơn phải thì đây là giá trị chốt mới.
- Áp dụng QuickSort trong chương trình:
III Triển khai cài đặt
Trang 121 Ngôn ngữ lập trình và thư viện
Tính thực thi nhanh: Nếu bạn đã sành sỏi về C++ thì bạn có thể lập trình
rất nhanh Một trong những mục tiêu của C++ chính là khả năng thực thi Vànếu bạn cần thêm các tính năng cho chương trình, C++ cho phép bạn sử dụng ngôn ngữ Assembly (Hợp ngữ) – Ngôn ngữ lập trình bậc thấp nhất dùng để giao tiếp trực tiếp với phần cứng của máy tính
Thư viện đầy đủ: Có rất nhiều tài nguyên sử dụng cho người lập trình bằng
C++, bao gồm cả đồ hoạ API, 2D, 3D, vật lý các thiết bị âm thanh hỗ trợ giúp cho lập trình viên dễ dàng thực thi
Đa mô hình: C++ cũng cho phép bạn lập trình theo cấu trúc tuyến tính,
hướng chức năng, hướng đối tượng đa dạng tuỳ theo yêu cầu của người lập trình
Thư viện:
Sử dụng thư viện trong c++
Sử dụng MySQL: hệ thống quản trị cơ sở dữ liệu mã nguồn mở (RelationalDatabase Management System, viết tắt là RDBMS) hoạt động theo môhình client-server RDBMS là một phần mềm hay dịch vụ dùng để tạo vàquản lý các cơ sở dữ liệu (Database) theo hình thức quản lý các mối liên
Bài báo cáo: Nhom_11_Report.docx
Video chạy thực nghiệm: Nhom_11_Demo.mp4
Trang 13IV Kết quả thực nghiệm
- Tính năng 1: Thêm sinh viên
Ví dụ: Thêm một sinh viên có MSSV = 2021007
+ Trước:
Trang 14+ Sau:
Trang 15- Tính năng 2: Xóa sinh viên
Ví dụ: Xóa sinh viên có MSSV=2021007
+ Trước:
Trang 16
+ Sau:
- Chức năng 3: Thêm học phần
Ví dụ: Thêm học phần GT1 cho sinh viên có MSSV = 2021007
+ Trước:
Trang 18+ Sau:
- Chức năng 6: Tìm kiếm sinh viên
Ví dụ: Tìm kiếm sinh viên có MSSV = 2021005
- Chức năng 7: In ra số sinh viên trong danh sách
- Chức năng 8: In ra danh sách
Trang 19- Chức năng 9: In ra danh sách sinh viên theo thứ tự tăng dần của điểm trungbình giữa kì
V Kết luận
1 Đánh giá về mức độ hoàn thành
Mặt ưu điểm
Project của nhóm đã hoàn thành đúng với mục tiêu ban đầu đề
ra và có thể hoạt động với lượng data tương đối lớn
Các thành viên trong nhóm đã biết ứng dụng kiến thức để bắttay vào làm 1 dự án nhỏ
Đã ứng dụng được kiến thức đã học của môn học, kết hợp vớikiến thức tự tìm hiểu để làm sản phẩm
Mặt khác, sản phẩm này của chúng em vẫn cần phát triển thêm một sốphương diện như:
Về mặt trình bày code: Cần rút ngắn, tối giản
Về độ phức tạp thuật toán: Cần tối ưu thêm thời gian chạy để cóthể xử lý được lượng data vô cùng lớn
Trang 20Về các chức năng khác của sản phẩm: Cần nghiên cứu nhiềukiến thức để tạo ra nhiều chức năng hữu ích hơn nữa
Về mặt hình thức sản phẩm: Cần nghiên cứu kiến thức để hìnhthức sản phẩm trở thành 1 web hay app đặc thù
Khi bắt đầu làm một bài tập lớn, sản phẩm, dự án bất kỳ thì chúng tađều cần lên kế hoạch cụ thể
Chọn đề tài vừa trong khả năng của bản thân, vừa có sự thử thách nhấtđịnh
Sau khi hoàn thành sản phẩm, cần phải suy nghĩ thêm để phát triểnsản phẩm, khắc phục những hạn chế của sản phẩm
Kỹ năng làm việc nhóm rất quan trọng, cần phải phân chia công việc
rõ ràng và giúp đỡ nhau trong quá trình làm việc, hiểu được điểmmạnh yếu của nhau
3 Khó khăn khi học tập môn học
Để học tốt môn Cấu trúc dữ liệu và giải thuật, chúng em cần phải nắmvững kiến thức môn Kỹ thuật lập trình C/C++
Cần hiểu bản chất khi học vì thường xuyên phải code giấy, khôngđược phụ thuộc vào máy tính
Lượng kiến thức lớn, cần phải đầu tư nhiều thời gian học và thực hành
để nắm được kiến thức
Cần phải nắm vững từng phần kiến thức mới ứng dụng được vài mộtbài tập lớn
Trang 21Những khó khăn trên chỉ là những thử thách của môn học, nếu làm tốtthì kiến thức đã học ở môn Cấu trúc dữ liệu và giải thuật sẽ giúp íchrất nhiều cho bản thân sinh viên chúng em.
VI Tài liệu tham khảo:
Tài liệu trong teams lớp
Tài liệu về MySQL: phuc-tap-L4x5xamOKBM
https://viblo.asia/p/mysql-tu-don-gian-den-VII Lời cảm ơn
Cấu trúc dữ liệu và giải thuật là môn học quan trọng đối với sinh viên nhữngngành liên quan CNTT nói chung và ngành Điện tử-Viễn thông nói riêng.Chúng em đã hiểu rằng ngôn ngữ lập trình có thể thay đổi nhưng cốt lõi làcấu trúc giữ liệu và giải thuật sẽ giúp chúng em học được ngôn ngữ mớinhanh chóng
Chúng em xin chân thành cảm ơn sự chỉ dạy nhiệt tình và những ví dụ minhhọa của cô giúp chúng em học tập Cảm ơn cô vì đã giao một bài tập lớn đểchúng em được có cơ hội thử thách bản than vào một project không chỉ đơngiản là code mà còn là tinh thần làm việc, tìm hiểu những thứ mới mẻCuối cùng, sản phẩm của chúng em vẫn còn nhiều thiếu sót do thiếu nhiềukinh nghiệm cũng như kĩ năng, mong cô nhận xét, góp ý để chúng em hoànthiện hơn