Tải bản đầy đủ (.pdf) (128 trang)

BÀI GIẢNG TÓM TẮT CẤU TRÚC DỮ LIỆU VÀ THUẬT GIẢI 1 (Dành cho sinh viên ngành công nghệ thông tin)

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (1.04 MB, 128 trang )

TR ỜNG ĐẠI HỌC ĐÀ LẠT
KHOA CÔNG NGH THÔNG TIN

NGUYỄN THỊ THANH BÌNH
TRẦN TUẤN MINH

BÀI GIẢNG TĨM TẮT

CẤU TRÚC DỮ LI U VÀ THUẬT GIẢI 1
Dành cho sinh viên ngành công ngh thông tin
(L u hành nội bộ)

Đà Lạt 2008


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

M CL C
M CL C
L I NÓI Đ U

CH
NG 1:
GI I THI U C U TRÚC D

LI U VÀ PHÂN TÍCH THU T GI I......4

1.1
Từ bài tốn đến ch ng trình .................................................................................. 4
1.1.1
Mơ hình hóa bài tốn thực tế ........................................................................... 4


1.1.2
Thu t gi i (algorithms) .................................................................................... 7
1.2
Kiểu dữ li u trừu t ợng (Abstract Data Type - ADT) .......................................... 12
1.2.1
Khái ni m trừu t ợng hóa.............................................................................. 12
1.2.2
Trừu t ợng hóa ch ng trình......................................................................... 12
1.2.3
Trừu t ợng hóa dữ li u .................................................................................. 13
1.2.4
Kiểu dữ li u, c u trúc dữ li u và kiểu dữ li u trừu t ợng (Data Types, Data
Structures, Abstract Data Types).................................................................................. 14
1.3
PHÂN TÍCH THU T GI I.................................................................................. 15
1.3.1
Thu t gi i và các v n đề liên quan................................................................. 15
1.3.2
Tính hi u qu c a thu t gi i........................................................................... 16
1.3.3
Ký hi u O và biểu di n th i gian ch y b i ký hi u O ................................... 19
1.3.4
Đánh giá th i gian ch y c a thu t gi i .......................................................... 23

CH
NG 2:
TÌM KI M VÀ S P X P TRONG............................................................32
2.1
Các ph ng pháp tìm kiếm trong.......................................................................... 32
2.1.1

Ph ng pháp tìm kiếm tuyến tính.................................................................. 32
2.1.2
Tìm kiếm nhị phân......................................................................................... 34
2.2
Các ph ng pháp sắp xếp trong ............................................................................ 36
2.2.1
Thu t gi i sắp xếp chọn (Selection Sort)....................................................... 37
2.2.2
Thu t gi i sắp xếp chèn (Insertion Sort)........................................................ 40
2.2.3
Thu t gi i sắp xếp đ i ch trực tiếp (Interchange Sort) ................................ 43
2.2.4
Thu t gi i sắp xếp n i bọt (Bubble Sort)....................................................... 45
2.2.5
Thu t gi i shaker (Shaker Sort) ..................................................................... 47
2.2.6
Thu t gi i Shell (Shell Sort) .......................................................................... 48
2.2.7
Thu t gi i vun đống (Heap Sort) ................................................................... 50
2.2.8
Thu t gi i sắp xếp nhanh (Quick Sort) .......................................................... 54
2.2.9
Thu t gi i sắp xếp trộn (Merge Sort)............................................................. 58
2.2.10 Ph ng pháp sắp xếp theo c số (Radix Sort)............................................... 63

CH
NG 3:
C U TRÚC VÀ DANH SÁCH LIÊN K T ...............................................71
3.1
Giới thi u đối t ợng dữ li u con trỏ...................................................................... 71

3.1.1
C u trúc dữ li u tĩnh và c u trúc dữ li u động............................................... 71
3.1.2
Kiểu con trỏ ................................................................................................... 71
3.2
Danh sách liên kết ................................................................................................. 74
3.2.1
Định nghĩa...................................................................................................... 74

1


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

3.2.2
T ch c danh sách liên kết ............................................................................ 75
3.3
Danh sách liên kết đ n .......................................................................................... 76
3.3.1
T ch c danh sách theo cách c p phát liên kết.............................................. 76
3.3.2
Định nghĩa c u trúc danh sách liên kết.......................................................... 78
3.3.3
Các thao tác c b n trên danh sách liên kết đ n............................................ 79
3.4
Sắp xếp danh sách ................................................................................................. 93
3.5
Một số c u trúc đặc bi t c a danh sách liên kết đ n............................................. 96
3.5.1
Ngăn xếp (Stack) ........................................................................................... 96

3.5.2
Hàng đợi (Queue) ........................................................................................ 102
3.6
Một số c u trúc dữ li u d ng danh sách liên kết khác ........................................ 107
3.6.1
Danh sách liên kết vòng............................................................................... 107
3.6.2
Danh sách liên kết kép ................................................................................. 111
TÀI LI U THAM KH O

2


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

L I NÓI Đ U
C u trúc dữ li u và thu t gi i là kiến th c nền t ng c a ch ng trình đào t o ngành
cơng ngh thơng tin. Trong h thống tín chỉ c a ch ng trình đào t o t i khoa Cơng
ngh thơng tin tr ng Đ i học Đà L t, lĩnh vực này đ ợc t ch c thành 2 học ph n: c u
trúc dữ li u và thu t gi i 1, c u trúc dữ li u và thu t gi i
Nội dung học ph n c u trúc dữ li u và thu t gi i 1 đ ợc t ch c trong 3 ch ng:
• Ch ng 1 trình bày t ng quan về c u trúc dữ li u và thu t gi i.
o Các b ớc trong l p trình để gi i quyết cho một bài toán,
o Các khái ni m kiểu dữ li u, kiểu dữ li u trừu t ợng,
o Tiếp c n phân tích thu t gi i.
• Ch ng 2 trình bày các ph ng pháp tìm kiếm và sắp xếp trong.
o Ph ng pháp tìm kiếm tuyến tính, tìm kiếm nhị phân;
o Các thu t gi i sắp xếp: Chọn trực tiếp, Chèn trực tiếp, đ i ch trực tiếp,
Heap sort, Quick sort, . .
• Ch ng 3 trình bày c u trúc dữ li u danh sách liên kết.

o Định nghĩa và t ch c danh sách liên kết
o Danh sách liên kết đ n: định nghĩa, cách t ch c và các thao tác c b n
o Các c u trúc đặc bi t c a danh sách liên kết đ n: Ngăn xếp, Hàng đợi
o Các c u trúc dữ li u d ng danh sách liên kết khác nh danh sách liên kết
vòng, danh sách liên kết kép.
Vì trình độ ng i biên so n có h n nên t p giáo trình khơng tránh khỏi nhiều khiếm
khuyết, Chúng tơi r t mong sự góp ý c a các b n đồng nghi p và sinh viên.
Cuối cùng, Chúng tôi c m n sự động viên, giúp đỡ c a các b n đồng nghi p trong
khoa Công ngh thông tin để t p giáo trình tóm tắt này đ ợc hồn thành.
Các tác gi

3


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

Ch

ng 1:

Gi i Thi u C u Trúc D Li u Và Phân Tích Thu t Gi i
M c tiêu
Sau khi học xong ch

ng này, sinh viên sẽ:

-

Nắm đ ợc các b ớc trong l p trình để gi i quyết cho một bài toán.


-

Nắm vững khái ni m kiểu dữ li u trừu t ợng, sự khác nhau giữa kiểu dữ li u, kiểu
dữ li u trừu t ợng và c u trúc dữ li u.

-

Tiếp c n phân tích thu t gi i

Ki n th c c b n c n thi t
Các kiến th c c b n c n thiết để học ch

ng này bao gồm:

Kh năng nh n biết và gi i quyết bài toán theo h ớng tin học hóa.
N i dung cốt lõi
ng này chúng ta sẽ nghiên c u các v n đề sau:

Ch
-

Cách tiếp c n từ bài toán đến ch

-

Kiểu dữ li u trừu t ợng (Abstract Data Type).

-

Kiểu dữ li u – Kiểu dữ li u trừu t ợng – C u trúc dữ li u.


-

Phân tích thu t gi i

1.1 Từ bài tốn đ n ch

ng trình

ng trình

1.1.1 Mơ hình hóa bài toán thực t
Để gi i một bài toán trong thực tế bằng máy tính ta ph i bắt đ u từ vi c xác định bài
toán. Nhiều th i gian và công s c bỏ ra để xác định bài toán c n gi i quyết, t c là ph i
tr l i rõ ràng câu hỏi "ph i làm gì?" sau đó là "làm nh thế nào?". Thơng th

ng, khi

kh i đ u, h u hết các bài tốn là khơng đ n gi n, khơng rõ ràng. Để gi m bớt sự ph c

4


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

t p c a bài tốn thực tế, ta ph i hình th c hóa nó, nghĩa là phát biểu l i bài tốn thực tế
thành một bài tốn hình th c (hay cịn gọi là mơ hình tốn). Có thể có r t nhiều bài tốn
thực tế có cùng một mơ hình tốn.
Ví dụ 1: Tơ màu b n đồ thế giới.
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 và 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.

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 tố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 và ta 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.
Ví dụ 2: Đèn giao thơng
Cho một ngã năm nh hình I.1, trong đó C và E là các đ
tên, các đ

ng một chiều theo chiều mũi

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ý, nghĩa là: 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.
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 tố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 q lâu.

5


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

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. T t nhiên, để có thể gi i đ ợc bài tốn ta ph i tìm một
cách nào đó để thể hi n mối liên quan giữa các lối đi này. Lối nào với lối nào không thể
đi đồng th i, lối nào và lối nào 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.

đây ta sẽ dùng

một s đồ trực quan nh sau: 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, hoặc cong, hoặc ngoằn ngo tuỳ thích. Ta sẽ có một s đồ nh hình
I.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.
Với cách biểu di n nh v y ta đã có một đồ thị (Graph), t c là ta đã mơ hình hố bài
tốn giao thơng

trên theo mơ hình tốn là đồ thị; trong đó 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 tốn sao cho số màu đ ợc dùng là ít nh t.

Tóm l i, ta ph i gi i quyết bài toán sau:

6


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

"Tô màu cho đồ thị

hình I.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."

Hai bài tốn thực tế “tơ màu b n đồ thế giới” và “đèn giao thông” xem ra r t khác bi t
nhau nh ng sau khi mơ hình hóa, chúng thực ch t chỉ là một, đó là bài tốn “tơ màu đồ

thị”.
Đối với một bài tốn đã đ ợc hình th c hố, chúng ta có thể tìm kiếm cách gi i trong
thu t ngữ c a mô hình đó và xác định có hay khơng một ch
Nếu khơng có một ch

ng trình có sẵn để gi i.

ng trình nh v y thì ít nh t chúng ta cũng có thể tìm đ ợc

những gì đã biết về mơ hình và dùng các tính ch t c a mơ hình để xây dựng một thu t
gi i tốt.
1.1.2 Thu t gi i (algorithms)
Khi đã có mơ hình thích hợp cho một bài toán ta c n cố gắng tìm cách gi i quyết bài
tốn trong mơ hình đó. Kh i đ u là tìm một thu t gi i, đó là một chu i hữu h n các chỉ
thị (instruction) mà m i chỉ thị có một ý nghĩa rõ ràng và thực hi n đ ợc trong một
l ợng th i gian hữu h n.
Knuth (1973) định nghĩa thu t gi i 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 thu t gi i là:
-

Hữu h n (finiteness): thu t gi i ph i luôn luôn kết thúc sau một số hữu h n b ớc.

7


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

-

Xác định (definiteness): m i b ớc c a thu t gi i 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.

-

Hi u qu (effectiveness): các thao tác trong thu t gi i ph i đ ợc thực hi n trong
một l ợng th i gian hữu h n.

Ngoài ra một thu t gi i cịn ph i có đ u vào (input) và đ u ra (output). Nói tóm l i, một
thu t gi i ph i gi i quyết xong công vi c khi ta cho dữ li u vào. Có nhiều cách để thể
hi n thu t gi i: dùng l i, dùng l u đồ, ... Và một lối dùng r t ph biến là dùng ngôn ngữ
mã gi , đó là sự kết hợp c a ngơn ngữ tự nhiên và các c u trúc c a ngơn ngữ l p trình.
Ví dụ: Thiết kế thu t gi i để gi i bài tốn “ tơ màu đồ thị” trên
Bài tốn tơ màu cho đồ thị khơng có thu t gi i tốt để tìm l i gi i tối u, t c là, khơng có
thu t gi i nào khác h n là "thử t t c các kh năng" hay "vét c n" t t c các tr

ng hợp

có thể có, để xác định cách tô màu cho các đỉnh c a đồ thị sao cho số màu dùng là ít
nh t. Thực tế, ta chỉ có thể "vét c n" trong tr
tr

ng hợp đồ thị có số đỉnh nhỏ, trong

ng hợp ng ợc l i ta không thể "vét c n" t t c các kh năng trong một l ợng th i

gian hợp lý, do v y ta ph i suy nghĩ cách khác để gi i quyết v n đề:
Thêm thông tin vào bài tố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 tố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. Một cách làm nh thế
đối với bài toán trên là "Cố gắng tơ màu cho đồ thị bằng ít màu nh t một cách nhanh

chóng". Ít màu nh t

đây có nghĩa là số màu mà ta tìm đ ợc khơng ph i luôn luôn là số

màu c a l i gi i tối u (ít nh t) nh ng trong đa số tr

ng hợp thì nó sẽ trùng với đáp số

c a l i gi i tối u và nếu có chênh l ch thì nó "khơng chênh l ch nhiều" so với l i gi i
tối u, bù l i ta khơng ph i "vét c n" mọi kh năng có thể! Nói khác đi, ta khơng dùng
thu t gi i "vét c n" mọi kh năng để tìm l i gi i tối u mà tìm một gi i pháp để đ a ra
l i gi i hợp lý một cách kh thi về th i gian. Một gi i pháp nh
HEURISTIC. HEURISTIC cho bài tốn tơ màu đồ thị, th

thế gọi là một

ng gọi là thu t gi i "háu ăn"

(GREEDY) là:

8


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

-

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 đó.
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

Ý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.
Ví dụ: Đồ thị hình I.3 và cách tơ màu cho nó

Tơ theo GREEDY

Tối u

(xét l n l ợt theo số th tự các đỉnh)

(thử t t c các kh năng)

1: đỏ; 2: đỏ

1,3,4 : đỏ

3: xanh;4: xanh

2,5 : xanh

5: vàng


Rõ ràng cách tô màu trong thu t gi i "háu ăn" không luôn luôn cho l i gi i tối u
nh ng nó đ ợc thực hi n một cách nhanh chóng.
Tr l i bài tốn giao thông

trên và áp dụng HEURISTIC Greedy cho đồ thị trong hình

I.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
9


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

-

Tơ màu tím cho các đỉnh: DA,DB

-

Tô màu vàng cho các đỉnh: EB,EC


Nh v y ta đã tìm ra một l i gi i là dùng 4 màu để tô cho đồ thị hình I.2. Nh đã nói,
l i gi i này khơng chắc là l i gi i tối u. V y li u có thể dùng 3 màu hoặc ít h n 3 màu
khơng? Ta có thể tr l i mơ hình c a bài tốn và dùng tính ch t c a đồ thị để kiểm tra
kết qu . Nh n xét rằng:
-

Một đồ thị có k đỉnh và m i cặp đỉnh b t kỳ đều đ ợc nối nhau thì ph i dùng k
màu để tơ. Hình I.4 chỉ ra hai ví dụ với k=3 và k=4.

-

Một đồ thị trong đó có k đỉnh mà m i cặp đỉnh b t kỳ trong k đỉnh này đều đ ợc
nối nhau thì khơng thể dùng ít h n k màu để tơ cho đồ thị.

Đồ 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.

Nh v y ta đã gi i đ ợc bài tốn giao thơng đã cho. L i gi i cho bài tốn là 4 nhóm,
m i nhóm gồm các lối có thể đi đồng th i, nó ng với một pha điều khiển c a đèn hi u.
đây c n nh n m nh rằng, s dĩ ta có l i gi i một cách rõ ràng chặt chẽ nh v y là vì
chúng ta đã gi i bài tốn thực tế này bằng cách mơ hình hố nó theo một mơ hình thích
hợp (mơ hình đồ thị) và nh các kiến th c trên mơ hình này (bài tốn tô màu và
heuristic để gi i) ta đã gi i quyết đ ợc bài toán. Điều này khẳng định vai trị c a vi c
mơ hình hố bài tốn.

10



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

Từ những th o lu n trên chúng ta có thể tóm tắt các b ớc tiếp c n với một bài toán bao
gồm:
1. Mơ hình hố bài tốn bằng một mơ hình tốn học thích hợp.
2. Tìm thu t gi i trên mơ hình này. Thu t gi i có thể mơ t một cách khơng hình
th c, t c là nó chỉ nêu ph

ng h ớng gi i hoặc các b ớc gi i một cách t ng

quát.
3. Ph i hình th c hoá thu t gi i bằng cách viết một th tục bằng ngôn ngữ gi , rồi
chi tiết hoá d n ("mịn hoá") các b ớc gi i t ng quát

trên, kết hợp với vi c dùng

các kiểu dữ li u trừu t ợng và các c u trúc điều khiển trong ngơn ngữ l p trình
để mơ t thu t gi i.

b ớc này, nói chung, ta có một thu t gi i t

ng đối rõ

ràng, nó g n giống nh một ch

ng trình đ ợc viết trong ngơn ngữ l p trình,

nh ng nó khơng ph i là một ch


ng trình ch y đ ợc vì trong khi viết thu t gi i

ta không chú trọng nặng đến cú pháp c a ngôn ngữ và các kiểu dữ li u còn
m c trừu t ợng ch không ph i là các khai báo cài đặt kiểu trong ngơn ngữ l p
trình.
4. Cài đặt thu t gi i trong một ngơn ngữ l p trình cụ thể (Pascal,C,...).

b ớc này ta

dùng các c u trúc dữ li u đ ợc cung c p trong ngơn ngữ, ví dụ Array, Record,...
để thể hi n các kiểu dữ li u trừu t ợng, các b ớc c a thu t gi i đ ợc thể hi n
bằng các l nh và các c u trúc điều khiển trong ngôn ngữ l p trình đ ợc dùng để
cài đặt thu t gi i.
Tóm tắt các b ớc nh sau:

11


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

1.2 Kiểu d li u trừu t

ng (Abstract Data Type - ADT)

1.2.1 Khái ni m trừu t

ng hóa

Trong tin học, trừu t ợng hóa nghĩa là đ n gi n hóa, làm cho nó sáng s a h n và d

hiểu h n. Cụ thể trừu t ợng hóa là che đi những chi tiết, làm n i b t cái t ng thể. Trừu
t ợng hóa có thể thực hi n trên hai khía c nh là trừu t ợng hóa dữ li u và trừu t ợng
hóa ch

ng trình.

1.2.2 Trừu t

ng hóa ch

Trừu t ợng hóa ch

ng trình

ng trình là sự định nghĩa các ch

ng trình con để t o ra các phép

tốn trừu t ợng (sự t ng qt hóa c a các phép toán nguyên th y). Chẳng h n ta có thể
t o ra một ch

ng trình con Matrix_Mult để thực hi n phép toán nhân hai ma tr n. Sau

khi Matrix_mult đã đ ợc t o ra, ta có thể dùng nó nh một phép tốn ngun th y
(chẳng h n phép cộng hai số).
Trừu t ợng hóa ch

ng trình thành các ch

ng trình


con. Sự phân chia này sẽ che d u t t c các l nh cài đặt chi tiết trong các ch

ng trình

con.

c p độ ch

ng trình cho phép phân chia ch

ng trình chính, ta chỉ th y l i gọi các ch

ng trình con và điều này

đ ợc gọi là sự bao gói.
Ví dụ nh một ch

ng trình qu n lý sinh viên đ ợc viết bằng trừu t ợng hóa có thể là:

void Main()
{
Nhap( Lop);
Xu_ly (Lop);
Xuat (Lop);
}
Trong ch

ng trình trên, Nhap, Xu_ly, Xuat là các phép toán trừu t ợng. Chúng che


d u bên trong r t nhiều l nh ph c t p mà

c p độ ch

ng trình chính ta khơng nhìn

th y đ ợc. Cịn Lop là một biến thuộc kiểu dữ li u trừu t ợng mà ta sẽ xét sau.

12


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

1.2.3 Trừu t

ng hóa d li u

Trừu t ợng hóa dữ li u là định nghĩa các kiểu dữ li u trừu t ợng
Một kiểu dữ li u trừu t ợng là một mơ hình tốn học cùng với một t p hợp các phép
toán (operator) trừu t ợng đ ợc định nghĩa trên mơ hình đó. Ví dụ t p hợp số nguyên
cùng với các phép toán hợp, giao, hi u là một kiểu dữ li u trừu t ợng.
Trong một ADT các phép tốn có thể thực hi n trên các đối t ợng (tốn h ng) khơng
chỉ thuộc ADT đó, cũng nh kết qu không nh t thiết ph i thuộc ADT. Tuy nhiên ph i
có ít nh t một toán h ng hoặc kết qu ph i thuộc ADT đang xét.
ADT là sự t ng quát hoá c a các kiểu dữ li u nguyên thuỷ.
Ví dụ: một danh sách (LIST) các số nguyên và các phép toán trên danh sách là:
-

T o một danh sách r ng.


-

L y ph n tử đ u tiên trong danh sách và tr về giá trị null nếu danh sách r ng.

-

L y ph n tử kế tiếp trong danh sách và tr về giá trị null nếu khơng cịn ph n tử
kế tiếp.

-

Thêm một số nguyên vào danh sách.

Điều này cho th y sự thu n lợi c a ADT, đó là ta có thể định nghĩa một kiểu dữ li u tuỳ
ý cùng với các phép toán c n thiết trên nó rồi chúng ta dùng nh là các đối t ợng
nguyên thuỷ. H n nữa chúng ta có thể cài đặt một ADT bằng b t kỳ cách nào, ch

ng

trình dùng chúng cũng khơng thay đ i.
Cài đặt ADT là sự thể hi n các phép toán mong muốn (các phép toán trừu t ợng) thành
các câu l nh c a ngơn ngữ l p trình, bao gồm các khai báo thích hợp và các th tục thực
hi n các phép toán trừu t ợng. Để cài đặt ta chọn một c u trúc dữ li u thích hợp có
trong ngơn ngữ l p trình hoặc là một c u trúc dữ li u ph c hợp đ ợc xây dựng lên từ
các kiểu dữ li u c b n c a ngơn ngữ l p trình.

13


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


1.2.4 Kiểu d li u, c u trúc d li u và kiểu d li u trừu t
Structures, Abstract Data Types)

ng (Data Types, Data

Mặc dù các thu t ngữ kiểu dữ li u (hay kiểu - data type), c u trúc dữ li u (data
structure), kiểu dữ li u trừu t ợng (abstract data type) nghe nh nhau, nh ng chúng có
ý nghĩa r t khác nhau.
Kiểu dữ li u là một t p hợp các giá trị và một t p hợp các phép tốn trên các giá trị đó.
Ví dụ kiểu Boolean là một t p hợp có 2 giá trị TRUE, FALSE và các phép tốn trên nó
nh OR, AND, NOT …. Kiểu Integer là t p hợp các số nguyên có giá trị từ -32768 đến
32767 cùng các phép toán cộng, trừ, nhân, chia, Div, Mod…
Kiểu dữ li u có hai lo i là kiểu dữ li u s c p và kiểu dữ li u có c u trúc hay còn gọi là
c u trúc dữ li u.
Kiểu dữ li u s c p là kiểu dữ li u mà giá trị dữ li u c a nó là đ n nh t. Ví dụ: kiểu
Boolean, Integer….
Kiểu dữ li u có c u trúc hay cịn gọi là c u trúc dữ li u là kiểu dữ li u mà giá trị dữ li u
c a nó là sự kết hợp c a các giá trị khác. Ví dụ: ARRAY là một c u trúc dữ li u.
Một kiểu dữ li u trừu t ợng là một mô hình tốn học cùng với một t p hợp các phép
tốn trên nó. Có thể nói kiểu dữ li u trừu t ợng là một kiểu dữ li u do chúng ta định
nghĩa

m c khái ni m (conceptual), nó ch a đ ợc cài đặt cụ thể bằng một ngôn ngữ

l p trình.
Khi cài đặt một kiểu dữ li u trừu t ợng trên một ngơn gnữ l p trình cụ thể, chúng ta
ph i thực hi n hai nhi m vụ:
1. Biểu di n kiểu dữ li u trừu t ợng bằng một c u trúc dữ li u hoặc một kiểu dữ
li u trừu t ợng khác đã đ ợc cài đặt.

2. Viết các ch
mà ta th

ng trình con thực hi n các phép toán trên kiểu dữ li u trừu t ợng

ng gọi là cài đặt các phép toán.

14


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

1.3 PHÂN TÍCH THU T GI I
Với một v n đề đặt ra có thể có nhiều thu t gi i gi i, chẳng h n ng
nhiều thu t gi i sắp xếp một m ng dữ li u. Trong các tr
dụng thu t gi i ng

i ta th

i ta đã tìm ra r t

ng hợp nh thế, khi c n sử

ng chọn thu t gi i có th i gian thực hi n ít h n các thu t

gi i khác. Mặt khác, khi đ a ra một thu t gi i để gi i quyết một v n đề thì một câu hỏi
đặt ra là thu t gi i đó có ý nghĩa thực tế không? Nếu thu t gi i đó có th i gian thực hi n
quá lớn chẳng h n hàng năm, hàng thế kỷ thì đ

ng nhiên không thể áp dụng thu t gi i


này trong thực tế. Nh v y chúng ta c n đánh giá th i gian thực hi n thu t gi i. Phân
tích thu t gi i, đánh giá th i gian ch y c a thu t gi i là một lĩnh vực nghiên c u quan
trọng c a khoa học máy tính.
1.3.1 Thu t gi i và các v n đề liên quan
Thu t gi i đ ợc hiểu là sự đặc t chính xác một dãy các b ớc có thể thực hi n đ ợc một
cách máy móc để gi i quyết một v n đề. C n nh n m nh rằng, m i thu t gi i có một dữ
li u vào (Input) và một dữ li u ra (Output); khi thực hi n thu t gi i (thực hi n các b ớc
đã mô t ), thu t gi i c n cho ra các dữ li u ra t

ng ng với các dữ li u vào.

Biểu di n thu t gi i. Để đ m b o tính chính xác, chỉ có thể hiểu một cách duy nh t,
thu t gi i c n đ ợc mô t trong một ngôn ngữ l p trình thành một ch

ng trình (hoặc

một hàm, một th tục), t c là thu t gi i c n đ ợc mô t d ới d ng mã (code). Tuy
nhiên, khi trình bày một thu t gi i để cho ngắn gọn nh ng v n đ m b o đ chính xác,
ng

i ta th

di n này, ng

ng biểu di n thu t gi i d ới d ng gi mã (pseudo code). Trong cách biểu
i ta sử dụng các câu l nh trong một ngơn ngữ l p trình (pascal hoặc C++)

và c các ký hi u toán học, các m nh đề trong ngôn ngữ tự nhiên (tiếng Anh hoặc tiếng
Vi t chẳng h n). Trong một số tr

c a thu t gi i, ng

ng hợp, để ng

i đọc hiểu đ ợc ý t

i ta có thể biểu di n thu t gi i d ới d ng s đồ (th

ng khái quát
ng đ ợc gọi là

s đồ khối).
Tính đúng đ n (correctness) c a thu t gi i. Đòi hỏi truớc hết đối với thu t gi i là nó
ph i đúng đắn, t c là khi thực hi n nó ph i cho ra các dữ li u mà ta mong muốn t

ng

ng với các dữ li u vào. Chẳng h n nếu thu t gi i đ ợc thiết kế để tìm ớc chung lớn
15


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

nh t c a 2 số nguyên d

ng, thì khi đ a vào 2 số nguyên d

hi n thu t gi i ph i cho ra một số nguyên d

ng (dữ li u vào) và thực


ng (dữ li u ra) là ớc chung lớn nh t c a

2 số nguyên đó.
Ch ng minh một cách chặt chẽ (bằng tốn học) tính đúng đắn c a thu t gi i là một
công vi c r t khó khăn.
Tính hi u qu (efficiency) là một tính ch t quan trong khác c a thu t gi i, chúng ta sẽ
th o lu n về tính hi u qu c a thu t gi i trong mục tiếp theo.
Đến đây chúng ta có thể đặt câu hỏi: có ph i đối với b t kỳ v n đề nào cũng có thu t
gi i gi i (có thể tìm ra l i gi i bằng thu t gi i)? câu tr l i là không. Ng

i ta đã phát

hi n ra một số v n đề không thể đ a ra thu t gi i để gi i quyết nó. Các v n đề đó đ ợc
gọi là các v n đề không gi i đ ợc bằng thu t gi i.
1.3.2 Tính hi u qu c a thu t gi i
Ng

i ta th

ng xem xét thu t gi i, lựa chọn thu t gi i để áp dụng dựa vào các tiêu chí

sau:
-

Thu t gi i đ n gi n, d hiểu.

-

Thu t gi i d cài đặt (d viết ch


-

Thu t gi i c n ít bộ nhớ

-

Thu t gi i ch y nhanh

ng trình)

Khi cài đặt thu t gi i chỉ để sử dụng một số ít l n, ng

i ta th

ng lựa chọn thu t gi i

theo tiêu chí 1 và 2. Tuy nhiên, có những thu t gi i đ ợc sử dụng r t nhiều l n, trong
nhiều ch

ng trình, chẳng h n các thu t gi i sắp xếp, các thu t gi i tìm kiếm, các thu t

gi i đồ thị… Trong các tr

ng hợp nh thế ng

i ta lựa chọn thu t gi i để sử dụng theo

tiêu chí 3 và 4. Hai tiêu chí này đ ợc nói tới nh là tính hi u qu c a thu t gi i.
Tính hi u qu c a thu t gi i gồm hai yếu tố: dung l ợng bộ nhớ mà thu t gi i đòi hỏi

và th i gian thực hi n thu t gi i. Dung l ợng bộ nhớ gồm bộ nhớ dùng để l u dữ li u
vào, dữ li u ra, và các kết qu trung gian khi thực hi n thu t gi i; dung l ợng bộ nhớ
mà thu t gi i đòi hỏi còn đ ợc gọi là độ ph c t p không gian c a thu t gi i. Th i gian
16


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

thực hi n thu t gi i đ ợc nói tới nh là th i gian ch y (running time) hoặc độ ph c t p
th i gian c a thu t gi i.
Sau này chúng ta chỉ quan tâm tới đánh giá th i gian ch y c a thu t gi i. Đánh giá th i
gian ch y c a thu t gi i bằng cách nào? Với cách tiếp c n thực nghi m chúng ta có thể
cài đặt thu t gi i và cho ch y ch

ng trình trên một máy tính nào đó với một số dữ li u

vào. Th i gian ch y mà ta thu đ ợc sẽ phụ thuộc vào nhiều nhân tố:
-

Kỹ năng c a ng

i l p trình

-

Ch

-

Tốc độ thực hi n các phép tốn c a máy tính


-

Dữ li u vào

ng trình dịch

Vì v y, trong cách tiếp c n thực nghi m, ta khơng thể nói th i gian ch y c a thu t gi i
là bao nhiêu đ n vị th i gian. Chẳng h n câu nói “th i gian ch y c a thu t gi i là 30
giây” là không thể ch p nh n đ ợc. Nếu có hai thu t gi i A và B gi i quyết cùng một
v n đề, ta cũng không thể dùng ph

ng pháp thực nghi m để kết lu n thu t gi i nào

ch y nhanh h n, b i vì ta mới chỉ ch y ch

ng trình với một số dữ li u vào.

Một cách tiếp c n khác để đánh giá th i gian ch y c a thu t gi i là ph

ng pháp phân

tích sử dụng các cơng cụ tốn học. Chúng ta mong muốn có kết lu n về th i gian ch y
c a một thu t gi i mà nó không phụ thuộc vào sự cài đặt c a thu t gi i, khơng phụ
thuộc vào máy tính mà trên đó thu t gi i đ ợc thực hi n.
Để phân tích thu t gi i chúng ta c n sử dụng khái ni m cỡ (size) c a dữ li u vào. Cỡ
c a dữ li u vào đ ợc xác định phụ thuộc vào từng thu t gi i. Ví dụ, trong thu t gi i tính
định th c c a ma tr n vuông c p n, ta có thể chọn cỡ c a dữ li u vào là c p n c a ma
tr n; còn đối với thu t gi i sắp xếp m ng cỡ n thì cỡ c a dữ li u vào chính là cỡ n c a
m ng. Đ


ng nhiên là có vơ số dữ li u vào cùng một cỡ. Nói chung trong ph n lớn các

thu t gi i, cỡ c a dữ li u vào là một số nguyên d

ng n. Th i gian ch y c a thu t gi i

phụ thuộc vào cỡ c a dữ li u vào; chẳng h n tính định th c c a ma tr n c p 20 đòi hỏi
th i gian ch y nhiều h n tính định th c c a ma tr n c p 10.

17


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

Nói chung, cỡ c a dữ li u càng lớn thì th i gian thực hi n thu t gi i càng lớn. Nh ng
th i gian thực hi n thu t gi i không chỉ phụ thuộc vào cỡ c a dữ li u vào mà cịn phụ
thuộc vào chính dữ li u vào. Trong số các dữ li u vào cùng một cỡ, th i gian ch y c a
thu t gi i cũng thay đ i. Chẳng h n, xét bài tốn tìm xem đối t ợng a có mặt trong danh
sách (a1,…,ai,…,an) hay không. Thu t gi i đ ợc sử dụng là thu t gi i tìm kiếm tu n tự:
Xem xét l n l ợt từng ph n tử c a danh sách cho tới khi phát hi n ra đối t ợng c n tìm
thì dừng l i, hoặc đi hết danh sách mà không gặp ph n tử nào bằng a.

đây cỡ c a dữ

li u vào là n, nếu một danh sách với a là ph n tử đ u tiên, ta chỉ c n một l n so sánh và
đây là tr

ng hợp tốt nh t, nh ng nếu một danh sách mà a xu t hi n


vị trí cuối cùng

hoặc a khơng có trong danh sách, ta c n n l n so sánh a với từng ai (i=1,2,…,n), tr
hợp này là tr
trong tr

ng

ng hợp x u nh t. Vì v y, chúng ta c n đ a vào khái ni m th i gian ch y

ng hợp x u nh t và th i gian ch y trung bình.

Th i gian ch y trong tr

ng h p x u nh t (worst-case running time) c a một thu t

gi i là th i gian ch y lớn nh t c a thu t gi i đó trên t t c các dữ li u vào cùng cỡ .
Chúng ta sẽ ký hi u th i gian ch y trong tr

ng hợp x u nh t là T(n), trong đó n là cỡ

c a dữ li u vào. Sau này khi nói tới th i gian ch y c a thu t gi i chúng ta c n hiểu đó là
th i gian ch y trong tr

ng hợp x u nh t. Sử dụng th i gian ch y trong tr

ng hợp x u

nh t để biểu thị th i gian ch y c a thu t gi i có nhiều u điểm. Tr ớc hết, nó đ m b o
rằng, thu t gi i không khi nào tiêu tốn nhiều th i gian h n th i gian ch y đó. H n nữa,

trong các áp dụng, tr

ng hợp x u nh t cũng th

ng xuyên x y ra.

Chúng ta xác định th i gian ch y trung bình (average running time) c a thu t gi i là
số trung bình cộng c a th i gian ch y c a thu t gi i đó trên t t c các dữ li u vào cùng
cỡ n. Th i gian ch y trung bình c a thu t gi i sẽ đ ợc ký hi u là Ttb(n). Đánh giá th i
gian ch y trung bình c a thu t gi i là cơng vi c r t khó khăn, c n ph i sử dụng các công
cụ c a xác su t, thống kê và c n ph i biết đ ợc phân phối xác su t c a các dữ li u vào.
R t khó biết đ ợc phân phối xác su t c a các dữ li u vào. Các phân tích th

ng ph i

dựa trên gi thiết các dữ li u vào có phân phối xác su t đều. Do đó, sau này ít khi ta
đánh giá th i gian ch y trung bình.

18


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

Để có thể phân tích đ a ra kết lu n về th i gian ch y c a thu t gi i độc l p với sự cài
đặt thu t gi i trong một ngơn ngữ l p trình, độc l p với máy tính đ ợc sử dụng để thực
hi n thu t gi i, chúng ta đo th i gian ch y c a thu t gi i bởi số phép toán s c p c n
ph i thực hi n khi ta thực hi n thu t gi i. C n chú ý rằng, các phép toán s c p là các
phép toán số học, các phép toán logic, các phép tốn so sánh,…, nói chung, các phép
tốn s c p c n đ ợc hiểu là các phép tốn mà khi thực hi n chỉ địi hỏi một th i gian
cố định nào đó (th i gian này nhiều hay ít là phụ thuộc vào tốc độ c a máy tính). Nh

v y chúng ta xác định th i gian ch y T(n) là số phép toán s c p mà thu t gi i đòi hỏi,
khi thực hi n thu t gi i trên dữ li u vào cỡ n.
Tính ra biểu th c mơ t hàm T(n) đ ợc xác định nh trên là không đ n gi n, và biểu
th c thu đ ợc có thể r t ph c t p. Do đó, chúng ta sẽ chỉ quan tâm tới tốc đ tăng (rate
of growth) c a hàm T(n), t c là tốc độ tăng c a th i gian ch y khi cỡ dữ li u vào tăng.
Ví dụ, gi sử th i gian ch y c a thu t gi i là T(n) = 3n2 + 7n + 5 (phép toán s c p).
Khi cỡ n tăng, h ng th c 3n2 quyết định tốc độ tăng c a hàm T(n), nên ta có thể bỏ qua
các h ng th c khác và có thể nói rằng th i gian ch y c a thu t gi i tỉ l với bình
ph

ng c a cỡ dữ li u vào. Trong mục tiếp theo chúng ta sẽ định nghĩa ký hi u ô lớn và

sử dụng ký hi u ô lớn để biểu di n th i gian ch y c a thu t gi i.
1.3.3 Ký hi u O và biểu di n th i gian ch y bởi ký hi u O
1. Định nghĩa ký hi u O
Định nghĩa. Gi sử f(n) và g(n) là các hàm thực không âm c a đối số ngun khơng âm
n. Ta nói “f(n) là ô lớn c a g(n)” và viết là 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) <= cg(n) với mọi n >= n0.

Nh v y, f(n) = O(g(n)) có nghĩa là hàm f(n) bị chặn trên b i hàm g(n) với một nhân tử
hằng nào đó khi n đ lớn. Muốn ch ng minh đ ợc f(n)= O(g(n)), chúng ta c n chỉ ra
nhân tử hằng c , số nguyên d

ng n0 và ch ng minh đ ợc f(n) <= cg(n) với mọi n >=

n 0.
Ví dụ. Gi sử f(n) = 5n3+ 2n2+ 13n + 6 ,


19


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

ta có: f(n) = 5n3+ 2n2+ 13n + 6 <= 5n3+ 2n3+ 13n3+ 6n3= 26n3
B t đẳng th c trên đúng với mọi n >= 1, và ta có n0= 1, c = 26.
Do đó, ta có thể nói f(n) = O(n3).
T ng quát nếu f(n) là một đa th c b c k c a n:
f(n) = aknk+ ak-1nk-1+ ... + a1n + a0 thì f(n) = O(nk)
Sau đây chúng ta đ a ra một số h qu từ định nghĩa ký hi u ơ lớn, nó giúp chúng ta
hiểu rõ b n ch t ký hi u ô lớn. (L u ý, các hàm mà ta nói tới đều là các hàm thực không
âm c a đối số nguyên d

ng)

-

Nếu f(n) = g(n) + g1(n) + ... + gk(n), trong đó các hàm gi(n) (i=1,...,k) tăng ch m h n

-

Nếu f(n) = O(g(n)) thì f(n) = O(d.g(n)), trong đó d là hằng số d

-

Nếu f(n) = O(g(n)) và g(n) = O(h(n)) thì f(n) = O(h(n)) (tính bắc c u)

hàm g(n) (t c là gi(n)/g(n) å 0, khi nå0) thì f(n) = O(g(n))


ng b t kỳ

Các kết lu n trên d dàng đ ợc ch ng minh dựa vào định nghĩa c a ký hi u ô lớn. Đến
đây, ta th y rằng, chẳng h n nếu f(n) = O(n2) thì f(n) =O(75n2), f(n) = O(0,01n2), f(n) =
O(n2+ 7n + logn), f(n) = O(n3),..., t c là có vơ số hàm là c n trên (với một nhân tử hằng
nào đó) c a hàm f(n).
Một nh n xét quan trọng nữa là, ký hi u O(g(n)) xác định một t p hợp vô h n các hàm
bị chặn trên b i hàm g(n), cho nên ta viết f(n) = O(g(n)) chỉ có nghĩa f(n) là một trong
các hàm đó.
2. Biểu di n th i gian ch y c a thu t gi i
Th i gian ch y c a thu t gi i là một hàm c a cỡ dữ li u vào: hàm T(n). Chúng ta sẽ
biểu di n th i gian ch y c a thu t gi i b i ký hi u ô lớn:
T(n) = O(f(n)), biểu di n này có nghĩa là th i gian ch y T(n) bị chặn trên b i hàm f(n).
Thế nh ng nh ta đã nh n xét, một hàm có vơ số c n trên. Trong số các c n trên c a
th i gian ch y, chúng ta sẽ l y c n trên chặt (tight bound) để biểu di n th i gian ch y
c a thu t gi i.

20


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

Định nghĩa. Ta nói f(n) là c n trên chặt c a T(n) nếu
-

T(n) = O(f(n)), và

-

Nếu T(n) = O(g(n)) thì f(n) = O(g(n)).


Nói một cách khác, f(n) là c n trên chặt c a T(n) nếu nó là c n trên c a T(n) và ta
khơng thể tìm đ ợc một hàm g(n) là c n trên c a T(n) mà l i tăng ch m h n hàm f(n).
Sau này khi nói th i gian ch y c a thu t gi i là O(f(n)), chúng ta c n hiểu f(n) là c n
trên chặt c a th i gian ch y.
Nếu T(n) = O(1) thì điều này có nghĩa là th i gian ch y c a thu t gi i bị chặn trên b i
một hằng số nào đó, và ta th

ng nói thu t gi i có th i gian ch y hằng. Nếu T(n) =

O(n), thì th i gian ch y c a thu t gi i bị chặn trên b i hàm tuyến tính, và do đó ta nói
th i gian ch y c a thu t gi i là tuyến tính. Các c p độ th i gian ch y c a thu t gi i và
tên gọi c a chúng đ ợc li t kê trong b ng sau:
Kí hi u

Tên gọi

O(1)

hằng

O(logn)

logarit

O(n)

tuyến tính

O(nlogn)


nlogn

O(n2)

bình ph

O(n3)

l p ph

O(2n)



ng
ng

Đối với một thu t gi i, chúng ta sẽ đánh giá th i gian ch y c a nó thuộc c p độ nào
trong các c p độ đã li t kê trên. Trong b ng trên, chúng ta đã sắp xếp các c p độ th i

21


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

gian ch y theo th tự tăng d n, chẳng h n thu t gi i có th i gian ch y là O(logn) ch y
nhanh h n thu t gi i có th i gian ch y là O(n),... Các thu t gi i có th i gian ch y là
O(nk), với k = 1,2,3,..., đ ợc gọi là các thu t gi i th i gian ch y đa th c (polynimialtime algorithm).
Để so sánh th i gian ch y c a các thu t gi i th i gian đa th c và các thu t gi i th i gian

mũ, chúng ta hãy xem xét b ng sau:
Th i

Cỡ dữ li u vào

gian
ch y

10

20

30

40

50

60

N

0,00001 giây

0,00002 giây

0,00003 giây

0,00004 giây


0,00005 giây

0,00006 giây

N2

0,0001 giây

0,0004 giây

0,0009 giây

0,0016 giây

0,0025 giây

0,0036 giây

N3

0,001 giây

0,008 giây

0,027 giây

0,064 giây

0,125 giây


0,216 giây

N5

0,1 giây

3,2 giây

24,3 giây

1,7 phút

5,2 phút

13 phút

2n

0,001 giây

1,0 giây

17,9 phút

12,7 ngày

35,7 năm

366 thế kỷ


3n

0,059 giây

58 phút

6,5 năm

3855 thế kỷ

2.108 thế kỷ

1,3.1013 thế kỷ

Trong b ng trên, ta gi thiết rằng m i phép toán s c p c n 1 micro giây để thực hi n.
Thu t gi i có th i gian ch y n2, với cỡ dữ li u vào n = 20, nó địi hỏi th i gian ch y là
202x10-6 = 0,004 giây. Đối với các thu t gi i th i gian mũ, ta th y rằng th i gian ch y
c a thu t gi i là ch p nh n đ ợc chỉ với các dữ li u vào có cỡ r t khiêm tốn, n < 30; khi
cỡ dữ li u vào tăng, th i gian ch y c a thu t gi i tăng lên r t nhanh và tr thành con số
kh ng lồ.
Chẳng h n, thu t gi i với th i gian ch y 3n, để tính ra kết qu với dữ li u vào cỡ 60, nó
địi hỏi th i gian là 1,3x1013 thế kỷ! Để th y con số này kh ng lồ đến m c nào, ta hãy
liên t

ng tới vụ n “big-bang”, “big-bang” đ ợc ớc tính là x y ra cách đây 1,5x108

thế kỷ. Chúng ta khơng hy vọng có thể áp dụng các thu t gi i có th i gian ch y mũ
trong t

ng lai nh tăng tốc độ máy tính, b i vì khơng thể tăng tốc độ máy tính lên mãi


22


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

đ ợc, do sự h n chế c a các quy lu t v t lý. Vì v y nghiên c u tìm ra các thu t gi i
hi u qu (ch y nhanh) cho các v n đề có nhiều ng dụng trong thực ti n luôn luôn là sự
mong muốn c a các nhà tin học.
1.3.4 Đánh giá th i gian ch y c a thu t gi i
Mục này trình bày các kỹ thu t để đánh giá th i gian ch y c a thu t gi i b i ký hi u ô
lớn. C n l u ý rằng, đánh giá th i gian ch y c a thu t gi i là công vi c r t khó khăn,
đặc bi t là đối với các thu t gi i đ quy. Tuy nhiên các kỹ thu t đ a ra trong mục này
cho phép đanh giá đ ợc th i gian ch y c a h u hết các thu t gi i mà ta gặp trong thực
tế. Tr ớc hết chúng ta c n biết cách thao tác trên các ký hi u ô lớn. Quy tắc “cộng các
ký hi u ô lớn” sau đây đ ợc sử dụng th

ng xuyên nh t.

1. Lu t tổng
Gi sử thu t gi i gồm hai ph n (hoặc nhiều ph n), th i gian ch y c a ph n đ u là T1(n),
ph n sau là T2(n). Khi đó th i gian ch y c a thu t gi i là T1(n) + T2(n) sẽ đ ợc suy ra từ
sự đánh giá c a T1(n) và T2(n) theo lu t sau:
Gi sử T1(n) = O(f(n)) và T2(n) = O(g(n)). Nếu hàm f(n) tăng nhanh h n hàm g(n), t c
là g(n) = O(f(n)), thì T1(n) + T2(n) = O(f(n)).
Lu t này đ ợc ch ng minh nh sau. Theo định nghĩa ký hi u ô lớn, ta tìm đ ợc các
hằng số c1, c2, c3 và n1, n2, n3 sao cho:
T1(n) <= c1f(n) với n >= n1
T2(n) <= c2 g(n) với n >= n2
g(n) <= c3f(n) với n >= n3

Đặt n0= max(n1, n2, n3). Khi đó với mọi n >= n0, ta có:
T1(n) + T2(n) <= c1f(n) + c2g(n)
<= c1f(n) + c2c3f(n) = (c1+c2c3)f(n)
Nh v y với c = c1+ c2c3 thì T1(n) + T2(n) <= cf(n) với mọi n >= n0

23


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

Ví d . Gi sử thu t gi i gồm ba ph n, th i gian ch y c a từng ph n đ ợc đánh giá là
T1(n) = O(nlogn), T2(n) = O(n2) và T3(n) = O(n). Khi đó th i gian ch y c a toàn bộ
thu t gi i là T(n) = T1(n) + T2(n) + T3(n) = O(n2), vì hàm n2 tăng nhanh h n các hàm
nlogn và n.
2. Th i gian ch y c a các l nh
Th i gian thực hi n các phép toán s c p là O(1).
• L nh gán

L nh gán có d ng
X = <biểu th c>
Th i gian ch y c a l nh gán là th i gian thực hi n biểu th c. Tr

ng hợp hay gặp nh t

là biểu th c chỉ ch a các phép toán s c p, và th i gian thực hi n nó là O(1). Nếu biểu
th c ch a các l i gọi hàm thì ta ph i tính đến th i gian thực hi n hàm, và do đó trong
tr

ng hợp này th i gian thực hi n biểu th c có thể khơng là O(1).


• L nh lựa chọn

L nh lựa chọn if-else có d ng
if (<điều ki n>)
l nh 1
else
l nh 2
Trong đó, điều ki n là một biểu th c c n đ ợc đánh giá, nếu điều ki n đúng thì l nh 1
đ ợc thực hi n, nếu khơng thì l nh 2 đ ợc thực hi n. Gi sử th i gian đánh giá điều
ki n là T0(n), th i gian thực hi n l nh 1 là T1(n), th i gian thực hi n l nh 2 là T2(n).
Th i gian thực hi n l nh lựa chọn if-else sẽ là th i gian lớn nh t trong các th i gian
T0(n) + T1(n) và T0(n) + T1(n).
Tr

ng hợp hay gặp là kiểm tra điều ki n chỉ c n O(1). Khi đó nếu T1(n) = O(f(n)),

T2(n) = O(g(n)) và f(n) tăng nhanh h n g(n) thì th i gian ch y c a l nh if-else là
O(f(n)); còn nếu g(n) tăng nhanh h n f(n) thì l nh if-else c n th i gian O(g(n)).
24


×