1
Ch ng 3
Phân tích ph c t p m t sgi i thu t trên c u trúc d li u
2
N i dung
1. Tìm ki m tu n t trên danh sách liên k t2. Cây tìm ki m nh phân3. Hàng i có u tiên và heapsort4. K thu t b m
3
1.Tìm ki m tu n t trên danh sách liên k t
Tìm ki m tu n t (sequential search) có th c th chi n thông qua vi c dùng danh sách liên k t (linkedlist) bi u di n các m u tin trong t p tin.
M t l i i m: d làm cho danh sách liên k t có th tmà giúp cho vi c tìm ki m nhanh chóng h n.
4
3 4 7 21
Z…
Tìm ki m tu n t trên m t danh sách liên k t cóth t .Qui c: z là nút gi trong danh sách liên k t.
type link = nodenode = record key, info: integer;next: link
end;var head, t, z: link;
i: integer;
5
Gi i thu t tìm ki m tu n t trên danh sáchliên k t
procedure initialize;begin
new(z); z.next: = z;new(head); head.next:= z
end;
function listsearch (v: integer; t: link): link;begin
z.key: = v;repeat t:= t.next until v < = t.key;if v = t.key then listsearch:= telse listsearch: = z
end;
6
Gi i thu t tìm ki m tu n t trên danh sách liênk t (tt.)
function listinsert (v: integer; t: link): link;begin
z.key: = v;while t.next.key < v do t: = t.next;new(x); x.next: = t.key; t.next: = x;x.key: = v;listinsert: = x;
end;
Tính ch t: Tìm ki m tu n t trên danh sách liên k t cóth t dùng trung bình kho ng N/2 thao tác so sánh cho cs tìm ki m thành công hay không thành.
7
Ch ng minh:
V i s tìm ki m thành công, n u gi s r ng m i m u tintrong danh sách liên k t có xác xu t b ng nhau (1/N)
c tìm th y, s l n so sánh trung bình s là:
(1 + 2+ …+ N)/N = N(N+1)/(2N) = (N+1)/2.
V i s tìm ki m không thành công, n u gi s r ng m i m utin trong danh sách liên k t hay nút k t thúc z có xác xu tb ng nhau (1/(N+1)) c tìm th y v trí sau cùng c aquá trình tìm ki m, s l n so sánh trung bình s là:
(1 + 2+ …+ (N+1))/(N+1) = (N+2)(N+1)/(2(N+1)) = (N+2)/2.
8
2.Cây tìm ki m nh phân
10
13
7
5
192
Trong m t cây tìm ki m nh phân (binary search tree),t t c các m u tin v i khóa nh h n khóa t i nút ang xétthì cây con bên trái c a nút vàcác m u tin v i khóa l n h n hay b ng khóa t i nút angxét thì cây con bên ph i c a nút.
9
Kh i t o cây nh phân
procedure tree_init;begin
new(z); z.1: = z; z.r: = z;new(head); head.key: = 0; head.r: = z;
end;
M t cây r ng c bi u di n b ng cây có contr bên ph i ch n nút gi z.
10
Tác v thêm vàoThêm m t nút vào trong cây, ta th c hi n m t s tìmki m (không thành công) nút y trên cây, r i g n nút
y vào v trí ng v i nút gi z t i i m mà quá trình tìmki m k t thúc.
A
A R
S
C
E
H
Hình v minh h avi c thêm nút P vàocây nh phân.
11
Tác v thêm vào (tt.)
;
procedure tree_insert (v: integer; x: link): link;var p: link;begin
repeatp: = x;if v < x.key then x: = x.1 else x: = x.r
until x = z;new(x); x.key: = v;x.1: = z; x.r: = z; /* create a new node */if v < p. key then p.1: = x /* p denotes the parent of
the new node */else p.r: = x;tree p.r: = x
end
12
In ra cây nh phânprocedure treeprint(x: kink)begin
if x <> z thenbegin
treeprint (x.1);printnode (x);treeprint (x.r)
endend;
Vì m t cây nh phân di n t m t t p tin có th t , vi c in racác tr khóa trong cây theo m t cách úng n s em l im t danh sách các khóa có th t .
13
Tác v tìm ki m
type link = node;node = record key, info: integer;l, r: link end;
var t, head, z: link;
function treesearch (v: integer, x: link): link; /* search the node withthe key v in the binary search tree x */
beginwhile v <> x. key and x <> z dobegin
if v < x.key then x: = x.1else x: = x.r
end;treesearch: = x
end;
14
Tính ch t c a s tìm ki m trên cây nh phân
Tính ch t: M t tác v thêm vào hay tìm ki m trên m t cây nhphân òi h i ch ng 2lnN so sánh trên m t cây c t o ra t Ntr khóa ng u nhiên.
Ch ng minh:Chi u dài l i i c a 1 nút: là s c nh c n duy t qua t nút
y v nút r +1.
i v i m i nút trên cây nh phân, s so sánh c dùngcho m t s tìm ki m nút y thành công chính là chi u dàil i i c a nút y.
T ng t t c chi u dài l i i c a m i nút trên cây nh phânc g i là chi u dài l i i c a cây nh phân.
15
Ch ng minh (tt.)
Khi chia chi u dài l i i toàn cây v i N, ta s c s so sánhtrung bình i v i m t s tìm ki m thành công trên cây.Nh ng n u CN bi u th chi u dài l i i trung bình c a toàncây, ta có m t h th c truy h i sau ây, v i C1 = 1
N
1
(Ck-1 + CN-k)CN = N +
S h ng N là do s ki n nút r óng góp 1 vào chi u dài l i ic a m i nút.S h ng th hai là do s ki n khóa t i nút r có xác xu t b ngnhau tr thành ph n t l n th k trong cây, v i hai cây conl n l t ch a k-1 nút và N-k.
16
Ch ng minh (tt.)k
k-1N-k
H th c truy h i này r t gi ng h th c truy h i khi phântích Quicksort, và nó ã c gi i cùng m t cách al i cùng m t k t qu .Do ó chi u dài trung bình c a cây N nút làCN 2N lnN.Suy ra chi u dài trung bình c a m t nút trong cây là2lnN.
M t tác v tìm ki m hay thêm vào òi h i trung bình2lnN so sánh trên m t cây g m N nút.
17
ph c t p trong tr òng h p x u nh t
Tính ch t: Trong tr ng h p x u nh t, m t tác v tìmki m trên cây nh phân g m N khóa có th c n N sosánh.Tr ng h p x u nh t x y ra khi cây nh phân b suy bi nthành m t danh sách liên k t.Tác v xóa
Vi c xoá m t nút r t d n u nút y không có nút con hay chcó m t nút con.
xóa m t nút có hai con thì khá ph c t p: ta ph i thayth nó v i nút có tr khóa cao nh t k ti p (t c nút t n cùngtrái c a cây con bên ph i).
18
Thí d : Tác vxoá
E
C
R
H
L
N
M F
A
R
C N
M
A
P
H
L
19
The following procedure is to delete the node t from the binarytree x.
procedure treedelete (t, x: link);var p, c: link;begin
repeat /* search for the node t in the tree */p: = x;
if t.key < z. key then x: = x.1else x: = x.runtil x = t;if t.r = z then /* the node t has no right child */
x: = x.1 /* replace the deleted node with the left child oft */else if t.r.1 = then /* the right chile of t has no left child */begin x: = x.r; x.1: = t.1 end /* replace the deleted node with its right child */
20
elsebegin
e: = x.r;while c.1.1 <> z do c: = x.1; /* find the leftmost node
of the right subtree */x: = c.1; /* x denotes the node that will replace the
deleted one */c.1 = x.r; /* connect c, the parent of x to the right
child of x */x.1: = t.1; x.r: = t.r /* connect x: the children of the
deleted node t */end;if t.key < p.key then p.1: = x /* connect x to the parentof the deleted node */else p.r: = x;
end;
21
3. Hàng i có u tiên và gi i thu t s pth t HEAPSORT
M t c u trúc d li u mà h tr ít nh t hai tác v :+ thêm m t ph n t m i vào c u trúc+ xóa b ph n t l n nh t
c g i là hàng i có u tiên (a priority-queue).
Hàng i có u tiên khác v i hàng i thông th ngi m khi l y ph n t ra kh i hàng i thì ó không ph i là
ph n t c nh t trong hàng i mà là ph n t có u tiênl n nh t trong hàng i.
22
Hàng i có u tiên (tt.)
Chúng ta mu n xây d ng và duy trì m t c u trúc d li u ch a nh ngm u tin có tr khóa s ( u tiên) và có h tr m t s trong nh ngtác v sau:- t o m t hàng i có th t u tiên g m N ph n t .- thêm (insert ) m t ph n t m i vào.- xóa b ph n t l n nh t ra kh i hàng i.- thay th ph n t l n nh t v i m t ph n t m i
- thay i u tiên c a m t ph n t .- Xóa b m t ph n t b t k nào ó.- Ghép hai hàng i có u tiên thành m t hàng i có u tiênl n h n.
23
Thi công hàng i có u tiên
Hàng i có u tiên nh ã mô t là m t ví d v ki u d li u tr ut ng ã nói ch ng 1. Có hai cách thi công hàng i có
u tiên:1. Dùng m ng thi công hàng i có u tiên (Cách này thì n
gi n khi thêm vào m t ph n t m i nh ng khi xóa b ph n t cóu tiên l n nh t ra kh i hàng i thì ph c t p s cao.)
2. Dùng c u trúc d li u heap.
24
C u trúc d li u heap
C u trúc d li u mà có th h tr cho các tác v làm vi c v ihàng i có u tiên s ch a các m u tin trong m t m ngsao cho:
m i khóa ph i l n h n khóa hai v trí khác trong m ng.T ng t m i khóa trong hai khóa này ph i l n h n hai trkhóa khác và c nh th ..
Th t này s d th y h n khi ta di n t m ng nh m t c utrúc cây v i nh ng ng n i m i khóa xu ng hai khóanh h n.
Các tr khóa trong c u trúc cây th a i u ki n heap nh sau:Khóa t i m i nút c n ph i l n h n (hay b ng) các khóa
hai con c a nó (n u có). i u này hàm ý r ng tr khóa l nnh t nút r .
25
Thí d : Heap d i d ng cây nh phân
X
T O
G
A
SM
R AE
N
I
26
Heap d i d ng m t m ng
Ta có th di n t d ng cây c a heap thành m t m ng b ngcách t nút r t i v trí 1 c a m ng, các con c a nó t i v trí 2và 3, các nút các m c k ti p các v trí 4, 5, 6 và 7, v.v..
k 1 2 3 4 5 6 7 8 9 10 11 12a[k] X T O G S M N A E R A I
T m t nút d dàng i t i nút cha và các nút con c a nó.
Cha m t nút v trí j s là nút v trí j div 2.Hai con c a m t nút v trí j s các v trí 2jvà 2j+1.
27
Các l i i trên heap
M t heap là m t cây nh phân, c di n t nh làm t m ng trong ó m i nút th a mãn i u ki nheap. c bi t, ph n t có khóa l n nh t luôn vtrí th nh t c a m ng.
T t c các gi i thu t làm vi c trên heap i d c theom t l i i nào ó t nút r xu ng m c áy (bottom)c a heap.
Trong m t heap có N nút, t t c các l i i (path)th ng có lgN nút trên ó.
28
Các gi i thu t trên Heap
Có hai tác v quan tr ng làm vi c trên heap: thêm vàoph n t m i và xóa b ph n t l n nh t ra kh i heap.
Tác v này s làm t ng kích th c c a heap lên thêmm t ph n t . N c t ng thêm 1.Và ph n t m i c t vào t i v trí a[N], nh ng lúcó i u ki n heap có th s b vi ph m.
N u i u ki n heap b vi ph m, nó s c kh c ph cb ng cách hoán i ph n t m i v i cha c a nó. i unày l i có th gây ra vi ph m i u ki n heap và nó s
c kh c ph c ti p v i cùng m t cách t ng t .
1. Tác v thêm vào (insert)
29
Tác v thêm vào
procedure upheap(k:integer)var v: integer;begin
v :=a[k]; a[0]:= maxint;while a[k div 2] <= v dobegin a[k]:= a[k div 2 ]; k:=k div 2 end;
a[k]:= vend;procedure insert(v:integer);begin
N:= N+1; a[N] := v ; unheap(N)end;
30
Thêm (P) vào heap
X
T P
G
A
SO
R AE
N
I M
31
Tác v xóa b ph n t l n nh t
Tác v xóa s làm gi m kích th c c a heap m t n v ,t c nó làm gi m N m t n v .
Nh ng ph n t l n nh t (t c a[1]) s c xóa b và cthay th b ng ph n t mà ã v trí a[N]. N u tr khóa t inút r quá nh , nó ph i c di chuy n xu ng th a mãn
i u ki n heap.
Th t c downheap th c hi n vi c di chuy n ph n t angnút r xu ng b ng cách hoán i nút v trí k v i nút
l n h n trong hai nút con c a nó, n u c n và d ng l i khinút k l n h n hai nút con c a nó.
32
Tác v xóa b
procedure downheap(k: integer);label 0 ;var j, v : integer;begin
v:= a[k];while k<= N div 2 dobegin
j:= 2*k;if j < N then if a[j] < a[j+1] then
j:=j+1;if v >= a[j] then go to 0;a[k]:= a[j]; k:= j;
end;0: a[k]: =vend;
function remove: integer;begin
remove := a[1];a[1] := a[N]; N := N-1;downheap(1);
end;
33
Thí d v tác v xóa
T
S P
G
A
RO
C AE
N
I M
Tr c khi xóa
34
Sau khi xóa
S
R P
G
A
MO
C AE
N
I
35
Tính ch t c a các tác v trên heap
Tính ch t 3.1: M i tác v thêm vào, xóa b ,downheap, upheap dòi h i ít h n 2lgN so sánh khith c hi n trên m t heap g m N ph n t .
T t c nh ng tác v này ph i i d c theo m t l i i gi anút r cho n cu i heap mà bao g m ít h n lgN ph n tv i m t heap g m N ph n t .
Th a s 2 là do tác v downheap mà c n hai thao tác sosánh trong vòng l p trong và các thao tác khác ch òi h ilgN l n so sánh.
36
Gi i thu t heapsort
Ý t ng: Gi i thu t bao g m 2 công tác (1) t o m t heapch a nh ng ph n t c n s p th t và (2) l n l t l ychúng ra kh i heap theo m t th t .
M : kích th c c a heapN: s ph n t c n c s p th t .
N:=0;for k:= 1 to M do
insert(a[k]); /* construct the heap */for k:= M downto 1 do
a[k]:= remove; /*putting the element removed into thearray a */
37
S p th t dãy s 5, 3, 1, 9, 8, 2, 11 b ng heapsort
11
8 9
3 5 1 2
5
3 1
9
5
3
1
9
8
3
1
5
9
8
3
2
5 1
38
9
8
3
2
5 1 11
8
5
3
2
1
5
3
1
2
3
1 2
2
1
1
9 11
8 911
58 9
11
3
58
9 11
2 3
5 8 9 11
39
ph c t p c a heap sort
Tính ch t: Heapsort dùng ít h n 3MlgM l n sosánh s p th t M ph n t .
Gi i h n trên này xu t phát t gi i thu t heapsortvà tính ch t c a hai tác v thêm vào/xóa b trênheap.Vòng for th nh t t n MlgM l n so sánh.Vòng for th hai t n 2MlgM l n so sánh.T ng c ng:
MlgM + 2MlgM = 3MlgM
40
4.K thu t b m
K thu t b m (Hashing) là m t ph ng pháp tìm ki m cácm u tin trong m t b ng b ng các bi n i các tr khóa thànhnh ng a ch (v trí) trong b ng.
B c u là t o m t hàm b m (hash function ) mà chuy n ikhóa tìm ki m thành m t a ch trong b ng.
M t cách lý t ng, nh ng tr khóa khác nhau nên ánh xthành nh ng a ch khác nhau, nh ng không có hàm b m nàolà hoàn h o và do ó hai hay nhi u khóa khác nhau có th b mthành cùng m t v trí b ng.
B c k ti p là quá trình gi i quy t ng (collision-resolution) mà i phó v i tr ng h p hai hay nhi u khóakhác nhau có th b m thành cùng m t v trí b ng.
41
Hàm b m
Hàm b m là hàm bi n th các tr khóa thành nh ng snguyên trong t m [0 .. M-1], v i M là s m c tin mà có th
c ch a trong m t s l ng ô nh có s n.
M t hàm b m lý t ng là hàm b m mà- d tính toán- g n gi ng nh m t hàm “ng u nhiêm”.
M t ph ng pháp thông th ng nh t b m là cho M làm t s nguyên t và v i m i tr khóa k, ta tính
h(k): = k mod M
y là m t ph ng pháp tr c ti p mà d tính và r i kháu các tr khóa ra trên b ng b m.
42
Ví dKích th c b ng b m = 101. Gi s m i tr khóa g m 4 kýt . N u khóa (“AKEY”) c mã hóa thành m t mã g m 5bit, ta có th coi khóa y là m t tràng s nh ph n nh sau:
00001 01011 00101 110011 × 323 + 11 x 322 + 5 x 321 + 25 x 320
Mà t ng ng v i tr s th p phân 44217 .Vì, 44217 mod 101 = 80, nh v y khóa “AKEY” ánh xthành 80.
T i sao kích th c M c a b ng b m c n ph i là s nguyênt ? Lý do là vì chúng ta mu n t t c m i ký t trong khóa
u tham gia vào vi c chuy n i (b m) thành v trí.
Trong thí d trên, n u M = 32, hàm b m c a b t k khóanào c ng ch b m m i ký t sau cùng!
43
B m m t khóa dài
N u khóa là m t dòng ký t khá dài thì chúng ta v n có thtính b ng m t hàm b m mà bi n i khóa t ng ký t m t.K thu t ó th hi n b ng gi i thu t l p nh sau:
h:= key[1];for j:= 2 to key_size dobegin
h:= ((h*32) + key[j]) mod M; /*25 is 32, used for5-bit code */
end;
44
Ph ng pháp gi i quy t ng : Xâu riêng(Separate chaining)Trong k thu t b m, chúng ta ph i quy t nh dùng cáchnào gi i quy t v n hai khóa khác nhau b m thànhcùng m t giá tr a ch .M t ph ng pháp n gi n nh t: t o cho m i v trí trongb ng b m m t danh sách liên k t (xâu riêng) xâu t t cnh ng tr khóa mà b m vào cùng v trí ó.Khi các tr khóa c xâu trên danh sách liên k t, chúngnên c s p cho có th t .
type link = node;node = record key, info: integer;
next: link end;var heads: array [0..M] of link; t, x: link;
45
Xâu riêng (tt.)Danh sách liên k t cho t ng v trí trong b ng b m c kh it o nh gi i thu t sau:
procedure initialize;var i: integer;begin
new (z); z.next: = z;for i: = 0 to M-1 dobegin
new (heads [i]); heads [i].next: = zend;
end;Trong hình v sau trình bày vi c a vào b ng b m m t dãycác ký t ch .
46
Key: A S E A R C H I N G E X A M P L EHash: 1 8 5 1 7 3 8 9 3 7 5 2 1 2 5 1 5
A
A
A
L
M
X
C
N E
E
E
P
G
R
H
S
I
0 1 2 3 4 5 6 7 8 9 10
47
Ph ng pháp gi i quy t ng : Dò tuy n tính
Ph ng pháp xâu riêng có th áp d ng trong tr ng h pM < N (M: kích th c b ng b m, N: s tr khóa có th có)
Có m t s ph ng pháp l u N m u tin trong b ng b m cókích th c M mà M > N, nh vào nh ng v trí tr ng trongb ng b m gi i quy t ng . Nh ng ph ng pháp nhv y c g i là k thu t b m a ch m (open addressinghashing).
Ph ng pháp a ch m n gi n nh t là ph ng phápdò tuy n tính ( linear probing): m i khi có ng thì dò nv trí k ti p trong b ng b m, t c là so sánh tr khóa c n tìmv i tr khóa t i m u tin.
48
Dò tuy n tính (tt.)
Có ba k t qu có th có c a s th m dò:- N u hai tr khóa kh p nhau thì s tìm ki m k t thúc thànhcông.- N u không th y có m u tin t i v trí, thì s tìm ki m k t thúcth t b i.- Ng c l i, dò tìm t i v trí k ti p, ti p t c nh th cho n khitìm th y tr khóa kh p nhau ho c là m t v trí r ng.
49
Gi i thu t dò tuy n tínhprocedure hash_initialize;var i: integer;begin
for i: = 0 to M do a[i].key:= maxint; /* maxint means an emptyposition */end;function hash_search(v: integer): integer;var x: integer;begin
x: = h(v);while a[x].key <> maxit and a[x].key <> v dox: = (x+1) mod M;if a[x].key: = v then hash_search: = xelse hash_search: = M;
end;
50
Dò tuy n tính (tt.)
function hash_insert (v: integer): integer;var x: intergerbegin
x:= h(v);while a[x].key <> maxint do /* collision */x: = (x+1) mod M;a[x].key: = v; hash-insert: = x;
end;
Hình v sau trình bày vi c a vào b ng b m m t dãy các kýt ch : A S E A R C H I N G E X A M P L E
51
Key: A S E A R C H I N G E X A M P L EHash: 1 0 5 1 18 3 8 9 14 7 5 5 1 13 16 12 5
R
P
N
M
L
E
X
I
H
G
E
E
A
C
A
A
S
52
Tính ch t c a dò tuy n tính
Kích th c b ng b m dùng cho k thu t dò tuy n tínhth ng l n h n b ng b m dùng xâu riêng, vì ta ph i cóM > N, nh ng t ng ch b nh s ít h n vì không c n l ucác con tr .
Tính ch t. Dò tuy n tính s d ng trung bình ít h n 5 b c dòi v i m t b ng b m y d i 2/3.
Công th c chính xác v s l n dò trung bình c n cho m t stìm ki m không thành công là:
½ + 1/(2*(1- )2) v i = N/M
N u = 2/3, ta c k t qu 5 b c dò.