Slide 1 Cấu trúc dữ liệu và giải thuật SỐ TIẾT 60 (45 LÝ THUYẾT + 15 BÀI TẬP) 1 Sách, giáo trình chính Cấu trúc dữ liệu và giải thuật Đỗ Xuân Lôi NXB Khoa học kỹ thuật Bài giảng Cấu trúc dữ liệu v[.]
Trang 1Cấu trúc dữ liệu và giải thuật
SỐ TIẾT: 60 (45 LÝ THUYẾT + 15 BÀI TẬP)
1 Sách, giáo trình chính:
- Cấu trúc dữ liệu và giải thuật - Đỗ Xuân Lôi - NXB Khoa học kỹ thuật
- Bài giảng Cấu trúc dữ liệu và giải thuật - Đỗ Thị Mơ
2 Sách tham khảo:
a - Cấu trúc dữ liệu + giải thuật = chương trình - Niklaus Wirth
b - Thuật toán - Đỗ Xuân Huy
c - Cấu trúc dữ liệu và giải thuật - Trung tâm Tin học Ngoại ngữ Trí Đức - Nhà xuất bản Thống kê 2003
d - Data Structures and Algorithms - Alfred V Aho, John E Hopcroft, Jeffrey D Ullman - Addison Wesley Publishing Company
Trang 23 Thiết kế và phân tích giải thuật
3.1 Thiết kế giải thuật
3.1.1 Mô hình hoá việc giải quyết bài toán
- Khi thiết kế giải thuật ta sử dụng phương pháp mô đun hoá
Trang 3Với phương pháp mô đun hoá bài toán thì lời giải của bài toán được tổ chức theo cấu trúc cây
(phân cấp) có dạng như sau:
F
A
D C
B
I H
Trang 4- Cách thiết kế Top - Down hay thiết kế
từ khái quát đến đến chi tiết thể hiện như sau:
xuất phát từ dữ liệu và mục tiêu đề ra,
đề cập đến vấn đề chủ yếu, rồi sau đó
cụ thể một cách chi tiết hơn.
Trang 5Ví dụ: Xây dựng phần mềm quản lý lương cán bộ trong một
cơ quan
- Xuất phát từ phân tích tổng quát trên thuật giải xử
lý phải giải quyết được 3 vấn đề sau:
1 Đọc tệp: Đọc thông tin từ đĩa từ vào bộ nhớ
2 Xử lý tệp: Xử lý các thông tin để đưa ra kết quả mong muốn
3 Ghi tệp: Lưu trữ thông tin mới nhất vào tệp Thiết kế theo sơ đồ sau:
QUẢN LÍ LƯƠNG
GHI TỆP
XỬ LÝ TỆP ĐỌC TỆP
Trang 6- Nhiệm vụ “ XỬ LÝ TÊP” được phân chia ra thành 3 nhiệm vụ con:
1 Tìm kiếm bản ghi
2 Cập nhật bản ghi
3 In bản lương
Những nhiệm vụ con lại được chia ra thành các
nhiệm vụ nhỏ hơn theo sơ đồ sau:
XỬ LÝ TỆP
IN BẢNG LƯƠNG CẬP NHẬT BẢN GHI
TÌM BẢN GHI
THÊM XOÁ
SỬA TÌM THEO
TÊN
TÌM THEO
MÃ
LƯƠNG NĂM LƯƠNG
THÁNG
Trang 7* Ưu điểm của cách thiết kế Top - Down :
- Giải quyết bài toán có định hướng, tránh
sa đà vào chi tiết phụ.
- Làm nền tảng cho lập trình có cấu trúc.
- Bài toán do nhiều người cùng làm, tách bài toán thành nhiều bài toán con tạo cho các nhóm làm việc độc lập không ảnh
hưởng đến nhóm khác.
- Chương trình dễ dàng trong chỉnh lý và sửa chữa.
Trang 83.1.2 Phương pháp tinh chỉnh từng bước
- Phương pháp tinh chỉnh tưng bước thể hiện như sau:
Thoạt đầu chương trình thể hiện giải thuật
phản ánh ý chính của công việc cần làm
gọi là các bước tinh chỉnh Càng ở các
lệnh của chương trình.
Trang 9- Quá trình thiết kế giải thuật diễn ra như
Trang 10Ví dụ 1: Lập trình sắp xếp một dãy n số nguyên khác nhau theo thứ tự
tăng dần.
* Có thể phác thảo giải thuật theo ngôn ngữ tự nhiên như sau:
- Từ dãy các số nguyên chưa được sắp xếp chọn ra số nhỏ nhất, đổi chỗ
cho số đầu dãy.
- Cứ lặp lại quá trình đó cho đến khi dãy chưa được sắp trở thành rỗng.
* Dùng ngôn ngữ giả Pascal :
1 Bước tinh chỉnh đầu tiên là:
For i:=1 To n-1 Do Begin
- Xét từ ai đến an để tìm số nhỏ nhất aj
- Đổi chỗ giữa ai và aj End
2 Bước tinh chỉnh 2.1.: Tìm số nhỏ nhất
j:=i For k:= j+1 To n Do
If ak < aj Then j:=k
3 Bước tinh chỉnh 2.2: Đổi chỗ
x:=ai ; ai:=aj ; aj=x;
Trang 11* Sau khi chỉnh lại ta có thủ tục sắp xếp như sau :
If a[k] < a[j] Then j :=k
Trang 123.2 Phân tích giải thuật
3.2.1 Đạt vấn đề
* Khi xây dựng giải thuật và chương trình tương ứng có các nhu cầu sau:
chương trình trên bộ dữ liệu, so sánh kết quả với kết quả đã biết.
Các công cụ toán học chứng minh
tính đúng đắn của giải thuật.
Trang 13- Tính đơn giản : Dễ hiểu, dễ lập trình,
dễ chỉnh lý.
hiện giải thuật là tiêu chuẩn đánh giá hiệu lực của giải thuật.
3.2.2 Phân tích thời gian thực hiện giải thuật
* Với một bài toán có nhiều giải thuật chọn giải thuật dẫn đến kết quả nhanh nhất là vấn đề đòi hỏi của thực tế.
Trang 14* Thời gian thực hiện T phụ thuộc vào các yếu
tố:
kích thước của dữ liệu vào, thì thời gian
ngôn ngữ viết chương trình, chương trình
hiện Nhưng những yếu tố này không đồng
thể đưa chúng vào xác lập T(n).
giải thuật.
Trang 153.2.3 Độ phức tạp tính toán của giải thuật
* Nếu thời gian thực hiện một giải thuật là
độ phức tạp tính toán của giải thuật này có cấp n2, và được kí hiệu là:
T(n)= O(n2)
* Tổng quát: Hàm f(n) có độ phức tạp tính toán cấp g(n) nếu hàm f(n) bị chặn bởi
C g(n) , với C là hằng số
Kí hiệu là f(n) = O(g(n))
Trang 16Ví dụ 1: f(n) = O(n 3 ) có nghĩa độ phức tạp tính toán cấp n3
Ví dụ 2: f(n) = O(2 n ) có nghĩa độ phức tạp tính toán cấp 2 n
* Các hàm thể hiện độ phức tập tính toán của giải thuật có các dạng sau:
n n , n!, 2 n , n 3 , n 2 , nlog 2n , n, log 2n Các hàm đó đã được sắp theo thứ tự ưu tiên giá trị
giảm dần, có nghĩa là với giá trị của n hàm n n là lớn nhất, log 2n là nhỏ nhất Các hàm này có dạng đồ thị như sau:
Trang 183.2.4 Xác định độ phức tạp tính toán
a) Quy tắc cộng
Giả sử T1(n) và T2(n) là thời gian thực hiện 2 đoạn chương trình P1 và P2 mà
T1(n)= O(f(n)) T2(n)=O(g(n)), thì thời gian
thực hiện P1 rồi đến P2 tiếp theo sẽ là:
T1(n) + T2(n) = O(max(f(n),g(n)))
độ phức tạp tính toán lần lượt là
O(n3), O(n), O(nlog2n).
Vậy thời gian thực hiện 3 bước là:
T1(n) + T2(n) + T3(n)=O ( max(n3, n, nlog2n) = O(n3)
Trang 20Ví dụ 2 : Câu lệnh x+1 có thời gian thực
Trang 21c) Qui tắc 3: Bỏ hằng số
số.
Ví dụ 5 : O(n2/ 3) = O(n2)
• Chú ý 1 : Khi đánh giá thời gian thực hiện
phép toán tích cực
• Phép toán tích cực là phép toán mà thời
thực hiện các phép toán khác.
Trang 22Ví dụ 6 : e x = 1+ x/1! + x 2 /2! + + x n /n! với x và n cho trước.
Trong giải thuật 1 phép toán tích cực ở đây là p:=p*x/j Ta thấy nó
được thực hiện với số lần là: 1+2+3+ + n = n(n+1)/2
Vậy thời gian thực hiện giải thuật là: T(n) = O(n 2 )
Trang 23* Chú ý 2: có những trường hợp thời gian
thực hiện giải thuật không chỉ phụ thuộc vào kích thước của dữ liệu vào mà còn
Ta có T(n) trong trường hợp thuận lợi nhất T(n) trong trường hợp trung bình
T(n) trong trường hợp xấu nhất.
Nếu T(n) trong trường hợp trung bình khó
tính người ta đánh giá giải thuật bằng
T(n) trong trường hợp xấu nhất.
Trang 24Ví dụ 7 : Thuật toán tìm kiếm
Cho véc tơ a có n phần tử a1, a2, , an
Tìm trong a phần tử đầu tiên có giá trị = x cho trước.
Giải thuật như sau:
Found := False; i:=1;
While (i<=n) and Not Found Do
If a[i] =x then Begin
Found:=True; k:=i; Write(k); end else i:=i+1;
End.
Đánh giá độ phức tạp tính toán của giải thuật:
T(n) trong trường hợp tốt T(n)=O(1)
T(n) trong trường hợp xấu T(n)=O(n)
Vậy suy ra T(n)=O(n)
Trang 25Bài tâp:
1 Cho dãy số a có n phần tử a1, a2, , an
Hãy viết giải thuật sắp xếp dãy số trên theo thứ tự tăng dần bằng phương pháp chọn trực tiếp, đánh giá độ phức tạp tính toán của giải thuật
2 Cho dãy số a có n phần tử a1, a2, , an
Hãy viết giải thuật tìm trong a phần tử đầu tiên có giá trị > x cho trước, đánh giá độ phức tạp tính toán của giải thuật
Trang 26Chương 4: Danh sách móc nối ( danh sách liên kết: Linked list )
Việc sử dụng con trỏ hoặc mối nối để tổ chức danh sách tuyến tính ta gọi là danh sách móc nối
1 Danh sách nối đơn (Singly linked list)
1.1 Quy tắc tổ chức danh sách nối đơn
* Mỗi phần tử của danh sách được lưu trữ trong một phần tử nhớ mà ta gọi là nút(node) Mỗi nút bao gồm một số từ máy kế tiếp Một nút có thể nằm ở bất kỳ chỗ nào trong bộ nhớ Trong mỗi nút ngoài thông tin ứng với phần tử, còn có chứa địa chỉ của phần tử đứng sau nó trong danh sách
* Quy cách của mỗi nút :
- Trường INFOR chứa thông tin của phần tử
- Trường LINK chứa địa chỉ nút tiếp theo ( địa chỉ móc nối)
* Riêng nút cuối cùng không có nút đứng sau nên không có địa chỉ như các nút khác, ta gọi là mối nối không và kí hiệu là NULL
Trang 27* Để truy nhập vàp mọi nút trong danh sách thì phải truy nhập được vào nút đầu tiên, do đó cần phải có con trỏ L trỏ tới nút đầu tiên
L
* Nếu danh sách rỗng thì qui ước L = NULL
* Để tổ chức một danh sách móc nối thì khả năng sau đây càn phải có:
1 Tồn tại phương tiện chia bộ nhớ ra thành các nútvà ở mỗi nút có thể truy nhập vào từng trường
2 Tồn tại cơ chế để xác định được một nút đang được sử dụng (bận) hoặc
: Kí hiệu mối nối không
Trang 281.2 Một số phép toán với danh sách nối đơn
* Ta kí hiệu với một nút có địa chỉ là p ( được trỏ bởi p) thì INFOR(p) chỉ trường INFOR của nút ấy, LINK(p) chỉ trường LINK của nút ấy
Trang 29a Bổ sung một nút mới vào danh sách móc nối
Cho con trỏ Love trỏ tới nút đầu cuẩ danh sách móc nối, M là con trỏ trỏ tới một nút đang có trong danh sách
Thủ tục bổ sung vào sau nút trỏ bởi M một nút mới mà trường INFOR của nó
có giá trị lấy từ ô có địa chỉ là X Thủ tục gồm các bước sau :
Trang 30b Thủ tục loại một nút ra khỏi danh sách
Cho danh sách móc nối đơn trỏ bởi Love, loại một nút trỏ bởi M ra khỏi danh sách đó
Procedure DELETE(L,M)
1 { Trường hựp danh sách rỗng}
If L=NULL then begin
Write(‘ danh sách rỗng ‘) Return
Trang 31Câu hỏi thảo luận và bài tâp
1 Thế nào là cấu trúc ngăn xếp Cho ví dụ
2 Thế nào là Cấu trúc hàng đợi Cho ví dụ
3 Thế nào là danh sách móc nối Ưu điểm của danh sách móc nối
4 Trình bày qui ước biểu diễn danh sách móc nối đơn
5 Xét danh sách thuê bao điện thoại Mỗi thuê bao coi như một bản ghi có 3 trường: HT (họ tên), DC (địa chỉ ), SDT (số điện thoại)
a Viết các thủ tục: Tạo danh sách kiểu cấu trúc ngăn xếp, thực hiện các phép bổ sung và loại bỏ phần tử
b Viết các thủ tục: Tạo danh sách kiểu cấu trúc hàng đợi, thực hiện các phép bổ sung và loại bỏ phần tử
Trang 323 Danh sách nối kép (Double linked list)
LPTR : Con trỏ trỏ tới nút đứng trước
RPTR : Con trỏ trỏ tới nút đứng sau
INFOR : Trường thông tin
R
L
* LPTR của nút cực trái và RPTR của nút cực phải là NULL
* Để truy nhập vào danh sách cả 2 chiều ta phải dùng 2 con trỏ: Con trỏ L trỏ vào nút cực trái, con trỏ R trỏ vào nút cực phải
* Khi danh sách rỗng thì L=R=NULL
Trang 333.2 Các phép toan trên danh sách nối kép
a Chèn một nút vào danh sách nối kép
Trang 343 { M trỏ tới nút cực trái }
If M=L then begin
LPTR(new):= NULL RPTR(new):= M
LPTR(M):= new L:=new
Return end
Trang 354 { Bổ sung vào giữa trước M } LPTR(new):=LPTR(M)
RPTR(new):=M
LPTR(M):=new
RPTR(LPTR(new)):=new
Return
Trang 36b Loại bỏ một nút ra khỏi danh sách nối kép
Trang 371 { Trường hợp danh sách rỗng }
If R=NULL then begin
Write(‘ danh sach rong ‘) Return
Trang 38M=L: Begin { Nút cực trái bị loại } L:=RPTR(L)
Trang 39Câu hỏi thảo luận và bài tập
1 Thế nào là danh sách nối vòng Nêu ưu nhược điểm của nó.
2 Để khắc phục hạn chế của danh sách nối vòng người ta làm thế nào.
3 Thế nào là danh sách nối kép? Qui ước biểu diễn một nút của danh sách nối kép.
4 Nêu ưu nhược điểm của danh sách nối kép.
5 Cài đặt Stack bằng danh sach nối đơn như thế nào Cần chú ý gì khi thực hiện các phép bổ sung, loại bỏ phần tử.
6 Cài đặt Queue bằng danh sach nối đơn như thế nào Cần chú ý gì khi thực hiện các phép bổ sung, loại bỏ phần tử.
7 Xét danh sách điểm học sinh Mỗi học sinh coi như một bản ghi có 3 trường:
HT (họ tên), SBD (số báo danh), DIEM (điểm)
a Viết các thủ tục: Tạo danh sách nối kép, thực hiện các phép bổ sung và loại
bỏ phần tử.
b Viết các thủ tục: Tạo danh sách nối vòng, thực hiện các phép bổ sung và loại
bỏ phần tử.
Trang 40Ví dụ 1: Một mạng gồm các máy tính và các kênh điện thoại nối các máy tính này là một đồ thị
Ví dụ 2: Một mạng gồm các thành phố, thị xã và các
đường bộ nối các thành phố, thị xã là một đồ thị.
1.2 Định nghĩa đồ thị vô hướng
Đồ thị vô hướng G=(V,E) bao gồm V là tập các đỉnh và
E là tập các cặp đỉnh không có thứ tự gọi là các cung.
Trang 42* Nếu (v1, v2) là một cung trong tập E(G) thì v1 và v2 gọi là lân
cận của nhau
Ví dụ trên 1,2 là lân cân, 1,3 là lân cận
* Một đường đi từ đỉnh u đến đỉnh v trong đồ thị là một dãy các
đỉnh
u=x0, x1, , xn-1, xn=v mà dãy các cạnh (x0, x1), (x1, x2), ,
(xn-1, xn) là các cung thuộc E(G)
* Số lượng cung trên đường đi gọi là độ dài của đường đi
Ví dụ đường đi từ 1 đến 4 có độ dài là 2
* Đường đi đơn: Là đường đi mà mọi đỉnh trên đó, trừ đỉnh đầu và đỉnh cuối đều khác nhau
* Một chu trình là một đường đi đơn mà đỉnh đầu và đỉnh cuối
trùng nhau
Ví dụ: 1→ 3 → 5→ 4→1
Trang 43* Trong đồ thị G hai đỉnh u và v gọi là liên thông nếu có một đường đi từ u đến
v
Ví dụ: 1, 4 là liên thông 1, 5 là liên thông
* Đồ thị G gọi là liên thông nếu với mọi cặp đỉnh phân biệt vi, vj trong V(G) đều
có một đường đi từ vi với vj
Ví dụ: Đồ thị sau là đồ thị vô hướng liên thông
1
2 3
4 5
Trang 44Ví dụ: Đồ thị sau là đồ thị vô hướng không liên thông
Trang 45Ví dụ: Đồ thị sau là đồ thị có hướng không liên thông
Trang 46* Đồ thị vô hướng G=(V,E), bậc của đỉnh v là số cung liền thuộc với đỉnh đó
2.1 Biểu diễn bằng ma trận lân cận ( ma trận kề )
Xét đồ thị G(V,E), V gồm n đỉnh (n>=1), giả sử các đỉnh được đánh số thứ tự theo một quy định nào đó Ma trận lân cận A biểu diễn G là một ma trận vuông kích thước nxn Các phần tử của ma trận có giá trị 0 hoặc 1
Ai j = 1 khi tồn tại cung (vi, vj ) trong E
Ai j = 0 khi không tồn tại cung (vi, vj ) trong E
* Nếu đồ thị vô hướng thì ma trận A đối xứng qua đường chéo chính
Trang 47Ví dụ 1: Đồ thị vô hương sau
Trang 49* Với đồ thị có trọng số ma trận lân cận thay giá trị 1 bằng trọng số tương ứng của cung đó
2.2 Biểu diễn bằng danh sách lân cận ( danh sách kề )
Trong cách biểu diễn này n hàng của ma trận thay bằng n danh sách móc nối Mỗi đỉnh của G có một danh sách tương ứng Các nút trong danh sách i biểu diễn các đỉnh lân cận của nút i
Mỗi nút trong danh sách có chứa 2 trường :
VERTEX: Là thông tin của đỉnh lân cận đỉnh i
LINK : Là địa chỉ nút tiếp theo
VERTEX LINK
Trang 50Ví dụ 1 ở trên được biểu diễn bằng danh sách lân cận kề sau:
Trang 51Ví dụ 2 ở trên được biểu diễn bằng danh sách lân cận kề sau:
Trang 523 Phép duyệt đồ thị
* Xét đồ thị vô hướng G(V,E) và một đỉnh vV Ta cần thăm tất cả các đỉnh của G mà có thể “ với tới” từ đỉnh v ( nghĩa là đồ thị liên thông).
Có 2 cách duyệt đồ thị:
- Phép tìm kiếm theo chiều sâu ( Depth first search )
- Phép tìm kiếm theo chiều rộng (Breadth first search )
3.1 Phép tìm kiếm theo chiều sâu ( Depth first search )
Xét đồ thị vô hướng Phép tìm kiếm theo chiều sâu thể hiện như sau:
- Đỉnh xuất phát v được thăm.
- Tiếp theo đó ta thăm đỉnh w là đỉnh chưa được thăm và là lân cận của
v Phép tìm kiếm theo chiều sâu xuất phát từ w lại được thực hiện Trong trường hợp đỉnh u đã được thăm mà mọi đỉnh lân cận của nó đã
được thăm rồi thì ta quay lại đỉnh cuối cùng vừa được thăm ( mà đỉnh này còn đỉnh w là lân cận của nó chưa được thăm) và phép tìm kiếm theo chiều sâu xuất phát từ w lại được thực hiện.
Trang 53Ví dụ 1: Cho đồ thị vô hướng sau:
*
+
x
/ +
*
+
x
/ +
Trang 54Phép duyệt theo chiều sâu đi theo trình tự sau:
v1 v2 v4 v8 v5 v8 v6 v3 v7
* Thủ tục phép duyệt theo chiều sâu như sau:
Cho một đồ thị G(V,E) vô hướng có n đỉnh và véc tơ Visited(n) gồm n phần
tử, ban đầu véc tơ này có giá trị =0 Thuật giải này thực hiện thăm mọi đỉnh
“ với tới được “ từ đỉnh v.
Procedure DFS(v)
1 Visited(v):=1 { đánh dấu v được thăm }
2 FOR mỗi đỉnh w lân cận với v DO
If Visited(w)=0 then CALL DFS(w);
3 Return
* Đánh giá thuật toán:
+ Trường hợp biểu diễn đồ thị dùng danh sách móc nối: G có e cung, mỗi nút với tới 1 lần, nên thời gian tìm kiếm là O(e).
+ Trường hợp biểu diễn đồ thị dùng ma trận lân cận : thì thời gian xác định mọi điểm lân cận của v là O(n) Có n đỉnh nên thời gian tìm kiếm là O(n 2 ).