Bài giảng Cấu trúc dữ liệu và giải thuật – Bài 1: Giới thiệu chung trình bày đôi nét về khái niệm về cấu trúc dữ liệu và giải thuật, giải thuật, dữ liệu và các cấu trúc dữ liệu, biểu diễn giải thuật, độ phức tạp của giải thuật.
Trang 1Lecturer: Dr Ngo Huu Phuc
Tel: 0438 326 077 Mob: 098 5696 580 Email: ngohuuphuc76@gmail.com
Trang 2Tài li ệu tham khảo
Mastering Algorithms with C, Kyle Loudon, 1999.
Introduction to Algorithms, Thomas H Cormen, Charles
E Leiserson, Ronald L Rivest and Clifford Stein, The MIT Press © 2001
Data Structures, Algorithms, and Object-Oriented
Programming NXB McGraw Hill; Tác giả Gregory
Heilleman -1996
C ấu trúc dữ liệu và giải thuật, Đỗ Xuân Lôi.
Trang 3Bài 1 Gi ới thiệu
N ội dung:
1.0 Đôi nét về khái niệm.
1.1 Gi ải thuật.
1.2 D ữ liệu và các cấu trúc dữ liệu.
1.3 Bi ểu diễn giải thuật.
1.4 Độ phức tạp của giải thuật.
Elliz Horowitz - Fundamentals of data structures, Chapter 1: Introduction
Trang 41.0 Đôi nét về khái niệm
Để giải một bài toán, bắt đầu từ câu hỏi “phải làm gì?”, sau
đó trả lời câu hỏi “làm như thế nào?” → đó là cách tiếp cận đến giải thuật và cấu trúc dữ liệu
Các bài toán trong thực tế không dễ giải bằng cách hiểu thông thường và để giảm độ phức tạp, trong nhiều trường
hợp có thể mô hình hóa bài toán
Từ việc mô hình hóa, trong thực tế thấy rằng có nhiều bài toán có cùng một mô hình hóa
Trang 51.0.1 M ột số ví dụ (1)
Ví d ụ 1: Tô màu bản đồ thế giới
Yêu c ầu:
Ta cần phải tô màu cho các nước trên bản đồ thế giới
Trong đó mỗi nước đều được tô một màu
Hai nước láng giềng (cùng biên giới) thì phải được tô bằng hai màu khác nhau
Hãy tìm một phương án tô màu sao cho số màu sử dụng là
ít nhất
Trang 61.0.2 M ột số ví dụ (2)
Hướng giải quyết bằng mô hình hóa:
Ta có th ể xem mỗi nước trên bản đồ thế giới là một đỉnh của đồ thị.
Hai nước láng giềng của nhau thì hai đỉnh ứng với nó được nối với nhau b ằng một cạnh
Bài toán lúc này tr ở thành bài toán tô màu cho đồ thị như sau:
M ỗi đỉnh đều phải được tô màu.
Hai đỉnh có cạnh nối thì phải tô bằng hai màu khác nhau.
C ần tìm một phương án tô màu sao cho số màu được sử dụng là ít
nh ất.
Trang 71.0.3 M ột số ví dụ (3)
Ví d ụ 2: Đèn giao thông
Cho m ột ngã năm như hình 1.
C và E là các đường một chiều theo chiều mũi tên.
Các đường khác là hai chiều
Hãy thi ết kế một bảng đèn hiệu điều khiển giao thông tại ngã năm này
m ột cách hợp lý: sao cho:
Phân chia các l ối đi tại ngã năm này thành các nhóm
M ỗi nhóm gồm các lối đi có thể cùng đi đồng thời nhưng không xảy ra tai nạn giao thông (các hướng đi không cắt nhau),
Và s ố lượng nhóm là ít nhất có thể được
Trang 81.0.4 Hướng giải quyết (VD2)
Ta có thể xem đầu vào (input) của bài toán là tất cả các lối
đi tại ngã năm này
Đầu ra (output) của bài toán là các nhóm lối đi có thể điđồng thời mà không xảy ra tai nạn giao thông
Mỗi nhóm sẽ tương ứng với một pha điều khiển của đèn
hiệu, vì vậy ta phải tìm kiếm lời giải với số nhóm là ít nhất
để giao thông không bị tắc nghẽn vì phải chờ đợi quá lâu
Trang 91.0.4 Hướng giải quyết (VD2) (t)
Trước hết ta nhận thấy rằng tại ngã năm này có 13 lối đi: AB, AC, AD,
BA, BC, BD, DA, DB, DC, EA, EB, EC, ED.
Th ể hiện các lối có thể đi đồng thời.
Ví d ụ cặp AB và EC có thể đi đồng thời, nhưng AD và EB thì không, vì các hướng giao thông cắt nhau.
S ử dụng sơ đồ trực quan:
Tên c ủa 13 lối đi được viết lên mặt phẳng,
Hai l ối đi nào nếu đi đồng thời sẽ xảy ra đụng nhau (tức là hai hướng đi cắt qua nhau) ta n ối lại bằng một đoạn thẳng.
Ta s ẽ có một sơ đồ như hình 2 Như vậy, trên sơ đồ này, hai lối đi có cạnh nối
l ại với nhau là hai lối đi không thể cho đi đồng thời.
Trang 10Hình 2
Trang 111.0.4 Hướng giải quyết (VD2) (t)
V ới cách biểu diễn như vậy ta đã có một đồ thị (Graph), tức là ta đã mô hình hoá bài toán giao thông ở trên theo mô hình toán là đồ thị.
M ỗi lối đi trở thành một đỉnh của đồ thị, hai lối đi không thể cùng đi đồng
th ời được nối nhau bằng một đoạn ta gọi là cạnh của đồ thị
Bây gi ờ ta phải xác định các nhóm, với số nhóm ít nhất, mỗi nhóm gồm các l ối đi có thể đi đồng thời, nó ứng với một pha của đèn hiệu điều
khi ển giao thông
Gi ả sử rằng, ta dùng màu để tô lên các đỉnh của đồ thị này sao cho:
Các l ối đi cho phép cùng đi đồng thời sẽ có cùng một màu: Dễ dàng nhận
th ấy rằng hai đỉnh có cạnh nối nhau sẽ không được tô cùng màu
S ố nhóm là ít nhất: ta phải tính toán sao cho số màu được dùng là ít nhất
Trang 121.0.4 Hướng giải quyết (VD2) (t)
"Tô màu cho đồ thị ở hình 2 sao cho:
Hai đỉnh có cạnh nối với nhau (hai còn gọi là hai đỉnh kề nhau) không cùng màu
S ố màu được dùng là ít nhất."
Nh ận xét:
Hai bài toán thực tế “tô màu bản đồ thế giới” và “đèn giaothông” xem ra rất khác biệt nhau nhưng sau khi mô hìnhhóa, chúng thực chất chỉ là một, đó là bài toán “tô màu đồ
thị”
Trang 131.0.5 Thi ết kế giải thuật để giải bài toán “ tô màu đồ thị”
Bài toán “tô màu đồ thị không có giải thuật tối ưu
Để có kết quả tối ưu, cần sử dụng phương pháp vét cạn Phương pháp này tốt khi số phép thử là nhỏ
Thông thường, để đơn giản hóa, có thể:
Thêm thông tin vào bài toán để đồ thị có một số tính chất đặc biệt và dùng các tính ch ất đặc biệt này ta có thể dễ dàng tìm lời giải, hoặc
Thay đổi yêu cầu bài toán một ít cho dễ giải quyết, nhưng lời giải tìm được chưa chắc là lời giải tối ưu
Cách này được xem là "Cố gắng tô màu cho đồ thị bằng ít màu nhất một cách nhanh chóng"
Một giải pháp như thế gọi là một HEURISTIC
Trang 141.0.6 Gi ải thuật HEURISTIC
HEURISTIC cho bài toán tô màu đồ thị, thường gọi là giải thuật "háu ăn" (GREEDY) là:
Ch ọn một đỉnh chưa tô màu và tô nó bằng một màu mới C nào đó
Duy ệt danh sách các đỉnh chưa tô màu Đối với một đỉnh chưa tô
màu, xác định xem nó có kề với một đỉnh nào được tô bằng màu C đó không N ếu không có, tô nó bằng màu C đó
Ý tưởng của Heuristic này là hết sức đơn giản: dùng một
màu để tô cho nhiều đỉnh nhất có thể được (các đỉnh được xét theo một thứ tự nào đó), khi không thể tô được nữa với màu đang dùng thì dùng một màu khác Như vậy ta có thể
"hi vọng" là số màu cần dùng sẽ ít nhất
Trang 16Gi ải bài toán giao thông bằng HEURISTIC
Trở lại bài toán giao thông ở trên và áp dụng HEURISTIC
Greedy cho đồ thị trong hình 2 (theo thứ tự các đỉnh đã liệt
kê ở trên), ta có kết quả:
Tô màu xanh cho các đỉnh: AB,AC,AD,BA,DC,ED
Tô màu đỏ cho các đỉnh: BC,BD,EA
Tô màu tím cho các đỉnh: DA,DB
Tô màu vàng cho các đỉnh: EB,EC
Chú ý: 4 màu là 1 lời giải, nhưng chưa kết luận được có tối
ưu hay không
Trang 17Ch ứng minh về số mầu cần thiết để tô là 4?
Đồ thị trong hình I.2 có 4 đỉnh: AC,DA,BD,EB mà mỗi cặp đỉnh
bất kỳ đều được nối nhau vậy đồ thị hình I.2 không thể tô
với ít hơn 4 màu Điều này khẳng định rằng lời giải vừa tìm được ở trên trùng với lời giải tối ưu
Trang 181.1 Các gi ải thuật
1.1.1 Th ế nào là giải thuật.
1.1.2 Ví d ụ về giải thuật: Sắp xếp một dãy 1.1.3 Định nghĩa giải thuật.
Trang 19 Giải thuật là các ý tưởng đằng sau chương trình trên máy tính.
Giải thuật không thay đổi khi viết trên các ngôn ngữ khác nhau
Giải thuật phải giải quyết được các vấn đề tổng quát cũng như các vấn đề riêng của một bài toán
Giải thuật cần có đầu vào và đầu ra rõ ràng
Trang 20 Input : M ột dãy số gồm N phần tử
a[1], a[2], … , a[n]
Output : S ắp xếp lại dãy số trên
dãy s ố trên có dạng:
a[1] <= a[2] <= … <= a[n]
• C ần tìm giải thuật chính xác và hi ệu quả
Trang 211.1.3 Nghiên c ứu giải thuật cần gì?
1 Máy tính để thực hiện giải thuật.
2 Ngôn ng ữ lập trình để diễn tả giải thuật.
3 Cơ sở của giải thuật.
4 Phân tích gi ải thuật.
Trang 221.1.4 Định nghĩa giải thuật.
Knuth (1973) định nghĩa giải thuật là một chuỗi hữu hạn các thao tác để
gi ải một bài toán nào đó Các tính chất quan trọng của giải thuật là :
1. Input: Không có hoặc có một số, được đưa từ ngoài vào
2. Output: Có ít nhất một đầu ra
3. Xác định (Definiteness) : mỗi bước của giải thuật phải được xác
định rõ ràng và phải được thực hiện chính xác, nhất quán
4 Hữu hạn (Finiteness) : giải thuật phải luôn luôn kết thúc sau một số
h ữu hạn bước
5 Hiệu quả (Effectiveness) : các thao tác trong giải thuật phải được
th ực hiện trong một lượng thời gian hữu hạn.
Trang 241.2.1 Là ngành khoa h ọc máy tính –
nghiên c ứu về dữ liệu
1. Máy tính lưu trữ dữ liệu
2. Ngôn ng ữ được sử dụng để thao tác với dữ liệu.
3. D ữ liệu được hiệu chỉnh, diễn tả hợp lý từ dữ liệu
g ốc.
4. C ấu trúc để biểu diễn dữ liệu.
Trang 251.2.2 Các ki ểu dữ liệu.
Ki ểu dữ liệu là khái niệm về loại của dữ liệu cho
bi ến trong chương trình.
Trong ngôn ng ữ C ki ểu dữ liệu có sẵn như: int ,
float , char , double…
Trong ngôn ng ữ FORTRAN kiểu dữ liệu có sẵn
như: INTEGER, REAL, LOGICAL, COMPLEX, DOUBLE PRECISION…
Trang 261.2.3 Mi ền xác định của dữ liệu
• Ví d ụ: Với kiểu bool , D = {0, 1}
• Ví d ụ: Với kiểu int , D = {0, 1, 2, }
• V ới các ký tự hoặc xâu ký tự, D = {' ','A','B',
,'Z',”AA” }
• Như vậy, D có thể là hữu hạn hoặc vô hạn, cần xác định kiểu dữ liệu phù hợp với giải thuật.
Trang 281.2.5 S ự thực thi dữ liệu.
Sự thực thi của cấu trúc dữ liệu là ánh xạ cấu trúc dữ liệu
d vào cấu trúc dữ liệu đã có trước đó
Ví dụ: số nguyên được biểu diễn bởi chuỗi bít
Ví dụ: kiểu boolean được định nghĩa bởi số 0 hoặc 1
Ví dụ: mảng được định nghĩa các ô nhớ liên tục trong bộ
nhớ…
Trang 291.3 Bi ểu diễn thuật toán
Có nhiều cách khác nhau để biểu diễn một giải thuật, thông thường, có 3 cách:
1.3.1 Biểu diễn bằng cách liệt kê các bước;
1.3.2 Biểu diễn bằng sơ đồ khối;
1.3.3 Biểu diễn bằng giả mã lệnh
Trang 301.3.1 Bi ểu diễn giải thuật bằng liệt kê các bước
Liệt kê ra các bước cần phải thực hiện bằng ngôn ngữ tự nhiên
VD 1: Thuật toán tìm số lớn nhất trong 3 số a,b,c
Giả thiết số lớn nhất là a: Max=a
Nếu Max<b thì Max=b
Nếu Max<c thì Max=c
Ghi giá trị của Max
Trang 311.3.2 Bi ểu diễn giải thuật bằng sơ đồ khối
Sơ đồ khối là một ngôn ngữ dùng để biểu diễn thuật toán
Hai loại nút giới hạn Bắt đầu và Kết thúc thường có hình
dạng elip:
Trang 321.3.2 Bi ểu diễn giải thuật bằng sơ đồ khối (tiếp)
Kh ối nhập/xuất có dạng hình chữ nhật bị cắt vát
Nút ch ỉ các thao tác, công việc có dạng hình chữ nhật:
Nút ch ỉ các điều kiện có dạng hình thoi Trong các đường nối với nút điều kiện này có hai đường đi ra ứng với hai trường hợp điều kiện đúng
ho ặc điều kiện sai.
Kh ối hình bình hành để in các giá trị.
Các đường nối các nút với nhau
Trang 331.3.2 Ví d ụ về sơ đồ khối
Trang 341.3.3 Bi ểu diễn giải thuật bằng giả mã lệnh
Trong các trường hợp biểu diễn bằng sơ đồ khối quá phức tạp, hay quá dài, có th ể sử dụng giả mã lệnh để biểu diễn giải thuật.
M ột số cú pháp cơ bản trong giả mã lệnh:
tr ợ cho việc theo dõi được thuận tiện cũng có thể thêm số thứ tự
If (điều kiện) Then (công việc);
If (điều kiện) Then (công việc 1) Else (công việc 2);
Trang 351.3.3 Bi ểu diễn giải thuật bằng giả mã lệnh (tiếp)
For (bi ến):= (giá trị đầu) to (giá trị cuối) do (công việc);
For (bi ến):= (giá trị đầu) downto (giá trị cuối) do (công việc);
While (điều kiện) do (công việc);
VD: Thu ật toán tìm số lớn nhất trong 3 số a,b,c
Max:=a;
If Max<b then Max:=b;
If Max<c then Max:=c;
println(‘Max=’, max);
Trang 361.3.3 Ví d ụ về giả mã lệnh cho thuật toán HEURISTIC
void GREEDY ( GRAPH *G, SET *Newclr )
{
/*3*/ if (v không được nối với một đỉnh nào trong Newclr)
{
/*4*/ đánh dấu v đã được tô màu;
/*5*/ thêm v vào Newclr;
}
}
Trang 371.4 Độ phức tạp của thuật toán
Khi đề xuất một thuật toán ngoài việc quan tâm đến tính đúng đắn của thuật toán, người ta còn phải quan tâm đến một số
vấn đề:
phụ thuộc vào dữ liệu đầu vào như thế nào,…
Trước khi nghiên cứu độ phức tạp thuật toán, ta xem xét một
số khái niệm về cách xác định độ phức tạp cho thuật toán
Trang 381.4 Độ phức tạp của thuật toán (tiếp)
M ột số khái niệm:
Khái ni ệm về độ tăng của hàm: Một trong các khái niệm
thường được dùng để phân tích độ tăng của hàm là khái
niệm O (ô lớn) được định nghĩa như sau:
Cho f(x) và g(x), ta nói f(x) là O(g(x)) n ếu tồn tại một hằng số C và k sao cho
|f(x)|<=C|g(x)| v ới mọi x>k;
Độ tăng của tổ hợp các hàm:
Xét f1(x) là O(g1(x) và f2(x) là O(g2(x)), CMR: (f1(x)+f2(x)) là
Trang 391.4 Độ phức tạp của thuật toán (tiếp)
Độ phức tạp của thuật toán
Các thuật ngữ O(1)-độ phức tạp hằng số; O(n) độ phức tạp tuyến tính; O(nb) – độ phức tạp hàm mũ
Độ phức tạp tính toán sẽ được tính theo số lần thực hiện các phép toán sơ cấp:cộng, trừ, nhân, chia, phép gán,
VD: Xét đoạn chương trình sau:
For (int i=1; i<n;i++)
{
…{có phép tính sơ cấp; ko có vòng lặp ở đây nữa}
}
=> s ố lần lặp sẽ là n=> O(n)
Trang 40Tóm t ắt chương 1