Transcript Document

Bài giảng môn:
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
Giảng viên: Võ Thị Hải Yến
4/13/2015
1
Nội dung chương trình
CH¦¥NG 1: TỔNG QUAN VỀ CẤU TRÚC
DỮ LIỆU VÀ GIẢI THUẬT
4/13/2015
I. Vai trò của cấu trúc dữ liệu và giải thuật
II. Tiêu chuẩn đánh giá cấu trúc dữ liệu
III. Các phép toán trong hệ kiểu Pascal
IV. Các kiểu dữ liệu
V. Các câu lệnh
VI. Giải thuật
VII. Đánh giá độ phức tạp của giải thuật
VIII. Bài tập
2
Nội dung chương trình
CHƯƠNG 2: DANH SÁCH (LIST)
I.
II.
III.
IV.
4/13/2015
Định nghĩa danh sách
Đặc tả các phương thức cho danh sách
Hiện thực danh sách.
Ứng dụng của danh sách
3
Nội dung chương trình
CHƯƠNG 3: NGĂN XẾP (STACK)
I.
II.
III.
IV.
4/13/2015
Định nghĩa ngăn xếp
Đặc tả ngăn xếp
Các phương án hiện thực ngăn xếp
Ứng dụng ngăn xếp
4
Nội dung chương trình
CHƯƠNG 4: HÀNG ĐỢI (QUEUE)
I.
II.
III.
IV.
4/13/2015
Định nghĩa hàng đợi
Đặc tả hàng đợi
Các phương án hiện thực hàng đợi
Ứng dụng hàng đợi
5
Nội dung chương trình
CHƯƠNG 5: GIẢI THUẬT ĐỆ QUY
I.
II.
III.
IV.
4/13/2015
Khái niệm về đệ quy
Giải thuật đệ quy và thủ tục đệ quy
Thiết kế giải thuật đệ quy
Hiệu lực của đệ quy
6
Nội dung chương trình
CH¦¥NG 6: SẮP XẾP
I. Bài toán sắp xếp
II. Các giải thuật sắp xếp nội
1. Chọn trực tiếp (Selection_sort)
2. Chèn trực tiếp (Insertion_sort)
3. Đổi chỗ trực tiếp (Interchange_sort)
4. Nổi bọt (Buble_sort)
5. Sắp xếp dựa trên phân hoạch (Quick_sort)
6. Sắp xếp trộn (Merge_sort )
7. Sắp xếp cây (Heap_sort)
4/13/2015
7
Nội dung chương trình
CH¦¥NG 7: TÌM KIẾM
I. Bài toán tìm kiếm
II. Các giải thuật tìm kiếm nội
1. Tìm kiếm tuyến tính
2. Tìm kiếm nhị phân
4/13/2015
8
Nội dung chương trình
CH¦¥NG 8: CẤU TRÚC CÂY
I. Khái niệm về cây
II. Cây nhị phân
1. Một số tính chất của cây nhị phân
2. Biểu diễn cây nhị phân
3. Duyệt cây nhị phân
III. Cây nhị phân tìm kiếm
1. Tìm một phần tử
2. Thêm một phần tử
3. Huỷ một phần tử
4/13/2015
9
Nội dung chương trình
Phần II: Bài tập + Thực hành
Cài đặt các thuật toán trong phần lý thuyết đã học.
4/13/2015
10
Tài liệu tham khảo
1. Trần Hạnh Nhi-Dương Anh Đức, Giáo trình cấu trúc dữ liệu và
giải thuật ĐH Quốc gia Tp Hồ Chí Minh.
2. Đỗ Xuân Lôi, Cấu trúc dữ liệu và giải thuật, NXB Khoa học kỹ
thuật, 1996.
3. Robert Sedgewick, Cẩm nang thuật toán, tập 1, NXB Khoa học
kỹ thuật, 1994, bản dịch của nhóm tác giả ĐH TH Tp. HCM.
4. N. Wirth: Algorithms+Data structures=Programs (Prentice Hall,
1976)…
4/13/2015
11
Ch¬ng 1: Tổng quan về cấu trúc dữ liệu và giải thuật
I. Vai trò của cấu trúc dữ liệu và giải thuật
II. Tiêu chuẩn đánh giá cấu trúc dữ liệu
III. Các phép toán trong hệ kiểu Pascal
IV. Các kiểu dữ liệu
V. Các câu lệnh
VI. Giải thuật
VII. Đánh giá độ phức tạp của giải thuật
VIII. Bài tập
4/13/2015
12
I. Vai trò của cấu trúc dữ liệu và giải thuật
1. Khái niệm bài toán
Trong phạm vi tin học, ta có thể quan niệm bài toán là việc gì
mà ta muốn máy tính thực hiện.
Ví dụ: In dòng chữ ra màn hình, giải phương trình bậc 2,
quản lý cán bộ trong một cơ quan,…
2. Diễn đạt bài toán
Input: Thông tin đầu vào.
Output: Thông tin đầu ra.
Ví dụ
3. Kh¸i niªm cÊu tróc d÷ liÖu
Cấu trúc dữ liệu là tập các dữ liệu có quan hệ với nhau, được
tổ chức theo những phương thức nhất định.
4/13/2015
13
I. Vai trò của cấu trúc dữ liệu và giải thuật
4. Vai trß cña cÊu tróc d÷ liÖu vµ gi¶i thuËt
Mét bµi to¸n thùc tÕ bÊt kú ®Òu bao gåm c¸c ®èi tîng
d÷ liÖu vµ c¸c yªu cÇu xö lý trªn c¸c ®èi tîng ®ã.
4.1. Tæ chøc biÓu diÔn c¸c ®èi tîng thùc tÕ
Trong m« h×nh tin häc cña bµi to¸n, cÇn ph¶i tæ chøc,
x©y dùng c¸c cÊu tróc d÷ liÖu thÝch hîp nhÊt sao cho:
- Ph¶n ¸nh chÝnh x¸c c¸c d÷ liÖu thùc tÕ.
- Cã thÓ dÔ dµng dïng m¸y tÝnh ®Ó xö lý.
4.2. X©y dùng c¸c thao t¸c xö lý d÷ liÖu
Khi gi¶i quyÕt mét bµi to¸n trªn m¸y tÝnh, chóng ta
thêng cã khuynh híng chó träng ®Õn viÖc x©y dùng
gi¶i thuËt mµ quªn ®i tÇm quan träng cña viÖc tæ chøc
d÷ liÖu trong bµi to¸n.
- Gi¶i thuËt ph¶n ¸nh c¸c phÐp xö lý.
- §èi tîng xö lý cña gi¶i thuËt l¹i lµ d÷ liÖu. 14
4/13/2015
I. Vai trò của cấu trúc dữ liệu và giải thuật
5 . Khái niệm giải thuật
Giải thuật (thuật toán-Algorithm): là một dãy hữu hạn các
thao tác chặt chẽ và rõ ràng được sắp xếp theo một trình tự
xác định sao cho sau khi thực hiện dãy thao tác đó, ta nhận
được mục tiêu định trước.
4/13/2015
15
I. Vai trò của cấu trúc dữ liệu và giải thuật
6. Mối quan hệ giữa cấu trúc dữ liệu và giải thuật
• North Wirth say that:
Cấu trúc dữ liệu + Giải thuật = Chương trình
- Để xây dựng giải thuật phù hợp  phải xác định nó tác động
trên các kiểu dữ liệu nào.
Ví dụ: Làm nhuyễn các hạt đậu  xay chứ không băm
- Khi chọn lựa cấu trúc dữ liệu  cần phải hiểu rõ những thao tác
(giải thuật) sẽ tác động lên nó.
Ví dụ: Biểu diễn điểm của sinh viên  dùng số chứ không dùng
chữ
Ví dụ
- Cấu trúc dữ liệu thay đổi  giải thuật thay đổi theo
4/13/2015
16
II . Tiêu chuẩn đánh giá CTDL
1. CTDL phải tiết kiệm tài nguyên (bộ nhớ trong).
2. CTDL phải phản ánh đúng thực tế của bài toán.
3. CTDL phải dễ dàng trong việc thao tác dữ liệu.
4/13/2015
17
III. C¸c phÐp to¸n trong hÖ kiÓu Pascal
1. C¸c phÐp to¸n truy cËp
C¸c phÐp to¸n truy cËp dïng ®Ó truy nhËp ®Õn c¸c thµnh
phÇn cña mét ®èi tîng d÷ liÖu, ch¼ng h¹n truy nhËp ®Õn c¸c
thµnh phÇn cña mét m¶ng,®Õn c¸c trêng cña b¶n ghi.
VÝ dô:
- Gi¶ sö A lµ mét m¶ng víi tËp chØ sè i. Khi ®ã A[i] cho
phÐp ta truy cËp ®Õn thµnh phÇn thø i cña m¶ng.
- NÕu X lµ mét b¶n ghi th× viÖc truy cËp ®Õn trêng F cña nã
®îc thùc hiÖn bëi phÐp to¸n X.F.
4/13/2015
18
III. C¸c phÐp to¸n trong hÖ kiÓu Pascal
2. C¸c phÐp to¸n kÕt hîp d÷ liÖu
2.1. C¸c phÐp to¸n sè häc:
C¸c phÐp to¸n trªn tËp sè sè nguyªn: +, - * , /, div, mod.
Thø tù thùc hiÖn c¸c phÐp to¸n: C¸c biÓu thøc trong (…), tiÕp
theo lµ *, /, div, mod, sau cïng lµ +, -.
2.2. C¸c phÐp to¸n so s¸nh:
C¸c phÐp to¸n so s¸nh: =, <>, <, >, <=, >=;
KÕt qu¶ cña c¸c phÐp to¸n nµy lµ mét gi¸ trÞ cã kiÓu Boolean.
2.3. C¸c phÐp to¸n logic:
C¸c phÐp to¸n logic: and, or, not
§îc thùc hiÖn trªn hai gi¸ trÞ true vµ false cña kiÓu Boolean.
2.4. C¸c phÐp to¸n tËp hîp:
4/13/2015
C¸c phÐp to¸n tËp hîp: hîp, giao, hiÖu cña c¸c tËp hîp
Trong Pascal ®îc biÓu diÔn bëi: +, *, - t¬ng øng
ViÖc kiÓm tra mét ®èi tîng x cã lµ phÇn tö cña tËp A hay kh«ng
®îc thùc hiÖn bëi phÐp to¸n in (x in A).
KÕt qu¶ cña phÐp to¸n nµy lµ mét gi¸ trÞ cã kiÓu Boolean.
19
IV. Các kiểu dữ liệu
1. §Þnh nghÜa kiÓu d÷ liÖu
KiÓu d÷ liÖu T ®îc x¸c ®Þnh bëi bé <V,O> víi :
- V: tËp c¸c gi¸ trÞ hîp lÖ mµ ®èi tîng kiÓu T cã thÓ lu tr÷.
- O: tËp c¸c thao t¸c xö lý cã thÓ thi hµnh trªn ®èi tîng kiÓu T.
VÝ dô:
- KiÓu d÷ liÖu ký tù = <Vc, Oc> víi:
Vc = {a - z, A - Z}
Oc = {lÊy m· ASCII cña ký tù, biÕn ®æi ký tù thêng
thµnh ký tù hoa,m· ho¸ ký tù,...}
- KiÓu d÷ liÖu sè nguyªn = <Vi, Oi> víi:
Vi = {-32768 32767}
Oi = {+, -, *, /, %, c¸c phÐp so s¸nh}
Muèn sö dông mét kiÓu d÷ liÖu cÇn n¾m v÷ng c¶ néi dung d÷
liÖu ®îc phÐp lu tr÷ vµ c¸c xö lý t¸c ®éng trªn ®ã.
4/13/2015
20
IV. Các kiểu dữ liệu
2. C¸c thuéc tÝnh cña mét kiÓu d÷ liÖu
Mét kiÓu d÷ liÖu bao gåm c¸c thuéc tÝnh sau:
• Tªn kiÓu d÷ liÖu
• MiÒn gi¸ trÞ
• KÝch thíc lu tr÷
• TËp c¸c to¸n tö t¸c ®éng lªn kiÓu d÷ liÖu
4/13/2015
21
IV. Các kiểu dữ liệu
3. Các kiểu dữ liệu cơ bản
• KDL cơ sở
Rời rạc: Số nguyên, ký tự, logic, liệt kê, miền con
Liên tục: Số thực
Kiểu chuỗi (String)
Kiểu Mảng (Array)
• KDL cấu trúc
Kiểu bản ghi (Record)
Kiểu tập hợp (Union)
• KDL trừu tượng
Danh sách móc nối (List)
Cây (Tree)
Đồ thị (Graph)
Tập hợp (Union)
• Hai phương pháp lưu trữ
4/13/2015
Mảng (Array)
Con trỏ (Pointer)
22
IV. Các kiểu dữ liệu
4. Các kiểu dữ liệu
4.1. Kiểu số nguyên
- Kích thước V={1, 2, 4} byte
- Các phép toán thao tác với số nguyên
O = {+, -, *, /, div, mod, <, >, <=, >=, =,…}
4.2. Kiểu số thực
- Kích thước V={4, 6, 8, 10} byte
- Các phép toán thao tác với số thực
O ={+,-,*,/,<,>,<=,>=,=,…}
4/13/2015
23
IV. Các kiểu dữ liệu
4.3. Kiểu chuỗi (văn bản)
- V = Tuỳ thuộc vào ngôn ngữ lập trình
- O ={+, &,<,>,<=,>=,=, …}
4.4. Kiểu Logic
- V ={1} byte
- O ={<,>,<=,>=,=, and, or, not,…}
4/13/2015
24
IV. Các kiểu dữ liệu
4.5. KiÓu liªt kª
Gi¶ sö obj1, obj2,..., objn lµ c¸c ®èi tîng nµo ®ã.
Khi ®ã ta cã thÓ t¹o nªn kiÓu liÖt kª T b»ng c¸ch liÖt kª tÊt
c¶ c¸c ®èi tîng ®ã.
Type T = (obj1, obj2,…,objn)
VÝ dô:
Type mau = (xanh, do, tim, vang)
Var maukhan: mau;
4/13/2015
25
IV. Các kiểu dữ liệu
4.6. KiÓu ®o¹n con
Type T = min..max
Trong ®ã min vµ max lµ cËn díi vµ cËn trªn cña kho¶ng;
min vµ max lµ c¸c gi¸ trÞ thuéc cïng mét kiÓu: integer,
char hoÆc c¸c kiÓu liÖt kª, ®ång thêi min < max.
KiÓu T gåm tÊt c¶ c¸c gi¸ trÞ tõ min ®Õn max.
VÝ dô:
Var M: 10..50;
•
4/13/2015
26
II. Các kiểu dữ liệu
C¸c kiÓu d÷ liÖu cã cÊu tróc
4.7. KiÓu m¶ng (array)
KiÓu d÷ liÖu m¶ng lµ kiÓu d÷ liÖu trong ®ã mçi phÇn tö lµ tËp
cã thø tù c¸c gi¸ trÞ cã cïng cÊu tróc ®îc l tr÷ kÕ tiÕp nhau
trong bé nhí.
Gi¶ sö To lµ mét kiÓu ®· cho, To gäi lµ kiÓu thµnh phÇn m¶ng.
Gi¶ sö I lµ kiÓu ®o¹n con hoÆc kiÓu liÖt kª, I gäi lµ chØ sè m¶ng.
Khi ®ã ta cã thÓ t¹o nªn kiÓu m¶ng T víi c¸c thµnh phÇn cña
m¶ng lµ c¸c gi¸ trÞ thuéc To vµ ®îc chØ sè ho¸ bëi tËp h÷u
h¹n, cã thø tù I.
Type T = array[I] of To
4/13/2015
27
IV. Các kiểu dữ liệu
4.8. KiÓu b¶n ghi (record)
Gi¶ sö T1, T2,...,Tn lµ c¸c kiÓu d÷ liÖu ®· cho
F1, F2,...,
Fn lµ tªn c¸c trêng.
Tt 1
Khi ®ã ta cã thÓ thµnh lËp kiÓu b¶n ghi T víi n trêng,
trêng thø i cã tªn lµ Fi vµ c¸c gi¸ trÞ cña nã cã kiÓu Ti
víi i = 1, 2,..., n.
Type T = record
F1: T1;
F2: T2;
............
Fn: Tn;
end;
Mçi gi¸ trÞ cña kiÓu b¶n ghi T lµ mét bé n gi¸ trÞ (t1, t2,...tn),
trong ®ã ti  Ti (i = 1, 2, ..., n).
1i
4/13/2015
28
IV. Các kiểu dữ liệu
4.9. KiÓu con trá
Mét ph¬ng ph¸p quan träng ®Ó kiÕn t¹o c¸c cÊu tróc d÷ liÖu,
®ã lµ sö dông con trá. Trong ph¬ng ph¸p nµy mçi thµnh
phÇn lµ mét b¶n ghi gåm hai trêng INFOR vµ LINK, trêng
INFOR cã thÓ cã mét hay nhiÒu trêng d÷ liÖu, cßn trêng
LINK cã thÓ chøa mét hay nhiÒu con trá trá ®Õn c¸c thµnh
phÇn kh¸c cã quan hÖ víi thµnh phÇn ®ã. (kiÓu con trá sÏ
nghiªn cøu kü trong phÇn danh s¸ch liªn kÕt). Tõ kiÓu nµy ta
cã thÓ x©y dùng nªn cÊu tróc d÷ liÖu biÓu diÔn c©y, m« h×nh
d÷ liÖu quan träng bËc nhÊt.
Gi¶ sö T lµ mét kiÓu con trá ®· cho. Khi ®ã ta cã thÓ t¹o nªn
kiÓu con trá Tp.
•
4/13/2015
Type Tp = ^T §èi tîng
29
IV. Các kiểu dữ liệu
4.10. KiÓu tËp hîp (set)
Gi¶ sö To lµ mét kiÓu d÷ liÖu ®· cho.
To ph¶i lµ kiÓu cã thø tù ®Õm ®îc "®ñ nhá", ch¼ng h¹n kiÓu
®o¹n con (giíi h¹n phô thuéc vµo ch¬ng tr×nh dÞch).
Khi ®ã, ta cã thÓ x¸c ®Þnh kiÓu tËp T:
Type T = set of To
Mçi ®èi tîng cña kiÓu T sÏ lµ mét tËp con cña To.
4/13/2015
30
IV. Các kiểu dữ liệu
4.11. KiÓu tÖp (file)
Gi¶ sö To lµ mét kiÓu d÷ liÖu nµo ®ã (trõ kiÓu file).
Khi ®ã sÏ x¸c ®Þnh mét kiÓu tÖp víi c¸c phÇn tö lµ c¸c
®èi tîng thuéc kiÓu To.
Type T = File of To
4/13/2015
31
V. Các câu lệnh
1. Câu lệnh gán
•
Có dạng V:= E
• Với V chỉ tên biến, tên hàm; E chỉ biểu thức.
2. Câu lệnh ghép
•
Có dạng: Begin S1; S2; …, Sn End
• Cho phép ghép nhiều câu lệnh lại để được một câu lệnh.
4/13/2015
32
V. Các câu lệnh
3. Câu lệnh điều kiện
• Có dạng: If B Then S
• B là một biểu thức logic, S là một câu lệnh khác.
Hoặc
• Có dạng: If B Then S1 Else S2
• B là một biểu thức logic, S1, S2 là một câu lệnh khác.
Sơ đồ hoạt động
4/13/2015
33
V. Các câu lệnh
4. Câu lệnh lặp xác định
• Có dạng: for i:=m to n do S
• Thực hiện câu lệnh S với i lấy giá trị nguyên từ m
tới n (n>=m), với bước nhảy tăng bằng 1.
Hoặc
• Có dạng: for i:=n downto m do S
• Thực hiện tương tự như câu lệnh trên với bước nhảy
giảm bằng 1.
4/13/2015
34
V. Các câu lệnh
5. Câu lệnh lặp không xác định
• Có dạng: while B do S;
• Trong đó B là biểu thức logic; S là câu lệnh;
• Chừng nào B có giá trị True thì thực hiện S.
Hoặc
• Có dạng: repeat S until B;
Sơ đồ hoạt động
• Trong đó B là biểu thức logic; S là câu lệnh;
• Lặp lại S cho tới khi B có giá trị True.
4/13/2015
35
V. Các câu lệnh
6. Câu lệnh nhảy
• Có dạng: go to n
• n là số hiệu của một bước trong chương trình
• Thường hạn chế việc dùng Go to
7. Câu lệnh vào, ra
• Có dạng: read(<danh sách biến>)
write(<danh sách biến hoặc dòng ký tự>)
Các biến trong danh sách cách nhau bởi dấu phẩy.
Dòng tự là một dãy các ký tự đặt giữa hai dấu nháy ‘’.
4/13/2015
36
V. Các câu lệnh
8. Chương trình con
• Chương trình con hàm
function <Tên hàm> (danh sách tham số)
S1; S2; S3; …; Sn
return
• Chương trình con thủ tục
procedure <Tên thủ tục> (danh sách tham số)
S1; S2; S3; …; Sn
return
4/13/2015
37
VI. Giải thuật
1. Khái niệm giải thuật
Giải thuật (thuật toán-Algorithm): là một dãy hữu hạn các
thao tác chặt chẽ và rõ ràng được sắp xếp theo một trình tự
xác định sao cho sau khi thực hiện dãy thao tác đó, ta nhận
được mục tiêu định trước.
4/13/2015
38
VI. Giải thuật
2 . Các đặc trưng của giải thuật
2.1. Tính xác định
Ở mỗi bước của giải thuật các thao tác phải hết sức rõ
ràng, không gây sự mập mờ.
2.2. Tính hữu hạn dừng
Giải thuật bao giờ cũng phải dừng sau một số hữu hạn
bước.
2.3. Tính đúng đắn
Sau khi thực hiện tất cả các thao tác của giải thuật ta
phải được kết quả mong muốn.
4/13/2015
39
VI. Giải thuật
2 . Các đặc trưng của giải thuật
2.4. Tính phổ dụng
Giải thuật có thể giải bất kỳ bài toán nào trong cùng
một lớp các bài toán.
2.5. Tính có đại lượng vào, đại lượng ra
•
Khi bắt đầu giải thuật bao giờ cũng nhận các đại lượng
vào mà ta thường gọi là dữ liệu vào.
•
Sau khi kết thúc, một giải thuật bao giờ cũng cho một
số đại lượng ra chúng thường được gọi là dữ liệu ra.
4/13/2015
40
VI. Giải thuật
2. Các đặc trưng của giải thuật
2.6. Tính có hiệu quả
Tính có hiệu quả của giải thuật được đánh giá dựa trên các
tiêu chuẩn sau:
• Dung lượng bộ nhớ cần có
• Số các phép tính cần thực hiện
• Thời gian cần thiết để chạy
• Có dễ hiểu không
• Có dễ cài đặt trên máy không
4/13/2015
41
VI. Giải thuật
3. Ng«n ng÷ diÔn ®¹t gi¶i thuËt
3.1. Liệt kê từng bước (ngôn ngữ tự nhiên)
Liệt kê các bước thực hiện giải thuật theo thứ tự thực hiện
3.2. Sơ đồ khối
Ví dụ
• Khối
bắt đầu hoặc kết thúc
• Khối nhập dữ liệu
• Khối thao tác
• Khối điều kiện
• Chỉ hướng thực hiện của giải thuật
4/13/2015
42
VI. Giải thuật
3. Ng«n ng÷ diÔn ®¹t gi¶i thuËt
3.3. Dùng ngôn ngữ phỏng trình (tựa ngôn ngữ lập trình)
Sử dụng cú pháp của một ngôn ngữ lập trình + Ngôn ngữ tự nhiên để
diễn đạt giải thuật
Ví dụ
3.4. Dùng ngôn ngữ lập trình
- Dùng ngôn ngữ lập trình nào đó để viết giải thuật
- Hạn chế:
• Phụ thuộc vào ngữ nghĩa, cú phápnặng nề, gò bó
• Không được nhiều người dùng ưa thích và sử dụng
Ví dụ
Lưu ý: Trong quá trình học môn học này, chủ yếu dùng ngôn
ngữ phỏng trình tựa Pascal để diễn đạt giải thuật
4/13/2015
43
VII. Đánh giá độ phức tạp giải thuật
1. Tính hiệu quả của giải thuật
Để giải một bài toán có thể có nhiều giải thuật khác nhau. Cần
lựa chọn một giải thuật tốt theo hai tiêu chuẩn:
•
Đơn giản, dễ hiểu, dễ lâp trình.
•
Thời gian thực hiện nhanh, dùng ít tài nguyên máy tính.
Tiêu chuẩn 2 là tính hiệu quả của giải thuật. Đánh giá độ phức
tạp của giải thuật là đánh giá thời gian thực hiện giải thuật đó.
4/13/2015
44
VII. Đánh giá độ phức tạp giải thuật
2. Đánh giá thời gian thực hiện giải thuật
Thời gian thực hiện giải thuật phụ thuộc: Ngôn ngữ lập trình,
chương trình dịch, hệ điều hành, phần cứng của máy,…
Mặt khác phải lập trình mới đo được thời gian thực hiện giải thuật.
Cần có cách đánh giá khác sao cho:
•
Không phụ thuộc máy, ngôn ngữ lập trình, chương trình dịch.
•
Không cần triển khai chương trình thực hiện giải thuật.
•
Chỉ dựa vào phân tích bản thân giải thuật.
Tổng số phép toán sơ cấp cần thiết để thực hiện giải thuật là cách
làm đáp ứng được các yêu cầu trên.
4/13/2015
45
VII. Đánh giá độ phức tạp giải thuật
3. §é phøc t¹p vÒ thêi gian thùc hiÖn gi¶i thuËt
• Gäi n lµ kÝch thíc d÷ liÖu nhËp.
• T(n) lµ thêi gian thùc hiÖn gi¶i thuËt
•
Nếu thời gian thực hiện một giải thuật là: T(n) = c.n2
(với c là hằng số)
•
Ta nói: Độ phức tạp về thời gian của giải thuật này có cấp n2
•
Ký hiệu: T(n) = O(n2) (ký hiệu chữ O lớn)
4/13/2015
46
VII. Đánh giá độ phức tạp giải thuật
3. §é phøc t¹p vÒ thêi gian thùc hiÖn gi¶i thuËt
Định nghĩa:
Một hàm T(n) được xác định là O(g(n)):
T(n)=O(g(n))
và được gọi là có cấp g(n) nếu tồn tại các hàng số c và
n0 sao cho:
T(n)  c.g(n) khi n  n0
4/13/2015
47
VII. Đánh giá độ phức tạp giải thuật
4. C¸c ®¬n vÞ ®o tèc ®é
g(n) = c (h»ng sè)  T(n) = O(1)
g (n)  log 2 n  T (n)  O(log 2 n)
g ( n)  n  T  n   O  n 
g (n)  n.log 2 n  T (n)  O(n.log 2 n)
g ( n)  n 2  T ( n)  O ( n 2 )
g ( n)  n 3  T ( n)  O ( n 3 )
g (n)  2n  T (n)  O(2n )
4/13/2015
48
VII. Đánh giá độ phức tạp giải thuật
C¸c ®¬n vÞ ®o tèc ®é
• Phức tạp đa thức: O(1), O (log 2 n) , O(n), O ( n.log 2 n) ,
O(n2), O(n3)…
• Phức tạp hàm mũ: O(2n)…
• Phức tạp giai thừa: O(n!)
 O(1)  O(log 2 n)  O(n)  O(n.log 2 n)  O(n 2 )  O(n3 )  O(2n )
Mục tiêu thiết kế giải thuật: Đưa bài toán về độ phức tạp đa thức
•
4/13/2015
49
VII. Đánh giá độ phức tạp giải thuật
So sánh các độ phức tạp
4/13/2015
Đồ thị của một số hàm số
50
VII. Đánh giá độ phức tạp giải thuật
So sánh các độ phức tạp
Bảng giá trị của một số hàm số
log 2 n
n.log 2 n
n
0
1
2
3
4
5
4/13/2015
1
2
4
8
16
32
0
2
8
24
64
160
n2
1
4
16
64
256
1024
n3
1
8
64
512
4096
32768
2n
2
4
16
256
6536
2.147.483.648
51
VII. Đánh giá độ phức tạp giải thuật
5. X¸c ®Þnh ®é phøc t¹p vÒ thêi gian
•
Quy tắc tổng:
Giả sử T1(n) và T2(n) là thời gian thực hiện của 2 đoạn chương
trình P1 và P2 mà T1(n)=O(f(n)) và T2(n)=O(g(n))
Thời gian thực hiện P1 và P2 kế tiếp nhau là:
T1(n) + T2(n) = O(max{f(n), g(n)})
• Quy tắc nhân:
Thời gian thực hiện P1 và P2 lồng nhau là:
4/13/2015
T1(n) . T2(n) = O(f(n).g(n))
52
VII. Đánh giá độ phức tạp giải thuật
6. Độ phức tạp về thời gian của các cú pháp điều khiển
a. Câu lệnh gán, đọc, viết:
Có thời gian thực hiện =c (hằng số)  T(n) = O(1)
b. Câu lệnh ghép
• Begin S1; S2; …, Sn End;
• Thời gian thực hiện theo quy tắc cộng
c. Câu lệnh điều kiện
. If B then S1 Else S2;
• Thời gian thực hiện là O(Max(f1(n), f2(n))), theo quy tắc cộng
Trong đó: Thời gian thực hiện S1 là T1(n)=O(f1(n));
4/13/2015
S2 là T2(n)=O(f2(n));
53
VII. Đánh giá độ phức tạp giải thuật
d. Câu lệnh lặp While
• While B Do S;
• Nếu thời gian thực hiện S là T(n)=O(f(n)) và có g(n) lần
thực hiện S trong vòng lặp While (tối đa) thì thời gian thực
hiện vòng lặp là O(f(n).g(n)).
e. Câu lệnh lặp Repeat
• Repeat S Until B;
• Nếu thời gian thực hiện S là T(n)=O(f(n)) và số lần lặp tối
đa là g(n) thì thời gian thực hiện vòng lặp là O(f(n).g(n)).
4/13/2015
54
VII. Đánh giá độ phức tạp giải thuật
f. Câu lệnh lặp xác định
• for i:=m to n do S;
• Nếu thời gian thực hiện S là T(n)=O(f(n)) và có g(n)
lần lặp For
Thì thời gian thực hiện là O(f(n).g(n))
Ví dụ
4/13/2015
55
Bài tập
4/13/2015
56
Ví dụ: Chương trình quản lý điểm của sinh viên
Chương trình quản lý điểm của sinh viên, cần lưu điểm số của 3
sinh viên.
Do mỗi sinh viên có 4 điểm số ứng với 4 môn học  dữ liệu có
dạng bảng sau:
SV
SV 1
SV 2
SV 3
4/13/2015
Môn
1
Môn
2
Môn
3
Môn
4
5
6
5
6
5
5
7
8
9
0
8
7
57
Ví dụ: Chương trình quản lý điểm của sinh viên
•Phương án 1: Sử dụng mảng một chiểu 12 phần tử, nhóm 4 phần tử là điểm của
1 SV
5
6
7
0
6
SV1
5
8
8
5
SV2
5
9
7
SV3
Truy xuất điểm j của sinh viên i
Bảng (dòng i, cột j)=A[(i-1)*số cột+j]
•Phương án 2: Sử dụng mảng hai chiều 3X 4, phần tử A[i,j] là điểm thi môn j của
sinh viên i
5
6
7
0
A=
4/13/2015
6
5
8
8
5
5
9
7
58
Dùng liệt kê từng bước: Tìm UCLN của 2 số nguyên dương m và n
Bước 1: Nhập hai số nguyên dương.
Bước 2: Nếu m=n sang bước 4; ngược lại sang bước 3.
Bước 3: Nếu m>n thì đặt m=m-n về bước 2.
Nếu m<n thì đặt n=n-m về bước 2.
Bước 4: Trả lời UCLN=m, Kết thúc.
4/13/2015
59
Dùng sơ đồ khối: Tìm UCLN của 2 số nguyên dương m và n
Begin
m,n
Đúng
m=n
UCLN = m
Sai
Sai
n:=n-m
Đúng
m>n
m:=m-n
End
4/13/2015
60
Dùng ngôn ngữ phỏng trình
Tìm UCLN của 2 số nguyên dương m và n
Function UCLN (m,n)
Begin
-Nhập m, n nguyên dương
-While m<>n do
-If m>n then m:=m-n else n:=n-m
-UCLN:=m
End;
4/13/2015
61
Dùng ngôn ngữ lập trình:
Tìm UCLN của 2 số nguyên dương m và n
Program UCLN(m,n);
Var m,n:integer;
Begin
Write('nhap so thu nhat:');readln(m);
Write('nhap so thu hai:');readln(n);
While (m<>n) do
Begin
if (m>n) then
m:=m-n
else
n:=n-m;
end;
Writeln('uoc so chung lon nhat:',m);
Readln;
4/13/2015
End.
62
Ví dụ: Diễn đạt bài toán thành 2 thành phần
Diễn đạt bài toán giải phương trình bậc 2
•Input: Các hệ số a,b,c
•Output: Thông báo nghiệm x1, x2; nghiệm kép x; hoặc vô
nghiệm
Diễn đạt bài toán Tìm ước số chung lớn nhất
•Input: Hai số nguyên dương m, n
•Output: Uớc số chung lớn nhất của m, n
4/13/2015
63
Sơ đồ hoạt động của lệnh điều kiện
True
B
S
False
True
B
S1
False
S2
4/13/2015
64
Sơ đồ hoạt động của câu lệnh tuyển
False
False
B1
True
S1
4/13/2015
B2
True
S2
False
Bn
Sn+1
True
Sn
65
Sơ đồ hoạt động của lệnh lặp không biết trước
True
B
S
False
Hoặc
S
B
True
False
4/13/2015
66
Ví dụ: Xác định độ phức tạp cña bµi to¸n
• TÝnh (c¸ch 1):
2
3
n
x
x
x
x
ex  1  

 ... 
1! 2! 3!
n!
Program EXP1 ;
Begin
Read(x); s:=1;
For i:=1 to n do
Begin
p:=1;
•Tính từng số hạng rồi cộng lại
p:=p*x/j;
•Số lần thực hiện
1+2+…+n=n(n+1)/2
Số phép toán là:
T(n)=O(n2)
For j:=1 to i do
p:=p*x/j;
S:=s+p;
End;
4/13/2015
End.
67
VÝ dô: X¸c ®Þnh ®é phøc t¹p cña bµi to¸n
• TÝnh (c¸ch 2):
Progam EXP2;
2
3
n
x
x
x
x
ex  1  

 ... 
1! 2! 3!
n!
x2
x x
xn
x n 1 x
 . ; ...;

.
2! 1! 2
n ! ( n  1)! n
Begin
Read(x); s:=1;p:=1;
For i:=1 to n do
Begin
p:=p*x/i;
. Sè phÐp to¸n tÝch cùc:
p*x/i
. Sè lÇn thùc hiÖn: n lÇn
§é phøc t¹p lµ: O(n)
S:=s+p;
End;
End.
4/13/2015
68