1. Trang chủ
  2. » Luận Văn - Báo Cáo

BÁO CÁO BÀI TẬP LỚN MÔN HỌC CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT.pdf

30 30 0
Tài liệu đã được kiểm tra trùng lặp

Đ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

Thông tin cơ bản

Tiêu đề Báo Cáo Bài Tập Lớn Môn Học
Tác giả Võ Văn Tuấn
Người hướng dẫn Trần Thị Dung
Trường học Trường Đại Học Giao Thông Vận Tải Phân Hiệu Tại TP. Hồ Chí Minh
Chuyên ngành Cấu Trúc Dữ Liệu Và Giải Thuật
Thể loại Báo cáo bài tập lớn
Năm xuất bản 2022
Thành phố TP. Hồ Chí Minh
Định dạng
Số trang 30
Dung lượng 768,37 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

- Sử dụng môt con trỏ header, trỏ vào node đầu danh sách và con trỏ trailer trỏ vào node cuối danh sách.2.Cấu trúc của một Node - Các thuộc tính: o Element elem; o Node *next; - Các phươ

Trang 1

TRƯỜNG ĐẠI HỌC GIAO THÔNG VẬN TẢI PHÂN HIỆU TẠI TP HỒ CHÍ MINH

BÁO CÁO BÀI TẬP LỚN MÔN HỌC: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT

Giảng viên: TRẦN THỊ DUNG

Sinh viên : VÕ VĂN TUẤN

Lớp: CQ.62.KTĐTVT

MSSV: 6251020094

Khóa: 62

Tp Hồ Chí Minh, năm 2022

Trang 2

CHƯƠNG 1 MỞ ĐẦU

1 Tổ chức biểu diễn các đối tượng thực tế:

2 Xây dựng các thao tác xử lý dữ liệu:

- Dựa trên yêu cầu của bài toàn để xác định các thao tác xử lý vấn đề trên máy tính để đưa ra kết quả đúng

3 Vai trò CTDL trong 1 đề án tin học:

Cấu trúc dữ liệu+ giải thuật= Program

4 Tiêu chuẩn đánh giá cấu trúc dữ liệu:

- Phản ánh đúng thực tế.

- Phù hợp với thao tác xử lý.

- Tiết kiệm tài nguyên.

5 Đánh giá độ phức tạp của giải thuật:

- Tính đúng đắn.

- Tính hiệu quả.

6 Đánh giá thuật toán:

- Một vấn đề được giải quyết bằng nhiều thuật toán khác nhau

- Đối với từng thuật toán:

o Khác nhau về không gian: Tài nguyên bộ nhớ sử dụng

o Khác nhau về thời gian chạy thuật toán

- Thời gian chạy:

o Kỹ năng lập trình

o Tốc độ thực hiện các phép toán

o Dữ liệu vào

7 Thời gian chạy thuật toán:

- Thời gian chạy của một thuật toán phụ thuộc vào dữ liệu vào

- Có 2 cách đo thời gian chạy thuật toán:

o Đo bằng thực nghiệm (không phù hợp với chương trình đơn giản)

o Đo bằng toán học (thực tế dễ sử dụng hơn)

Thao tác xử lý

Yêu cầu

bài toán

Kết quả mong muống

Trang 3

8 Độ phức tạp về thời gian.

- T(n)= số lượng phép toán sơ cấp cần thực hiện.

- Mỗi phép toán sơ cấp được thực hiện trong một khoảng thời gian cố

định

- Chỉ xét tốc độ tăng của hảm T(n).

9 Định nghĩa ký hiệu ô lớn (big O):

- f(n) = O(g(n)) nếu tồn tại các hằng số dương c và n0 sao cho f(n) <= c*g(n) với mọi n >=n0

10.Các cấp độ thời gian chạy:

Ý nghĩa Nếu T(n)

là hằng số(T(n)=C)

Độ phức tạp dạnglogarit

Độ phức tạp tuyếntính

Độ phức tạp tuyếntính logarit

Độ phức tạp đa thức

CHƯƠNG 2: NGÔN NGỮ LẬP TRÌNH C++

- Ngôn ngữ lập trình C++ là ngôn ngữ dựa theo ngôn ngữ C Vì vậy, cú pháp của C++ giống với cú pháp của C và có thêm một số mở rộng:

o Nhập (cin), xuất (cout)

o Hàm có đối mặc định, đối tham chiếu

o Nạp chồng hàm

o Hàm mẫu

o Lớp

1. Nhập xuất dữ liệu:

- Nhập dữ liệu kiểu số: cin>>biến1>>biến2>>…>>biếnn;

Exam: float x,y;

Trang 4

cout<<“x+y=“<<x+y;

cout<<“x-y=“<<x-y;

}

- Cả hai cách tiếp cận đều thực hiện theo phương pháp tinh chỉnh từng

o Các cấu trúc dữ liệu khó thay đổi

- Tiếp cận hướng đối tượng (Object oriented):

o Tập trung vào các đối tượng

o Các cấu trúc dữ liệu trừu tượng được định nghĩa sớm

o Cấu trúc dữ liệu chi tiết mức ngôn ngữ chưa được định nghĩa

o Cấu trúc dữ liệu dễ thay đổi hơn

Exam: Lập chương trình nhập vào tọa độ các đỉnh của 1 tam giác bất kỳ trong mặt phẳng Tính diện tích và chu vi của tam giác đó In kết quả lên màn hình

- Tiếp cận hướng thủ tục:

o Xây dựng các hàm:

typedef struct Tamgiac{

float xA, yA, xB,yB, xC, yC;

}void Nhap(Tamgiac &t){

cout<<“Nhap toa do dinh thu nhat:”;

Trang 5

2.KHÁI NIỆM LỚP – KHAI BÁO LỚP

- Lớp là một khái niệm mở rộng của cấu trúc dữ liệu, nó có thể chứa đựng cả dữ liệu và các hàm

- Đối tượng (object) là một thể hiện của lớp Trong lập trình lớp được xem như là một kiểu dữ liệu, đối tượng là các biến

EX: class class_name{

*NOTE:

- class_name: tên của lớp

- access_specifier: các dặc tả (private, protected, public)

- member: các thành phần của lớp (thuộc tính hoặc các hàm)

EX: Khai báo lớp biểu diễn các sinh viên cho các phương thức tính tổng

- Ta có thể cài đặt các phương thức bên trong lớp hoặc bên ngoài lớp

- Cài đặt phương thức bên ngoài lớp:

Trang 6

- Tất cả các phương thức của lớp đều có một đối ẩn là một con trỏ (this)

có kiểu là kiểu lớp chứa phương thức đó

EX:

class A {

private:

…public:

cout<<“Nhap toa do dinh thu hai:”;

cin>> this-> xB>> this-> yB;

cout<<“Nhap toa do dinh thu ba:”;

cin>> this-> xC>> this->yC;

}void main() {

Trang 7

class classname{

private:

…public:

DataType operator sign();

DataType operator sign();

…};

(sign là dấu toán tử : ++, )

- Toán tử hai ngôi:

class classname{

private:

…public:

DataType operator sign(DataType1 argN);DataType operator sign(DataType1 argN);

…};

DataType là kiểu trả lại của toán tử

DataType1 là kiểu của đối tượng mà toán tử tác động

sign: là dấu toán (ví dụ: +, -, *, /, … )

CHƯƠNG 3 DANH SÁCH LIÊN KẾT

1.Danh sách liên kết đơn:

- Các nút (node) được cài đặt bao gồm:

o Phần tử lưu trữ trong nó

o Một liên kết đến nút kế tiếp

Trang 8

- Sử dụng môt con trỏ header, trỏ vào node đầu danh sách và con trỏ trailer trỏ vào node cuối danh sách.

2.Cấu trúc của một Node

- Các thuộc tính:

o Element elem;

o Node *next;

- Các phương thức

o Node *getnext() :Trả lại địa chỉ của nút kế tiếp

o Element getElem() : Trả lại giá trị phần tử lưu trữ trong nút

o void setNext(Node *) : Gán địa chỉ cho thuộc tính next

o void setElem(Element e) : Gán giá trị e cho thuộc tính elem

3.cấu trúc danh sách liên kết đơn

Trang 9

- Chèn và xóa

o insert

o erase

a Thêm vào đầu:

- Hình ảnh phép toán push_front(), phép toán trả lại vị trí q

b Thêm vào cuối:

- Hình ảnh phép toán push_back(), phép toán trả lại vị trí q

c Chèn:

- Hình ảnh phép toán insert(p, X), phép toán trả lại vị trí q

Trang 11

a Thêm vào đầu:

- Hình ảnh phép toán push_front(X), phép toán trả lại vị trí q

Trang 12

b Thêm vào cuối:

- phép toán push_back( X), phép toán trả lại vị trí q

q->setElement(e) //Đặt gia trị e vào nút q

q->setNext(p->getNext())//liên kết với phần tử sau nóp->getNext()->setPrev(q)//Liên kết phần tử sau p với qq->setPrev(p)//liên kết q với phần tử trước nó

p->setNext(q)//liên kết p với q

return q//trả lại vị trí của q

Trang 13

d Xóa

Algorithm erase(p):

//kết nối phần tử trước p với phần tử sau p

p->getPre()->setNext(p->getNext())//kết nối phần tử sau p với phần tử trước p

p->getNext()->setPre(p->getPre())//bỏ kết nối p với phần tử trước nó

p->setPre(NULL)p->setNext(NULL)delete p

CHƯƠNG 4 CẤU TRÚC NGĂN XẾP (STACK)

- Stack là cách tổ chức lưu trữ các đối tượng dưới dạng một danh sách tuyến tính mà việc bổ sung đối tượng và lấy các đối tượng ra được thực hiện ở cùng một đầu của danh sách

- Stack được gọi là danh sách kiểu LIFO (Last In First Out - vào sau ra trước)

1 Các vấn đề cần nghiên cứu

- Cấu trúc dữ liệu trừu tượng Stack (ADT Stack)

- Những ứng dụng của Stack

- Cài đặt Stack dựa trên mảng

- Sự phát triển stack dựa trên mảng

2 Cấu trúc dữ liệu trừu tượng (ADT- Abtract Data Type)

- Các thành phần

o Dữ liệu được lưu trữ

o Các phép toán trên dữ liệu

o Các điều kiện xảy ra lỗi kết hợp với các phép toán

3 Cấu trúc dữ liệu trừu tượng Stack

- Stack ADT lưu trữ các đối tượng bất kỳ

- Bổ sung và lấy ra các phần tử theo kiểu “Vào sau ra trước” – “Last In First Out”

- Các phép toán chính:

o push(Object o): bổ sung đối tượng o vào Stack

Trang 14

o pop(): lấy ra và trả lại phần tử được bổ sung vào cuối cùng của Stack

- Các phép toán bổ trợ

o top() trả lại tham chiếu đến phần tử được bổ sung vào cuối cùngcủa Stack

o size(): trả lại số phần tử hiện lưu trữ trong Stack

o empty(): trả lại giá trị kiểu boolean để xác định Stack có lưu trữphần tử nào hay không

4 Một số ứng dụng của Stack

- Các ứng dụng trực tiếp:

o Lưu lại các trang Web đã thăm trong một trình duyệt

o Thứ tự Undo trong một trình soạn thảo

o Lưu chữ các biến khi một hàm gọi tới hàm khác, và hàm được gọi lại gọi tới hàm khác, và cứ tiếp tục như vậy

- Các ứng dụng gián tiếp:

o Cấu trúc dữ liệu bổ trợ cho một số thuật toán

o Là một thành phần của những cấu trúc dữ liệu khác

5 Cài đặt Stack bằng mảng

- Cách đơn giản nhất cài đặt một Stack là sử dụng một mảng

- Chúng ta thực hiện bổ sung phần tử vào từ trái qua phải

- Sử dụng một biến t lưu chỉ số của phẩn tử ở đỉnh của Stack

CHƯƠNG 5 HÀM (FRUNCTION)

1 Khái niệm fruction

- Hàm (function) là một đoạn chương trình có tên, đầu vào và đầu ra

Hàm có chức năng giải quyết một số vấn đề chuyên biệt cho chương trình chính Hàm được gọi nhiều lần với các tham số khác nhau

- Hàm là một đơn vị độc lập của chương trình, không cho phép xây dựng một hàm bên trong một hàm khác

- Một chương trình bao gồm một hoặc nhiều hàm Trong đó, hàm

main() là thành phần bắt buộc của chương trình.

2 Cú pháp khai báo hàm và viết hàm

o <kiểu trả về>: (char, int, float, … ) Nếu không trả về thì void

o <tên hàm>:theo quy tắc đặt tên định danh

o <Danh sách tham số>: giống khai báo biến, cách nhau dấu “,”

Trang 15

o <giá trị>:trả về cho hàm qua lệnh return

- Các bước viết hàm:

o Tên hàm

o Hàm sẽ thực hiện công việc gì

o Các đầu vào (nếu có)

else return b;

}int main(){

int x1, y1, x2, y2, x3, y3;

cin >> x1 >> y1 >> x2 >> y2 >> x3 >> y3;

// Lời gọi hàm

cout << "Max giữa x1 và y1 là: " << max_value(x1, y1) << endl; cout << "Max giữa x2 và y2 là: " << max_value(x2, y2) << endl; cout << "Max giữa x3 và y3 là: " << max_value(x3, y3);

return 0;

}

CHƯƠNG 5 TÌM KIẾM (SERCH)

1 Tìm kiếm tuần tự (sequence search)

- Thuật toán :

o Xuất phát từ phần tử đầu của dãy, thực hiện so sánh khóa của

nó với k Nếu trùng nhau thì dừng lại, nếu không trùng thì lặp lại với phần tử tiếp theo

o Quá trình dừng lại khi tìm thấy hoặc không còn phần tử nào nữa Khi đó thông báo không tìm thấy

Trang 16

}return -1;

- Thời gian chạy: O(n)

2 Tìm kiếm nhị phân (Binary search)

- Tìm kiếm nhị phân trên mảng:

o Thuật toán tìm kiếm nhị phân được thiết kế dựa trên chiến lược loại trừ

o Thuật toán: So sánh khóa k với khóa của phần tử ở giữa dãy

 Nếu trùng thì thông báo tìm thấy và dừng

 Nếu k> thì gọi đệ qui tìm trên nửa cuối dãy

 Nếu k< thì gọi đệ qui tìm trên nửa đầu dãy

 Quá trình tìm nếu phải tìm trong dãy rỗng thì dừng lại và thông báo không tìm thấy

Trang 17

- Yêu cầu khi xây dựng hàm băm:

o Hàm phải dải đều các địa chỉ trên bảng địa chỉ

o Hàm băm phải được tính toán đơn giản

b Một số phương pháp xây dựng hàm băm

- Phương pháp chia

o Để tính địa chỉ dải của đối tượng ta lấy giá trị khóa chia cho kích thước của bảng Địa chỉ dải là phần dư của phép chia đó.H(K) = K % m

o Giá trị khóa được phân ra thành nhiều đoạn bằng nhau

 Người ta sử dụng hai kỹ thuật phân đoạn sau đây:

 Tách: Tách các đoạn ra và mỗi đoạn được xếp thành một hàng, dóng lề trái hoặc lề phải

 Gấp: Gấp các đoạn lại theo đường biên tương tự như gấp giấy, các chữ rơi vào cùng một chỗ được đặt thành hàng thẳng nhau

c Bảng băm - Hash table

- Một bảng băm là một cấu trúc dựa trên mảng để lưu trữ các phần tử, mỗi phần tử là một cặp Khóa-Giá trị (key-value)

- Các thành phần cấu thanh lên bảng băm:

Trang 18

o Mảng (mỗi phần tử mảng lưu một danh sách các phần tử)

for (int i=0;i<x-2;i++){

for (int j =y; j>i; j ){

if (i<j){

Trang 19

}}

}

2 Sắp xêp chọn (selection sort)

- Ý tưởng: Chọnphần tử có khóa nhỏ nhất trong các phần tử còn lại chuyển nó về đầu và loại bỏ nó khỏi dãy

- Ví dụ sắp xếp theo thứu tự tăng dần:

o B1: chọn phần tử nhỏ nhất -1 đặt vào vị trí thứ nhất

o B2: chọn phần tử nhỏ thứ 2 là 0 đặt vào vị trí hai

o B3: chọn phần tử nhỏ thứ 3 là 3 đặt vào vị trí ba

o B4: chọn phần tử nhỏ thứ 4 là 6 đặt vào vị trí tư và phần tử lớn nhất được đẩy về cuối

Trang 20

o Tạo hai biến là trái và phải để trỏ tới bên trái và bên phải của danh sách.

o Thực hiện so sánh các phần tử với điểm đánh dấu Nếu phần tử nhỏ hơn điểm đánh dấu thì dịch chuyển qua bên trái và ngược lại

o Sau khi dịch chuyển thực hiện công việc sắp xếp các phần tử trong mảng con mới, trước khi tiếp tục phân đoạn tiếp theo

while (a[j] > p){

j ;}

4 Sắp xếp trộn – Merge sort

- Ý tưởng:

o Tìm chỉ số nằm giữa mảng đề chia mảng thành 2 nửa

o Gọi đệ quy hàm mergeSort cho nửa đầu tiền

o Gọi đệ quy hàm mergeSort cho nửa thứ hai

o Gộp 2 nửa mảng đã sắp xếp ở trên

Trang 21

int L[n1], R[n2];//tạo 2 mảng tạm thời để chứa các phần tử sau khi chia

// Copy dữ liệu sang các mảng tạm

Trang 22

// l là chỉ số trái và r là chỉ số phải của mảng cần được sắp xếp

void mergeSort(int arr[], int l, int r)

5 Sắp xếp vun đống – Heap sort

- là một cấu trúc dữ liệu dạng cây, trong đó các nút trên cây được sắp xếptheo một thứ tự ràng buộc nhất định giữa khóa của nút cha và khóa của nút con (thường là nút cha nhỏ hơn hoặc lớn hơn nút con) Nút ở gốc của Heap luôn luôn là nút có mức ưu tiên cao nhất, nghĩa là lớn nhất hoặc nhỏ nhất

- giải thuật:

Trang 23

o Chia mảng ban đầu thành hai mảng con: Một mảng bao gồm các phần tử đã sắp xếp và một mảng bao gồm các phần tử còn lại chưa được sắp xếp Ban đầu, mảng đã sắp xếp là mảng rỗng,mảng chưa sắp xếp chính là mảng ban đầu.

o Tìm phần tử nhỏ nhất/lớn nhất trong mảng chưa sắp xếp và đưa

nó vào cuối mảng đã sắp xếp (tùy vào cách sắp xếp là tăng dần hay giảm dần) Đây chính là bước cần sử dụng đến cấu trúc dữ liệu Heap

- Các bước chạy lệnh:

EX: sắp xếp dãy số Cho mảng a=(2,3,5,6,4,1,7), Ở đây n = 7 Các

phần tử từ a[4] đến a[7] là lá

o Bước 1: Tạo đống

 Vun cây gốc a[3] ta được mảng a=(2,3,7,6,4,1,5)

 Vun cây gốc a[2] ta được mảng a=(2,6,7,3,4,1,5)

 Vun cây gốc a[1] ta được mảng a=(7,6,5,3,4,1,2)Bây giờ a=(7,6,5,3,4,1,2) đã là đống

o Bước 2: Sắp xếp vun đống

 Đổi chỗ a[1] với a[7]: a=(2,6,5,3,4,1,7) và vun lại mảng

a[1 6] ta được mảng a=(6,4,5,3,2,1,7)

 Đổi chỗ a[1] với a[6]: a=(1,4,5,3,2,6,7) và vun lại mảng

a[1 5] ta được mảng a=(5,4,1,3,2,6,7)

 Đổi chỗ a[1] với a[5]: a=(1,4,2,3,5,6,7) và vun lại mảng

a[1 4] ta được mảng a=(4,3,1,2,5,6,7)

 Đổi chỗ a[1] với a[4]: a=(1,3,2,4,5,6,7) và vun lại mảng

a[1 3] ta được mảng a=(3,2,1,4,5,6,7)

 Đổi chỗ a[1] với a[3]: a=(2,1,3,4,5,6,7) và vun lại mảng

a[1 2] ta được mảng a=(2,1,3,4,5,6,7)

 Đổi chỗ a[1] với a[2]:a=(1,2,3,4,5,6,7) Mảng còn lại chỉ

int largest = i; // khoi tao largest nhu la root

int l = 2 * i + 1; // left = 2*i + 1

int r = 2 * i + 2; // right = 2*i + 2

// Neu nut con trai lon hon so voi root

if (l < n && arr[l] > arr[largest])

largest = l;

// Neu nut con phai lon hon so voi root

if (r < n && arr[r] > arr[largest])

Trang 24

// Ham vun dong

void heapSort(int arr[], int n)

{

// Tao mot dong (Sap xep lai mang)

for (int i = n / 2 - 1; i >= 0; i )

heapify(arr, n, i);

// Trích xuất từng một phần tử một từ heapfor (int i = n - 1; i >= 0; i )

Trang 25

return 0;

}

CHƯƠNG 7: VECTOR

1 Khái niệm về vector

- Vector là một mảng động có thể thay đổi kích thước,không nhất thiết phảikhai báo kích thước cố định như mảng tĩnh.Nó có thể tự động tăng haygiảm kích thước khi ta xóa hoặc chèn phần tử khác vào vector

2 Một số điểm nổi bật của vector

Không cần phải khai báo kích thước của mảng vì vector có thể tự động tăngkích thước lên

- Nếu bạn nâng thêm 1 phần tử vào vector đã đầy rồi, thì nó sẽ tự động tăngkích thước của nó để dành chỗ cho giá trị mới này

- Vector còn giúp bạn biết số lượng các phần tử mà bạn đã lưu trong đó

- Dùng số phần tử âm vẫn được trong vector

3 Cú pháp của một vector:

Vector< kiểu dữ liệu >tên vector

- Để sử dụng được cấu trúc dữ liệu vector ta phải khai báo thư việnvector

o Hàm push_back(): Là hàm cho phép ta đẩy 1 phần tử vào vị trísau cùng của vector

o Hàm pop_back(): Là hàm cho phép ta xóa phần tử cuối cùngcủa vector

o Hàm size: Là hàm cho phép ta kiểm tra số lượng phần tử trongvector

CHƯƠNG 8 CÂY

1 Tổng quát:

Ngày đăng: 25/11/2022, 20:13

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w