Ch
ng 3
Phân tích
ph c t p m t s
gi i thu t trên c u trúc d li u
1
N i dung
1. Tìm ki m tu n t trên danh s ch liên k t
2. Cây tìm ki m nh phân
u tiên và heapsort
3. Hàng i có
4. K thu t b m
2
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 c
hi n th ng qua vi c d ng danh s ch liên k t (linked
list) 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 t
mà giúp cho vi c tìm ki m nhanh chóng h n.
3
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.
3
4
7
21
Z
…
type link = ↑ node
node = record key, info: integer;
next: link
end;
var head, t, z: link;
i: integer;
4
Gi i thu t tìm ki m tu n t trên danh s ch
liê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:= t
else listsearch: = z
end;
5
Gi i thu t tìm ki m tu n t trên danh s ch liên
k t t.)
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 c
s tìm ki m thành cơng hay khơng thành.
6
Ch ng minh:
V i s tìm ki m thành c ng, n u gi s r ng m i m u tin
trong 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 u
tin trong danh sách liên k t hay nút k t thúc z có xác xu t
b ng nhau (1/(N+1))
c tìm th y v trí sau c ng c a
quá 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.
7
2.Cây tìm ki m nh phân
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ét
thì 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 ang
xét thì cây con bên ph i c a nút.
10
13
2
7
19
8
Kh i t o cây nh phân
M t cây r ng
tr bên ph i ch
c bi u di n b ng cây có con
n nút gi z.
procedure tree_init;
begin
new(z); z↑.1: = z; z↑.r: = z;
new(head); head↑.key: = 0; head↑.r: = z;
end;
9
T c v thêm vào
Thêm m t nút vào trong c y ta th c hi n m t s t m
nút y trên c y, r i g n nút
ki m kh ng thành c
y vào v trí ng v i nút gi z t i i m mà qu trình tìm
ki m k t thúc.
A
S
E
A
R
C
Hình v minh h a
vi c thêm nút P vào
cây nh phân.
H
10
T c v thêm vào
.)
procedure tree_insert (v: integer; x: link): link;
var p: link;
;
begin
repeat
p: = 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
11
In ra cây nh phân
procedure treeprint(x: kink)
begin
if x <> z then
begin
treeprint (x↑.1);
printnode (x);
treeprint (x↑.r)
end
end;
Vì m t cây nh phân di n t m t t p tin có th t , vi c in ra
các tr khóa trong cây theo m t cách úng n s em l i
m t danh sách các khóa có th t .
12
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 with
the key v in the binary search tree x */
begin
while v <> x↑. key and x <> z do
begin
if v < x↑.key then x: = x↑.1
else x: = x↑.r
end;
treesearch: = x
end;
13
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 nh
phân òi h i ch ng 2lnN so sánh trên m t cây
c t o ra t N
tr khóa ng u nhiên.
Ch ng minh:
Chi u dài l i i c a
y v nút r
út: là s c nh c n duy t qua
t nút
i v i m i nút trên cây nh phân, s so sánh
c d ng
cho m t s tìm ki m nút y thành cơng chính là chi u dài
l 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ân
c g i là chi u dài l i i c a cây nh phân.
14
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ánh
trung 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 tồn
cây, ta có m t h th c truy h i sau ây, v i C1 = 1
N
CN = N +
∑
(Ck-1 + CN-k)
1
S h ng N là do s ki n nút r óng góp 1 vào chi u dài l i i
c 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 ng
nhau
tr thành ph n t l n th k trong cây, v i hai cây con
l n l t ch a k-1 nút và N-k.
15
Ch ng minh t.)
k
k
N
H th c truy h i này r t gi ng h th c truy h i khi phân
tích Quicksort, và nó ã
c gi i c ng m t c ch
a
l 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ình
2lnN so sánh trên m t cây g m N nút.
16
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ìm
ki m trên cây nh phân g m N khóa có th c n N so
sánh.
Tr ng h p x u nh t x y ra khi cây nh phân b suy bi n
thành m t danh sách liên k t.
Tác v xóa
Vi c xố m t nút r t d n u nút y khơng có nút con hay ch
có m t nút con.
xóa m t nút có
hai con thì khá ph c t p: ta ph i thay
th nó v i nút có tr khóa cao nh t k ti p
c nút t n c ng
trái c a cây con bên ph i).
17
E
A
R
C
H
N
M
F
L
Thí d : T c v
xo
H
A
R
C
N
M
P
L
18
The following procedure is to delete the node t from the binary
tree 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↑.1
else x: = x↑.r
until 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 of
t */
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 */
19
else
begin
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 parent
of the deleted node */
else p↑.r: = x;
end;
20
3. Hàng i có
u tiên và gi i thu t s p
th 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
óa b ph n t l n nh t
c g i là hàng i có
u tiên priority-queue).
Hàng i có
u tiên khác v i hàng i thông th ng
i m khi l y ph n t ra kh i hàng i thì ó khơng ph i là
u tiên
ph n t c nh t trong hàng i mà là ph n t c
l n nh t trong hàng i.
21
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 ng
m u tin có tr khóa s (
u tiên) và có h tr m t s trong nh ng
tác v sau:
- t o m t hàng i có th t u tiên g m N ph n t .
- thêm (inser 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ên
l n h n.
22
Thi c ng hàng
i có
u tiên
Hàng
t
1.
2.
i có
u tiên nh ã m t là m t ví d v ki u d li u tr u
ng ã nói ch ng 1. Có hai cách thi cơng hàng i có
u tiên:
D ng m ng
thi cơng hàng i có
u tiên á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.)
D ng c u trúc d li u heap.
23
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 i
u tiên s ch a các m u tin trong m t m ng
hàng i c
sao 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 tr
kh 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 u
ng n i m i khóa xu ng hai khóa
trúc cây v i nh ng
nh 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 n
nh t nút r .
24
Thí d : Heap d
i d ng cây nh phân
X
T
O
G
S
M
A
E
R
A
N
I
25