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

Bài tập lớn cấu trúc dữ liệu và giải thuật

39 3 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ài tập lớn cấu trúc dữ liệu và giải thuật
Tác giả Bùi Đức Toàn
Người hướng dẫn Thầy Quảng
Trường học Trường Cao đẳng Công nghệ Bách Khoa Hà Nội
Chuyên ngành Công nghệ thông tin
Thể loại Bài tập lớn
Định dạng
Số trang 39
Dung lượng 6,66 MB

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

Nội dung

LỜI CAM ĐOANEm xin cam đoan bài tập lớn môn Cấu trúc dữ liệu và giải thuật là kết quả thực hiện của bản thân em dưới sự hướng dẫn của thầy Quảng Những phần sử dụng tài liệu tham khảo tro

Trang 1

Ngành: Công nghệ thông tin

SINH VIÊN THỰC HIỆN: Bùi Đứa Toàn

MÃ SỐ SINH VIÊN: 20012030356

LỚP: K20.PR02

GV HƯỚNG DẪN: Thầy Quảng

Trang 2

Ngành: Công nghệ thông tin

SINH VIÊN THỰC HIỆN: Bùi Đức Toàn

MÃ SỐ SINH VIÊN: 20012030356

LỚP: K20.PR02

GV HƯỚNG DẪN MÔN HỌC: Thầy Quảng

Trang 3

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

………

GIẢNG VIÊN HƯỚNG DẪN

Trang 4

LỜI CAM ĐOAN

Em xin cam đoan bài tập lớn môn Cấu trúc dữ liệu và giải thuật là kết quả thực hiện của bản thân em dưới sự hướng dẫn của thầy Quảng

Những phần sử dụng tài liệu tham khảo trong bài tập lớn đã được nêu rõ trong phần tài liệu tham khảo Các kết quả trình bày trong bài tập lớn và chương trình xây dựng được hoàn toàn là kết quả do bản thân em thực hiện.

Nếu vi phạm lời cam đoan này, em xin chịu hoàn toàn trách nhiệm trước khoa và nhà trường.

Hà Nội, ngày … tháng … năm…

Họ và tên sinh viên

Trang 5

LỜI CẢM ƠN

Để có thể hoàn thành bài tập lớn này, lời đầu tiên em xin phép gửi lời cảm ơn tới bộ môn Lập trình và phát triển ứng dụng web nâng cao, Khoa Công nghệ thông tin – Trường Cao đẳng Công nghệ Bách Khoa Hà Nội đã tạo điều kiện thuận lợi cho em thực hiện bài tập lớn môn học này.

Đặc biệt em xin chân thành cảm ơn thầy Quảng đã rất tận tình hướng dẫn, chỉ bảo em trong suốt thời gian thực hiện bài tập lớn vừa qua.

Em cũng xin chân thành cảm ơn tất cả các Thầy, các Cô trong Trường đã tận tình giảng dạy, trang bị cho em những kiến thức cần thiết, quý báu để giúp em thực hiện được bài tập lớn này.

Mặc dù em đã có cố gắng, nhưng với trình độ còn hạn chế, trong quá trình thực hiện

đề tài không tránh khỏi những thiếu sót Em hi vọng sẽ nhận được những ý kiến nhận xét, góp ý của các Thầy giáo, Cô giáo về những kết quả triển khai trong bài tập lớn.

Em xin trân trọng cảm ơn!

Trang 6

MỤC LỤC

CHƯƠNG I: CƠ SỞ LÝ THUYẾT 9

1.1 Khái niệm về giải thuật 9

1.1.1 Giải thuật là gì? 9

1.2 Cấu trúc dữ liệu mảng (Array) 18

1.2.1 Khái niệm 18

Mảng (Array) là một trong các cấu trúc dữ liệu cũ và quan trọng nhất Mảng có thể lưu giữ một số phần tử cố định và các phần tử này nền có cùng kiểu Hầu hết các cấu trúc dữ liệu đều sử dụng mảng để triển khai giải thuật Dưới đây là các khái niệm quan trọng liên quan tới Mảng 18

Phần tử: Mỗi mục được lưu giữ trong một mảng được gọi là một phần tử 18

Chỉ mục (Index): Mỗi vị trí của một phần tử trong một mảng có một chỉ mục số được sử dụng để nhận diện phần tử 18

Mảng gồm các bản ghi có kiểu giống nhau, có kích thước cố định, mỗi phần tử được xác định bởi chỉ số 18 Mảng là cấu trúc dữ liệu được cấp phát lien tục cơ bản 18

1.2.2 Ưu điểm 18

 Truy câp phàn tử với thời gian hằng số O(1) 18

 Sử dụng bộ nhớ hiệu quả 18

 Tính cục bộ về bộ nhớ 18

1.2.3 Nhược điểm 18

Không thể thay đổi kích thước của mảng khi chương trình dang thực hiện 18

1.2.4 Mảng động 18

Mảng động (dynamic aray) : cấp phát bộ nhớ cho mảng một cách động trong quá trình chạy chương trình trong C là malloc và calloc, trong C++ là new 18

Sử dụng mảng động ta bắt đầu với mảng có 1 phàn tử, khi số lượng phàn tử vượt qua khả năng của ảng thì ta gấp đôi kích thước mảng cuc và copy phàn tử mảng cũ vào nửa đầu của mảng mới 18

Ưu điểm: tránh lãng phí bộ nhớ khi phải khai báo mảng có kích thước lớn ngay từ đầu 18

Nhược điểm: 18

 Phải thực hiện them thao tác copy phần tử mỗi khi thay đổi kích thước 18

 Một số thời gian thực hiện thao tác không còn là hằng số nữa 18

1.2.5 Biểu diễn Cấu trúc dữ liệu mảng 18

Mảng có thể được khai báo theo nhiều cách đa dạng trong các ngôn ngữ lập trình Để minh họa, chúng ta sử dụng phép khai báo mảng trong ngôn ngữ C: 19

19

Hình minh họa phần tử và chỉ mục: 19

Trang 7

Dưới đây là một số điểm cần ghi nhớ về cấu trúc dữ liệu mảng: 19

 Chỉ mục bắt đầu với 0 19

 Độ dài mảng là 10, nghĩa là mảng có thể lưu giữ 10 phần tử 19

 Mỗi phần tử đều có thể được truy cập thông qua chỉ mục của phần tử đó Ví dụ, chúng ta có thể lấy giá trị của phần tử tại chỉ mục 6 là 27 19

1.2.6 Phép toán cơ bản được hỗ trợ bởi mảng 19

Duyệt: In tất cả các phần tử mảng theo cách in từng phần tử một 19

Chèn: Thêm một phần tử vào mảng tại chỉ mục đã cho 19

Xóa: Xóa một phần tử từ mảng tại chỉ mục đã cho 19

Tìm kiếm: Tìm kiếm một phần tử bởi sử dụng chỉ mục hay bởi giá trị 19

Cập nhật: Cập nhật giá trị một phần tử tại chỉ mục nào đó 19

Trong ngôn ngữ C, khi một mảng được khởi tạo với kích cỡ ban đầu, thì nó gán các giá trị mặc định cho các phần tử của mảng theo thứ tự sau: 19

Kiểu dữ liệu 19

Giá trị mặc định 19

bool 19

false 19

char 19

0 19

int 20

0 20

float 20

0.0 20

double 20

0.0f 20

void 20

wchar_t 20

0 20

1.3 Danh sách liên kết (Linked list) 20

1.3.1 Khái niệm 20

1.7.1 Khái niệm 35

Cấu trúc dữ liệu cây biểu diễn các nút (node) được kết nối bởi các cạnh Chúng ta sẽ tìm hiểu về Cây nhị phân (Binary Tree) và Cây tìm kiếm nhị phân (Binary Search Tree) trong phần này 35

Trang 8

Cây nhị phân là một cấu trúc dữ liệu đặc biệt được sử dụng cho mục đích lưu trữ dữ liệu Một cây nhị phân có một điều kiện đặc biệt là mỗi nút có thể có tối

đa hai nút con Một cây nhị phân tận dụng lợi thế của hai kiểu cấu trúc dữ liệu: một mảng đã sắp thứ tự và một danh sách liên kết (Linked List), do đó việc tìm kiếm sẽ nhanh như trong mảng đã sắp thứ tự và các thao tác chèn và xóa cũng

sẽ nhanh bằng trong Linked List 35

35 Dưới đây là một số khái niệm quan trọng liên quan tới cây nhị phân: 35

 Đường: là một dãy các nút cùng với các cạnh của một cây 35

 Nút gốc (Root): nút trên cùng của cây được gọi là nút gốc Một cây sẽ chỉ có

một nút gốc và một đường xuất phát từ nút gốc tới bất kỳ nút nào khác Nút gốc

là nút duy nhất không có bất kỳ nút cha nào 35

 Nút cha: bất kỳ nút nào ngoại trừ nút gốc mà có một cạnh hướng lên một

nút khác thì được gọi là nút cha 35

 Nút con: nút ở dưới một nút đã cho được kết nối bởi cạnh dưới của nó được

gọi là nút con của nút đó 35

 Nút lá: nút mà không có bất kỳ nút con nào thì được gọi là nút lá 35

 Cây con: cây con biểu diễn các con của một nút 36

 Truy cập: kiểm tra giá trị của một nút khi điều khiển là đang trên một nút

đó 36

 Duyệt: duyệt qua các nút theo một thứ tự nào đó 36

Trang 9

 Bậc: bậc của một nút biểu diễn số con của một nút Nếu nút gốc có bậc là 0,

thì nút con tiếp theo sẽ có bậc là 1, và nút cháu của nó sẽ có bậc là 2, … 36

 Khóa (Key): biểu diễn một giá trị của một nút dựa trên những gì mà một thao tác tìm kiếm thực hiện trên nút 36

1.7.2 Hoạt động cơ bản trên cây tìm kiếm nhị phân 36

 Chèn: chèn một phần tử vào trong một cây/ tạo một cây 36

 Tìm kiếm: tìm kiếm một phần tử trong một cây 36

 Duyệt tiền thứ tự: duyệt một cây theo cách thức duyệt tiền thứ tự (tham khảo chương sau) 36

 Duyệt trung thứ tự: duyệt một cây theo cách thức duyệt trung thứ tự (tham khảo chương sau) 36

 Duyệt hậu thứ tự: duyệt một cây theo cách thức duyệt hậu thứ tự (tham khảo chương sau) 36

PHẦN KẾT LUẬN 36

TÀI LIỆU THAM KHẢO 38

CHƯƠNG I: CƠ SỞ LÝ THUYẾT

1.1 Khái niệm về giải thuật 1.1.1 Giải thuật là gì?

Giải thuật (hay còn gọi là thuật toán - tiếng Anh là Algorithms) là một tập hợp hữu hạn các chỉ thị để được thực thi theo một thứ tự nào đó để thu được kết quả mong muốn Nói chung thì giải thuật là độc lập với các ngôn ngữ lập trình, tức là một giải thuật có thể được triển khai trong nhiều ngôn ngữ lập trình khác nhau.

Xuất phát từ quan điểm của cấu trúc dữ liệu, dưới đây là một số giải thuật quan trọng:

 Giải thuật Tìm kiếm: Giải thuật để tìm kiếm một phần tử trong một cấu trúc

dữ liệu.

 Giải thuật Sắp xếp: Giải thuật để sắp xếp các phần tử theo thứ tự nào đó.

 Giải thuật Chèn: Giải thuật để chèn phần từ vào trong một cấu trúc dữ liệu.

Trang 10

 Giải thuật Cập nhật: Giải thuật để cập nhật (hay update) một phần tử đã tồn

tại trong một cấu trúc dữ liệu.

 Giải thuật Xóa: Giải thuật để xóa một phần tử đang tồn tại từ một cấu trúc dữ

liệu.

1.1.2 Đặc điểm của giải thuật

Không phải tất cả các thủ tục có thể được gọi là một giải thuật Một giải thuật nên có các đặc điểm sau:

 Tính xác định: Giải thuật nên rõ ràng và không mơ hồ Mỗi một giai đoạn (hay

mỗi bước) nên rõ ràng và chỉ mang một mục đích nhất định.

 Dữ liệu đầu vào xác định: Một giải thuật nên có 0 hoặc nhiều hơn dữ liệu đầu

vào đã xác định.

 Kết quả đầu ra: Một giải thuật nên có một hoặc nhiều dữ liệu đầu ra đã xác

định, và nên kết nối với kiểu kết quả bạn mong muốn.

 Tính dừng: Các giải thuật phải kết thúc sau một số hữu hạn các bước.

 Tính hiệu quả: Một giải thuật nên là có thể thi hành được với các nguồn có sẵn,

tức là có khả năng giải quyết hiệu quả vấn đề trong điều kiện thời gian và tài nguyên cho phép.

 Tính phổ biến: Một giải thuật có tính phổ biến nếu giải thuật này có thể giải

quyết được một lớp các vấn đề tương tự.

 Độc lập: Một giải thuật nên có các chỉ thị độc lập với bất kỳ phần code lập trình

nào.

1.1.3 Giải thuật tiệm cận - Asymptotic Algorithms

Phân tích tiệm cận của một giải thuật là khái niệm giúp chúng ta ước lượng được thời gian chạy (Running Time) của một giải thuật Sử dụng phân tích tiệm cận, chúng ta có thể đưa ra kết luận tốt nhất về các tình huống trường hợp tốt nhất, trường hợp trung bình, trường hợp xấu nhất của một giải thuật.

Phân tích tiệm cận tức là tiệm cận dữ liệu đầu vào (Input), tức là nếu giải thuật không có Input thì kết luận cuỗi cùng sẽ là giải thuật sẽ chạy trong một lượng thời gian cụ thể và là hằng số Ngoài nhân tố Input, các nhân tố khác được xem như là không đổi.

Phân tích tiệm cận nói đến việc ước lượng thời gian chạy của bất kỳ phép tính nào trong các bước tính toán Ví dụ, thời gian chạy của một phép tính nào đó được ước lượng là một hàm f(n) và với một phép tính khác là hàm g(n2) Điều này có nghĩa là thời gian chạy của

Trang 11

phép tính đầu tiên sẽ tăng tuyến tính với sự tăng lên của n và thời gian chạy của phép tính thứ hai sẽ tăng theo hàm mũ khi n tăng lên Tương tự, khi n là khá nhỏ thì thời gian chạy của hai phép tính là gần như nhau.

Thường thì thời gian cần thiết bởi một giải thuật được chia thành 3 loại:

 Trường hợp tốt nhất: là thời gian nhỏ nhất cần thiết để thực thi chương trình.

 Trường hợp trung bình: là thời gian trung bình cần thiết để thực thi chương

trình.

 Trường hợp xấu nhất: là thời gian tối đa cần thiết để thực thi chương trình.

Asymptotic Notation trong Cấu trúc dữ liệu và giải thuật

Dưới đây là các Asymptotic Notation được sử dụng phổ biến trong việc ước lượng độ phức tạp thời gian chạy của một giải thuật:

 Ο Notation

 Ω Notation

 θ Notation

 Big Oh Notation, Ο trong Cấu trúc dữ liệu và giải thuật

Ο(n) là một cách để biểu diễn tiệm cận trên của thời gian chạy của một thuật toán Nó ước lượng độ phức tạp thời gian trường hợp xấu nhất hay chính là lượng thời gian dài nhất cần thiết bởi một giải thuật (thực thi từ bắt đầu cho đến khi kết thúc) Đồ thị biểu diễn như sau:

Ví dụ, gọi f(n) và g(n) là các hàm không giảm định nghĩa trên các số nguyên dương (tất

cả các hàm thời gian đều thỏa mãn các điều kiện này):

Ο( f ( )) = { g ( ) : n n ế u t n t ồ ạ i c > 0 v n sao cho à 0 g n c ( ) ≤ f ( )

Trang 12

v ớ i m i n ọ > n 0 }

 Omega Notation, Ω trong Cấu trúc dữ liệu và giải thuật

The Ω(n) là một cách để biểu diễn tiệm cận dưới của thời gian chạy của một giải thuật

Nó ước lượng độ phức tạp thời gian trường hợp tốt nhất hay chính là lượng thời gian ngắn nhất cần thiết bởi một giải thuật Đồ thị biểu diễn như sau:

Ví dụ, với một hàm f(n):

Ω( f ( )) ≥ { g ( ) : n n ế u t n t ồ ạ i c > 0 v n sao cho à 0 g n c ( ) ≤ f ( )

v ớ i m i n ọ > n 0 }

 Theta Notation, θ trong Cấu trúc dữ liệu và giải thuật

The θ(n) là cách để biểu diễn cả tiệm cận trên và tiệm cận dưới của thời gian chạy của một giải thuật Bạn nhìn vào đồ thì sau:

θ( f ( )) = { g ( ) n n ế u v ch à ỉ n u ế g ( ) = Ο( f ( )) v g à ( ) = Ω( ( )) f n

v ớ i m i n ọ > n 0 }

Một số Asymptotic Notation phổ biến trong cấu trúc dữ liệu và giải thuật

Trang 13

1.1.4 Giải thuật tham lam - Greedy Algorithms

Tham lam (hay tham ăn) là một trong những phương pháp phổ biến nhất để thiết kế giải thuật Nếu bạn đã đọc truyện dân gian thì sẽ có câu chuyện như thế này: trên một mâm

cỗ có nhiều món ăn, món nào ngon nhất ta sẽ ăn trước, ăn hết món đó ta sẽ chuyển sang món ngon thứ hai, và chuyển tiếp sang món thứ ba, …

Rất nhiều giải thuật nổi tiếng được thiết kế dựa trên ý tưởng tham lam, ví dụ như giải thuật cây khung nhỏ nhất của Dijkstra, giải thuật cây khung nhỏ nhất của Kruskal, …

Giải thuật tham lam (Greedy Algorithm) là giải thuật tối ưu hóa tổ hợp Giải thuật

tìm kiếm, lựa chọn giải pháp tối ưu địa phương ở mỗi bước với hi vọng tìm được giải pháp tối ưu toàn cục.

Giải thuật tham lam lựa chọn giải pháp nào được cho là tốt nhất ở thời điểm hiện tại và sau đó giải bài toán con nảy sinh từ việc thực hiện lựa chọn đó Lựa chọn của giải thuật tham lam có thể phụ thuộc vào lựa chọn trước đó Việc quyết định sớm và thay đổi hướng đi của giải thuật cùng với việc không bao giờ xét lại các quyết định cũ sẽ dẫn đến kết quả là giải thuật này không tối ưu để tìm giải pháp toàn cục.

Bạn theo dõi một bài toán đơn giản dưới đây để thấy cách thực hiện giải thuật tham lam

và vì sao lại có thể nói rằng giải thuật này là không tối ưu.

Bài toán đếm số đồng tiền

Yêu cầu là hãy lựa chọn số lượng đồng tiền nhỏ nhất có thể sao cho tổng mệnh giá của các đồng tiền này bằng với một lượng tiền cho trước.

Nếu tiền đồng có các mệnh giá lần lượt là 1, 2, 5, và 10 xu và lượng tiền cho trước là 18

xu thì giải thuật tham lam thực hiện như sau:

Bước 1: Chọn đồng 10 xu, do đó sẽ còn 18 – 10 = 8 xu.

Bước 2: Chọn đồng 5 xu, do đó sẽ còn là 3 xu.

Trang 14

Bước 3: Chọn đồng 2 xu, còn lại là 1 xu.

Bước 4: Cuối cùng chọn đồng 1 xu và giải xong bài toán.

Bạn thấy rằng cách làm trên là khá ổn, và số lượng đồng tiền cần phải lựa chọn là 4 đồng tiền Nhưng nếu chúng ta thay đổi bài toán trên một chút thì cũng hướng tiếp cận như trên có thể sẽ không đem lại cùng kết quả tối ưu.

Chẳng hạn, một hệ thống tiền tệ khác có các đồng tiền có mệnh giá lần lượt là 1, 7 và 10

xu và lượng tiền cho trước ở đây thay đổi thành 15 xu thì theo giải thuật tham lam thì số đồng tiền cần chọn sẽ nhiều hơn 4 Với giải thuật tham lam thì: 10 + 1 + 1 +1 + 1 + 1, vậy tổng cộng là 6 đồng tiền Trong khi cùng bài toán như trên có thể được xử lý bằng việc chỉ chọn 3 đồng tiền (7 + 7 +1).

Do đó chúng ta có thể kết luận rằng, giải thuật tham lam tìm kiếm giải pháp tôi ưu ở mỗi bước nhưng lại có thể thất bại trong việc tìm ra giải pháp tối ưu toàn cục.

Có khá nhiều giải thuật nổi tiếng được thiết kế dựa trên tư tưởng của giải thuật tham lam Dưới đây là một trong số các giải thuật này:

 Bài toán hành trình người bán hàng

 Giải thuật cây khung nhỏ nhất của Prim

 Giải thuật cây khung nhỏ nhất của Kruskal

 Giải thuật cây khung nhỏ nhất của Dijkstra

 Bài toán xếp lịch công việc

 Bài toán xếp ba lô

1.1.5 Giải thuật chia để trị - Divide and Conquer Phương pháp chia để trị (Divide and Conquer) là một phương pháp quan trọng

trong việc thiết kế các giải thuật Ý tưởng của phương pháp này khá đơn giản và rất dễ hiểu: Khi cần giải quyết một bài toán, ta sẽ tiến hành chia bài toán đó thành các bài toán con nhỏ hơn Tiếp tục chia cho đến khi các bài toán nhỏ này không thể chia thêm nữa, khi đó ta sẽ giải quyết các bài toán nhỏ nhất này và cuối cùng kết hợp giải pháp của tất cả các bài toán nhỏ để tìm ra giải pháp của bài toán ban đầu.

Trang 15

Nói chung, bạn có thể hiểu giải thuật chia để trị (Divide and Conquer) qua 3 tiến trình sau:

Tiến trình 1: Chia nhỏ (Divide/Break)

Trong bước này, chúng ta chia bài toán ban đầu thành các bài toán con Mỗi bài toán con nên là một phần của bài toán ban đầu Nói chung, bước này sử dụng phương pháp đệ qui để chia nhỏ các bài toán cho đến khi không thể chia thêm nữa Khi đó, các bài toán con được gọi là "atomic – nguyên tử", nhưng chúng vẫn biểu diễn một phần nào đó của bài toán ban đầu.

Tiến trình 2: Giải bài toán con (Conquer/Solve)

Trong bước này, các bài toán con được giải.

Tiến trình 3: Kết hợp lời giải (Merge/Combine)

Sau khi các bài toán con đã được giải, trong bước này chúng ta sẽ kết hợp chúng một cách đệ qui để tìm ra giải pháp cho bài toán ban đầu.

Hạn chế của giải thuật chia để trị (Devide and Conquer)

Giải thuật chia để trị tồn tại hai hạn chế, đó là:

Làm thế nào để chia tách bài toán một cách hợp lý thành các bài toán con, bởi vì nếu các bài toán con được giải quyết bằng các thuật toán khác nhau thì sẽ rất phức tạp.

Việc kết hợp lời giải các bài toán con được thực hiện như thế nào.

Trang 16

Dưới đây là một số giải thuật được xây dựng dựa trên phương pháp chia để trị (Divide and Conquer):

 Giải thuật sắp xếp trộn (Merge Sort)

 Giải thuật sắp xếp nhanh (Quick Sort)

 Giải thuật tìm kiếm nhị phân (Binary Search)

 Nhân ma trận của Strassen

1.1.6 Giải thuật qui hoạch động - Dynamic Programming Giải thuật Qui hoạch động (Dynamic Programming) giống như giải thuật chia để trị

(Divide and Conquer) trong việc chia nhỏ bài toán thành các bài toán con nhỏ hơn và sau đó thành các bài toán con nhỏ hơn nữa có thể Nhưng không giống chia để trị, các bài toán con này không được giải một cách độc lập Thay vào đó, kết quả của các bài toán con này được lưu lại và được sử dụng cho các bài toán con tương tự hoặc các bài toán con gối nhau (Overlapping Sub-problems).

Chúng ta sử dụng Qui hoạch động (Dynamic Programming) khi chúng ta có các bài toán

mà có thể được chia thành các bài toán con tương tự nhau, để mà các kết quả của chúng có thể được tái sử dụng Thường thì các giải thuật này được sử dụng cho tối ưu hóa Trước khi giải bài toán con, giải thuật Qui hoạch động sẽ cố gắng kiểm tra kết quả của các bài toán con

đã được giải trước đó Các lời giải của các bài toán con sẽ được kết hợp lại để thu được lời giải tối ưu.

Do đó, chúng ta có thể nói rằng:

Bài toán ban đầu nên có thể được phân chia thành các bài toán con gối nhau nhỏ hơn Lời giải tối ưu của bài toán có thể thu được bởi sử dụng lời giải tối ưu của các bài toán con.

Giải thuật Qui hoạch động sử dụng phương pháp lưu trữ (Memoization) – tức là chúng

ta lưu trữ lời giải của các bài toán con đã giải, và nếu sau này chúng ta cần giải lại chính bài toán đó thì chúng ta có thể lấy và sử dụng kết quả đã được tính toán.

Giải thuật tham lam và giải thuật qui hoạch động

Giải thuật tham lam (Greedy Algorithms) là giải thuật tìm kiếm, lựa chọn giải pháp tối

ưu địa phương ở mỗi bước với hi vọng tìm được giải pháp tối ưu toàn cục.

Giải thuật Qui hoạch động tối ưu hóa các bài toán con gối nhau.

Trang 17

Giải thuật chia để trị và giải thuật Qui hoạch động

Giải thuật chia để trị (Divide and Conquer) là kết hợp lời giải của các bài toán con để tìm ra lời giải của bài toán ban đầu.

Giải thuật Qui hoạch động sử dụng kết quả của bài toán con và sau đó cố gắng tối ưu bài toán lớn hơn Giải thuật Qui hoạch động sử dụng phương pháp lưu trữ (Memoization) để ghi nhớ kết quả của các bài toán con đã được giải.

Dưới đây là một số bài toán có thể được giải bởi sử dụng giải thuật Qui hoạch động:

 Dãy Fibonacci

 Bài toán tháp Hà Nội (Tower of Hanoi)

 Bài toán ba lô

1.1.7 Giải thuật định lý thợ - Master Theorem

Chúng ta sử dụng Định lý thợ (Master Theorem) để giải các công thức đệ quy dạng sau một cách hiệu quả :

T(n) =aT(n/b) + c.n^k trong đó a>=1 , b>1 Bài toán ban đầu được chia thành a bài toán con có kích thước mỗi bài là n/b, chi phí

để tổng hợp các bài toán con là f(n).

Ví dụ : Thuật toán sắp xếp trộn chia thành 2 bài toán con , kích thước n/2 Chi phí tổng hợp 2 bài toán con là O(n).

Định lý thợ

a>=1, b>1, c, k là các hằng số T(n) định nghĩa đệ quy trên các tham số không âm T(n) = aT(n/b) + c.n^k + Nếu a> b^k thì T(n) =O(n^ (logab)) + Nếu a= b^k thì T(n)=O(n^k.lgn) + Nếu a< b^k thì T(n) = O(n^k)

Chú ý: Không phải trường hợp nào cũng áp dụng được định lý thợ

VD : T(n) = 2T(n/2) +nlogn a =2, b =2, nhưng không xác định được số nguyên k

1.2 Cấu trúc dữ liệu mảng (Array) 1.2.1 Khái niệm

Mảng (Array) là một trong các cấu trúc dữ liệu cũ và quan trọng nhất Mảng có thể lưu

giữ một số phần tử cố định và các phần tử này nền có cùng kiểu Hầu hết các cấu trúc dữ

Trang 18

liệu đều sử dụng mảng để triển khai giải thuật Dưới đây là các khái niệm quan trọng liên quan tới Mảng.

Phần tử: Mỗi mục được lưu giữ trong một mảng được gọi là một phần tử.

Chỉ mục (Index): Mỗi vị trí của một phần tử trong một mảng có một chỉ mục số được

Ưu điểm: tránh lãng phí bộ nhớ khi phải khai báo mảng có kích thước lớn ngay từ đầu Nhược điểm:

 Phải thực hiện them thao tác copy phần tử mỗi khi thay đổi kích thước.

 Một số thời gian thực hiện thao tác không còn là hằng số nữa.

1.2.5 Biểu diễn Cấu trúc dữ liệu mảng

Mảng có thể được khai báo theo nhiều cách đa dạng trong các ngôn ngữ lập trình Để minh họa, chúng ta sử dụng phép khai báo mảng trong ngôn ngữ C:

Trang 19

Hình minh họa phần tử và chỉ mục:

Dưới đây là một số điểm cần ghi nhớ về cấu trúc dữ liệu mảng:

 Chỉ mục bắt đầu với 0.

 Độ dài mảng là 10, nghĩa là mảng có thể lưu giữ 10 phần tử.

 Mỗi phần tử đều có thể được truy cập thông qua chỉ mục của phần tử đó Ví dụ, chúng ta có thể lấy giá trị của phần tử tại chỉ mục 6 là 27.

1.2.6 Phép toán cơ bản được hỗ trợ bởi mảng

 Duyệt: In tất cả các phần tử mảng theo cách in từng phần tử một.

 Chèn: Thêm một phần tử vào mảng tại chỉ mục đã cho.

 Xóa: Xóa một phần tử từ mảng tại chỉ mục đã cho.

 Tìm kiếm: Tìm kiếm một phần tử bởi sử dụng chỉ mục hay bởi giá trị.

 Cập nhật: Cập nhật giá trị một phần tử tại chỉ mục nào đó.

Trong ngôn ngữ C, khi một mảng được khởi tạo với kích cỡ ban đầu, thì nó gán các giá trị mặc định cho các phần tử của mảng theo thứ tự sau:

Ngày đăng: 08/09/2023, 00: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