Ch
ng 2
Phân tích
ph c t p c a m t s
gi i thu t s p th t và tìm ki m
1
N i dung
1.
2.
3.
4.
5.
6.
Vài ph ng ph p s p th t c n b n
Quicksort
X p th t d a vào c s
X p th t b ng ph ng ph p tr n
X p th t ngo i
Vài ph ng ph p tìm ki m c n b n
2
Nguy n t c v s p th
t
Xét nh ng ph ng pháp s p th t m t t p tin g m các
m u tin (record) có ch a khóa (key). Khóa mà là m t ph n
c dùng
i u khi n vi c s p th t .
c a m u tin,
M c tiêu: s p x p các m u tin sao cho các tr khóa c a
chúng có th t theo m t qui lu t th t nào ó.
c s p th t có th ch a trong b nh
N u các t p tin
chính thì gi i thu t s p th t
c g i là s p th t n i
(internal sorting).
Vi c s p th t t p tin l u
t ngo i (external sorting).
b nh ph
c g i là s p th
3
Hai nh m ph
ng ph p s p th
t
Chúng ta quan t m n th i gian tính tốn c a các
gi i thu t s p th t .
1. M t nhóm g m 4 ph ng pháp c n b n ịi h i
th i gian tính tốn t l v i N
s p th t N
ph n t .
. Các ph ng pháp tiên ti n h n có th s p th t N
ph n t trong th i gian ch y t l v i NlgN.
M t c tính c a ph ng pháp s p th t là tính n nh
(stability). M t ph ng pháp s p th t
c g i là n nh
c th t t ng i c a các ph n t
khi nó b o tồn
cùng tr khóa trong t p tin.
4
1. Nh m ph
ng ph p c n b n
V i nh m n y, c hai ph
ch n
kh o sá t:
ng ph p s p th t
c
- s p th t b ng ph
ng phá p ch n (selection sort)
- s p th t b ng ph
ng phá p chèn (insertion sort)
V i m c ích t p trung v o khía c nh gi i thu t ta s
là m vi c v i c c ph ng phá p mà n ch s p th t
cá c m ng s nguyên theo th t l n d n c a s .
5
S p th
t
b ng ph
ng ph p ch n
Ý t ng:
Tr c tiên t m ph n t nh nh t trong m ng v hốn i
nó v i ph n t ang v trí th nh t trong m ng à r i
tìm ph n t nh th nhì trong m ng và hốn i nó v i
và c th cho
ph n t ang v trí th nhì trong m
n khi toàn m ng ã
c s p th t .”
390
205
182
45
235
→
205
182
390
235
→
205
390
235
→
390
235
→
6
Gi i thu t s p th
t
b ng ph
ng ph p ch n
procedure selection;
var i, j, min, t: integer;
begin
for i :=1 to N-1 do
begin
min :=i;
for j :=i+1 to N do
if a[j]
t :=a[min]; a[min] :=a[i];
a[i] :=t;
end;
end;
7
Phân tích
ph c t p c a selection sort
V ng l p trong (tác v so sánh)
c th c hi n v i
t ng s l n nh sau:
(N- )+(N-2)+...+1 =N(N- )/2
=O(N2)
Vịng l p ngồi
c th c thi N- l n.
Tính ch t 1.1: Selection sort th c thi kho ng N hoán
v và N2/2 so sánh.
Ghi chú: Th i gian tính tốn c a selection sort thì
c l p i v i d li u nh p.
8
S p th
t
b ng ph
ng ph p ch n
Ýt
ng :
i thu t xem xét t ng ph n t m
c a nó trong nhóm các ph n t ã
chèn nó vào v trí úng
c s p th t r i.
45
205
182
45
235
182
45
235
45
235
45
235
235
9
Gi i thu t s p th
t
b ng ph
ng ph p ch n
procedure insertion;
var i; j; v:integer;
begin
for i:=2 to N do
begin
v:=a[i]; j:= i;
while a[j-1]> v do
begin
a[j] := a[j-1]; // pull down
j:= j-1 end;
a[j]:=v;
end;
end;
10
Nh ng l
ý v gi i thu t insertion sort
. Chúng ta dùng m t tr khóa “c m canh” (sentinel) t i
a[0], làm cho nó nh h n ph n t nh nh t trong m ng.
2. Vòng l p ngoài c a gi i thu t
c th c thi N-1 l n.
Tr ng h p x u nh t x y ra khi m ng ã có th t
o
c th c thi v i t ng s
ng c. Khi ó, vịng l p trong
l n sau ây:
(N-1) + (N-2) + ... + 1 =N(N-1)/2
=O(N2)
S b c chuy n = N(N-1)/2
S so sánh = N(N-1)/2
3. Trung bình có kho ng ch ng (i-1)/2 so sánh
c th c
thi trong vòng l p trong. Do ó, trong tr ng h p trung
bình, t ng s l n so sánh là:
(N-1)/2 + (N-2)/2 + ... + 1/2 =N(N-1)/4
=O(N2)
11
ph c t p c a s p th t b ng ph
ch n và ph ng ph p ch n
ng ph p
Tính ch t .2: S p th t b ng ph ng pháp ch n
th c thi kho ng N2/2 so sánh và N2/4 hoán v trong
tr ng h p x u nh t.
Tính ch t .3: S p th t b ng ph ng pháp chèn
th c thi kho ng N2/4 so sánh và N2/8 hoán v trong
tr ng h p trung bình.
Tính ch t 1.4: S p th t b ng ph ng pháp chèn có
ph c t p tuy n tính i v i m t m ng ã g n có
th t .
12
2. Gi i thu t Quick sort
i thu t c n b n c a Quick sort
i C. A. R. Hoare.
c phát minh n m
Quicksort
c a chu ng vì nó khơng q khó
hi n
th c hóa.
Quicksort ch ịi h i kho ng ch ng NlgN thao tác c n b n
s p th t N ph n t .
Nh c i m c a Quick sort g m:
quy
- Nó là m t gi i thu t
- Nó c n kho ng N2 thao tác c n b n trong tr
x u nh t
- Nó d b l i khi l p trình (fragile).
ng h p
13
Gi i thu t c n b n c a Quicksort
Quicksort l m t ph ng pháp x p th t theo ki u “chia
tr ”. Nó th c hi n b ng cách phân ho ch m t t p tin
thành hai ph n và s p th t m i ph n m t cách c l p
v i nhau.
Gi i thu t có c u trúc nh sau:
procedure quicksort1(left,right:integer);
var i: integer;
begin
if right > left then
begin
i:= partition(left,right);
quicksort(left,i-1);
quicksort(i+1,right);
end;
end;
14
Phân ho ch
Ph n then ch t c a Quicksort l th t c ph n ho ch
s p x p l i m ng sao cho th a m n 3 i u
(partition)
ki n sau:
i) ph n t a[i]
c a v v trí úng n c a n , v i m t
giá tr i nào ó,
ii) t t c nh ng ph n t trong nhóm a[left], ..., a[i-1] thì nh
h n hay b ng a[i]
iii) t t c nh ng ph n t trong nhóm a[i+1], ..., a[right] thì
l n h n hay b ng a[i]
Example:
15
Thí d v phân ho ch
s chúng ta ch n ph n t th nh t hay ph n t t n cùng
trái (leftmost ) nh là ph n t s
c a v v trí úng c a
c g i là ph n t ch t - pivot).
nó ( Ph n t này
15 3
1
75 45 65 35 5
2
7
55
15 3
25 2
1
75 45 65 35 5
6
7
55
15 3
35
25 6
25 2
1
35 45 65 75 5
6
7
55
15 3
25 2
1
4
6
7
55
nh h n
45 65 75 5
sorted
l nh n
16
Gi i thu t Quicksort
procedure quicksort2(left, right: integer);
var j, k: integer;
begin
if right > left then
begin
j:=left; k:=right+1;
//start partitioning
repeat
repeat j:=j+1 until a[j] >= a[left];
repeat k:=k-1 until a[k]<= a[left];
if j< k then swap(a[j],a[k])
until j>k;
swap(a[left],a[k]); //finish partitioning
quicksort2(left,k-1);
quicksort2(k+1,right)
end;
end;
17
Phân tích
ph c t p: tr
ng h p t t nh t
Tr ng h p t t nh t x y ra v i Quicksort l khi m i l n
phân ho ch chia t p tin ra làm hai ph n b ng nhau.
i u này làm cho s l n so sánh c a Quicksort th a mãn h
th c truy h i:
CN = 2CN/2 + N.
S h nh 2CN/2 là chi phí c a vi c s p th t hai n a t p tin
và N là chi phí c a vi c xét t ng ph n t khi phân ho ch l n
u.
T ch ng 1, vi c gi i h th c truy h i này ã a n l i
gi i:
CN N lgN.
18
Phân tích
ph c t p: tr
ng h p x u nh t
M t tr ng h p x u nh t c a Quicksort l khi t p tin
th t r i.
c
Khi , ph n t th nh t s òi h i n so sánh
nh n ra
úng v trí th nh t. H n n a, sau ó phân
r ng nó nên
o n bên trái là r ng và và phân o n bên ph i g m n – 1
ph n t . Do ó v i l n phân ho ch k , ph n t th hai s
òi h i n-1 so sánh nh n ra r ng nó nên
úng v trí th
hai. Và c ti p t c nh th .
Nh v y t ng s l n so sánh s là:
n + (n-1) + … + 2 + 1 = n(n+1) 2 =
(n2 + n) 2 = O(n2).
ph c t p tr
ng h p x u nh t c a Quicksort là O(n2).
19
ph c t p tr
ng h p trung bình c a Quicksort
Cơng th c truy h i chính xác cho t ng s so sánh mà Quick
c hình thành m t cách
sort c n s p th t N ph n t
ng u nhiên:
N
CN = (N+1) + ( N)
(Ck-1 + CN-k)
1
v iN
2 và C1 = C0 = 0
S h ng (N+1) bao g m s l n so sánh ph n t ch t v i t ng
hai pointer giao nhau.
ph n t khác, thêm hai l n so sánh
Ph n còn l i là do s ki n m i ph n t
v trí k có cùng xác
c làm ph n t ch t mà sau ó chúng ta có
xu t 1/N
hai phân o n v i s ph n t l n l t là k-1 và N-k.
20
Ch
r n
+ C1 + … + CN-1 thì gi ng h t
CN-1 + CN-2 +… + C0, nên ta có
N
CN = (N+1) + (1/N)
2Ck-1
1
i l ng tính t ng b ng cách nhân c hai v
Ta có th lo i tr
v i N và r i tr cho cùng công th c nhân v i N-1:
NCN – (N-1) CN-1 = N(N+1) – (N-1)N + 2CN-1
T
ó ta
c
NCN = (N+1)CN-1 + 2N
21
Chia c hai v v i N(N+1) ta
c h th c truy h i:
CN (N+1) = CN-1/N + 2/(N+1)
= CN-2 /(N-1) + 2/N + 2/(N+1)
.
.
N
2/(k+1)
= C2 /3 +
3
N
CN/(N+1)
2
N
1/k
1
2 1/x dx = 2lnN
1
Suy ra:
CN 2NlnN
22
ph c t p tr
Quicksort tt
ng h p trung bình c a
V ta c :
lnN = (log2N).(loge2) = .69 lgN
2NlnN
1.38 NlgN.
⇒T ng s so sánh trung bình c a Quicksort ch kho ng
ch ng 38 cao h n trong tr ng h p t t nh t.
M nh . Quicksort c n kho ng 2NlnN so sánh trong
tr ng h p trung bình.
23
Kh
quy gi i thu t Quicksort
Dùng ng n x p (stack) ta có th chuy n Quicksort thành m t
quy
gi i thu t không
procedure quicksort3;
var t, i, left, right : integer;
begin
left :=1; right:= N;
stackinit;
push(left); push(right);
repeat
if right > left then
begin
i=: partition(left,right);
if (i –left) > (right –i) then
begin push(left); push(i-1);
left := i+1 end
else
begin
push (i+1);push(right);
right:=i-1
end;
end
else
begin right := pop; left := pop
end;
until stackempty;
end;
24
3. S p th
t
d a vào c s
Trong nhi u ng d n ác tr khóa có th là nh ng khóa
thu c m t t m h n nh nào ó.
Các ph ng pháp s p th t mà l i d ng tính ch t s c a
các khóa
c g i là s p th t d a vào c s (radix sort).
Nh ng ph ng pháp này khơng ch so sánh các tr khóa
chúng x lý và so sánh các ph n c a khóa.
S p th t d a vào c s coi các tr khóa nh là nh ng s
c bi u di n d ng h c s M và làm vi c v i t ng ký
s (digit) n l .
V i h u h t m i máy tính, th t ti n l i làm vi c v i c
s 2 (M =2)
n là c s th p phân (M =10).
25