You are on page 1of 230

Gio trnh cu trc

d liu v gii thut



Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
MUC LUC
Muc Trang
CHNG 1: TONG QUAN VE CAU TRUC D LIEU & GT ...........3
1.1. Tam quan trong cua CTDL & GT trong mot e an tin hoc........................ 3
1.1.1. Xay d ng cau truc d lieu ......................................................................... 3
1.1.2. Xay d ng giai thuat ................................................................................... 3
1.1.3. Moi quan he gia cau truc d lieu va giai thuat ....................................... 3
1.2. anh gia Cau truc d lieu & Giai thuat ....................................................... 3
1.2.1. Cac tieu chua n a nh gia cau truc d lieu ................................................. 3
1.2.2. anh gia o phc tap cu a thuat toan........................................................ 4
1.3. Kieu d lieu..................................................................................................... 4
1.3.1. Khai nie m ve kieu d lieu.......................................................................... 4
1.3.2. Cac kieu d lieu c s ............................................................................... 4
1.3.3. Cac kieu d lieu co ca u truc...................................................................... 5
1.3.4. Kieu d lieu con tro ................................................................................... 5
1.3.5. Kieu d lieu tap tin.................................................................................... 5
Cau hoi va bai tap ................................................................................................. 6
CHNG 2: KY THUAT TM KIEM (Searching) .............................8
2.1. Khai quat ve tm kiem.................................................................................... 8
2.2. Cac giai thuat tm kiem noi ........................................................................... 8
2.2.1. at van e ................................................................................................. 8
2.2.2. Tm tuyen tnh............................................................................................ 8
2.2.3. Tm nh phan............................................................................................ 10
2.3. Cac giai thuat tm kiem ngoai ..................................................................... 14
2.3.1. at van e ............................................................................................... 14
2.3.2. Tm tuyen tnh.......................................................................................... 14
2.3.3. Tm kiem theo ch muc............................................................................. 16
Cau hoi va bai tap ............................................................................................... 17
CHNG 3: KY THUAT SAP XEP (SORTING) ............................. 19
3.1. Khai quat ve sap xep.................................................................................... 19
3.2. Cac giai thuat sap xep noi............................................................................ 19
3.2.1 Sap xep bang phng phap oi cho .......................................................... 20
3.2.2. Sap xep ba ng phng phap chon ............................................................. 28
3.2.3. Sap xep ba ng phng phap chen ............................................................. 33
3.2.4. Sap xep ba ng phng phap tro n .............................................................. 40
3.3. Cac giai thuat sap xep ngoai........................................................................ 60
3.3.1. Sap xep ba ng phng phap tro n .............................................................. 60
3.3.2. Sap xep theo ch muc............................................................................... 79
Cau hoi va bai tap ............................................................................................... 82
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 2
CHNG 4: DANH SACH (LIST)..................................................... 84
4.1. Khai niem ve danh sach ............................................................................... 84
4.2. Cac phep toan tren danh sach..................................................................... 84
4.3. Danh sach ac ............................................................................................... 85
4.3.1. nh ngha............................................................................................... 85
4.3.2. Bieu dien danh sa ch ac.......................................................................... 85
4.3.3. Cac thao tac tren danh sach ac ............................................................. 85
4.3.4. u nhc iem va ng dung ................................................................... 91
4.4. Danh sach lien ket ........................................................................................ 92
4.4.1. nh ngha............................................................................................... 92
4.4.2. Danh sach lien ket n ............................................................................ 92
4.4.3. Danh sach lien ket kep .......................................................................... 111
4.4.4. u nhc iem cua danh sach lien ket .................................................. 135
4.5. Danh sach han che ...................................................................................... 135
4.5.1. Hang i................................................................................................ 135
4.5.2. Ngan xep ............................................................................................... 142
4.5.3. ng dung cua danh sach han che .......................................................... 147
Cau hoi va bai tap ............................................................................................. 147
CHNG 5: CAY (TREE) ............................................................... 149
5.1. Khai niem Bieu dien cay......................................................................... 149
5.1.1. nh ngha cay ...................................................................................... 149
5.1.2. Mot so khai niem lien quan ................................................................... 149
5.1.3. Bieu dien cay......................................................................................... 151
5.2. Cay nh phan ............................................................................................... 152
5.2.1. nh ngha............................................................................................. 152
5.2.2. Bieu dien va Cac thao tac ..................................................................... 152
5.2.3. Cay nh phan tm kiem........................................................................... 163
5.3. Cay can bang............................................................................................... 188
5.3.1. nh ngha Cau truc d lieu............................................................... 188
5.3.2. Cac thao tac .......................................................................................... 189
Cau hoi va bai tap ............................................................................................. 227
ON TAP (REVIEW).......................................................................... 224
He thong lai cac Cau truc d lieu va cac Giai thuat a hoc.......................... 224
Cau hoi va Bai tap on tap tong hp................................................................. 227
TAI LIEU THAM KHAO................................................................. 229
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
By Ht thu c l c h i cho s c kh e at 9:19 pm, Jun 25, 2007
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 3
Chng 1: TONG QUAN VE CAU TRUC D LIEU VA GIAI THUAT
1.1. Tam quan trong cua cau truc d lieu va giai thuat trong mot
e an tin hoc
J.J.J. Xay uDQ cau tzuc u J1eu
Co the noi rang khong co mot chuong trnh may tinh nao ma khong co du lieu de xu ly.
Du lieu co the la du lieu dua vao (input data), du lieu trung gian hoac du lieu dua ra
(output data). Do vay, viec to chuc de luu tru du lieu phuc vu cho chuong trnh co y
nghia rat quan trong trong toan bo he thong chuong trnh. Viec xay dung cau truc du
lieu quyet dnh rat lon den chat luong cung nhu cong suc cua nguoi lap trnh trong viec
thiet ke, cai dat chuong trnh.
J.J.2. Xay uDQ Q1a1 tDuat
Khai niem giai thuat hay thuat giai ma nhieu khi con duoc goi la thuat toan dung de ch
phuong phap hay cach thuc (method) de giai quyet van de. Ciai thuat co the duoc minh
hoa bang ngon ngu tu nhien (natural language), bang so do (flow chart) hoac bang ma
gia (pseudo code). Trong thuc te, giai thuat thuong duoc minh hoa hay the hien bang
ma gia tua tren mot hay mot so ngon ngu lap trnh nao do (thuong la ngon ngu ma
nguoi lap trnh chon de cai dat thuat toan), chang han nhu C, Pascal,
Khi da xac dnh duoc cau truc du lieu thich hop, nguoi lap trnh se bat dau tien hanh
xay dung thuat giai tuong ung theo yeu cau cua bai toan dat ra tren co so cua cau truc
du lieu da duoc chon. e giai quyet mot van de co the co nhieu phuong phap, do vay
su lua chon phuong phap phu hop la mot viec ma nguoi lap trnh phai can nhac va tinh
toan. Su lua chon nay cung co the gop pha n dang ke trong viec giam bot cong viec
cua nguoi lap trnh trong phan cai dat thuat toan tren mot ngon ngu cu the.
J.J.. Ho1 QuaD De Q1ua cau tzuc u J1eu Va Q1a1 tDuat
Moi quan he giua cau truc du lieu va Ciai thuat co the minh hoa bang dang thuc:
Cau truc du lieu + Ciai thuat - Chuong trnh
Hhu vay, khi da co cau truc du lieu tot, nam vung giai thuat thuc hien th viec the hien
chuong trnh bang mot ngon ngu cu the ch la van de thoi gian. Khi co cau truc du lieu
ma chua tm ra thuat giai th khong the co chuong trnh va nguoc lai khong the co
Thuat giai khi chua co cau truc du lieu. Mot chuong trnh may tinh ch co the duoc hoan
thien khi co day du ca Cau truc du lieu de luu tru du lieu va Ciai thuat xu ly du lieu
theo yeu cau cua bai toan dat ra.
1.2. anh gia cau truc d lieu va giai thuat
J.2.J. Cac t1eu cDuaD daDD Q1a cau tzuc u J1eu
e danh gia mot cau truc du lieu chung ta thuong dua vao mot so tieu chi sau:
- Cau truc du lieu phai tiet kiem tai nguyen (bo nho trong),
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
By Ht thu c l c h i cho s c kh e at 9:19 pm, Jun 25, 2007
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 4
- Cau truc du lieu phai phan anh dung thuc te cua bai toan,
- Cau truc du lieu phai de dang trong viec thao tac du lieu.
J.2.2. aDD Q1a do pDuc tap cua tDuat toaD
Viec danh gia do phuc tap cua mot thuat toan qua khong de dang chut nao. O day,
chung ta ch muon uoc luong thoi gian thuc hien thuan toan T(n) de co the co su so
sanh tuong doi giua cac thuat toan voi nhau. Trong thuc te, thoi gian thuc hien mot
thuat toan con phu thuoc rat nhieu vao cac dieu kien khac nhu cau tao cua may tinh,
du lieu dua vao, , o day chung ta ch xem xet tren muc do cua luong du lieu dua vao
ban dau cho thuat toan thuc hien.
e uoc luong thoi gian thuc hien thuat toan chung ta co the xem xet thoi gian thuc hien
thuat toan trong hai truong hop:
- Trong truong hop tot nhat: Tmin
- Trong truong hop xau nhat: Tmax
Tu do chung ta co the uoc luong thoi gian thuc hien trung bnh cua thuat toan: Tavg
1.3. Kieu d lieu
J..J. KDa1 D1em Ve R1eu u J1eu
Kieu du lieu T co the xem nhu la su ket hop cua 2 thanh phan:
- Mien gia tr ma kieu du lieu T co the luu tru: V,
- Tap hop cac phep toan de thao tac du lieu: O.
T - <V, O>
Moi kieu du lieu thuong duoc dai dien boi mot ten (dnh danh). Moi phan tu du lieu co
kieu T se co gia tr trong mien V va co the duoc thuc hien cac phep toan thuoc tap hop
cac phep toan trong O.
e luu tru cac phan tu du lieu nay thuong phai ton mot so byte(s) trong bo nho, so
byte(s) nay goi la kich thuoc cua kieu du lieu.
J..2. Cac R1eu u J1eu co o
Hau het cac ngon ngu lap trnh deu co cung cap cac kieu du lieu co so. Tuy vao moi
ngon ngu ma cac kieu du lieu co so co the co cac ten goi khac nhau song chung quy
lai co nhung loai kieu du lieu co so nhu sau:
- Kieu so nguyen: Co the co dau hoac khong co dau va thuong co cac kich thuoc sau:
+ Kieu so nguyen T byte
+ Kieu so nguyen 2 bytes
+ Kieu so nguyen 4 bytes
Kieu so nguyen thuong duoc thuc hien voi cac phep toan: O - {+, -, *, /, DlV, MOD, <,
>, <-, >-, -, }
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 5
- Kieu so thuc: Thuong co cac kich thuoc sau:
+ Kieu so thuc 4 bytes
+ Kieu so thuc 6 bytes
+ Kieu so thuc 8 bytes
+ Kieu so thuc T0 bytes
Kieu so thuc thuong duoc thuc hien voi cac phep toan: O - {+, -, *, /, <, >, <-, >-, -, }
- Kieu ky tu: Co the co cac kich thuoc sau:
+ Kieu ky tu byte
+ Kieu ky tu 2 bytes
Kieu ky tu thuong duoc thuc hien voi cac phep toan: O - {+, -, <, >, <-, >-, -, OPD,
CHP, }
- Kieu chuoi ky tu: Co kich thuoc tuy thuoc vao tung ngon ngu lap trnh
Kieu chuoi ky tu thuong duoc thuc hien voi cac phep toan: O - {+, &, <, >, <-, >-, -,
Length, Trunc, }
- Kieu luan ly: Thuong co kich thuoc T byte
Kieu luan ly thuong duoc thuc hien voi cac phep toan: O - {HOT, AHD, OP, XOP, <, >,
<-, >-, -, }
J... Cac R1eu u J1eu co cau tzuc
Kieu du lieu co cau truc la cac kieu du lieu duoc xay dung tren co so cac kieu du lieu
da co (co the lai la mot kieu du lieu co cau truc khac). Tuy vao tung ngon ngu lap
trnh song thuong co cac loai sau:
- Kieu mang hay con goi la day: kich thuoc bang tong kich thuoc cua cac phan tu
- Kieu ban ghi hay cau truc: kich thuoc bang tong kich thuoc cac thanh phan (Field)
J..4. K1eu u J1eu coD tzo
Cac ngon ngu lap trnh thuong cung cap cho chung ta mot kieu du lieu dac biet de luu
tru cac da ch cua bo nho, do la con tro (Pointer). Tuy vao loai con tro gan (near
pointer) hay con tro xa (far pointer) ma kieu du lieu con tro co cac kich thuoc khac
nhau:
+ Con tro gan: 2 bytes
+ Con tro xa: 4 bytes
J..5. K1eu u J1eu tap t1D
Tap tin (File) co the xem la mot kieu du lieu dac biet, kich thuoc toi da cua tap tin tuy
thuoc vao khong gian dia noi luu tru tap tin. Viec doc, ghi du lieu truc tiep tren tap tin
rat mat thoi gian va khong bao dam an toan cho du lieu tren tap tin do. Do vay, trong
thuc te, chung ta khong thao tac truc tiep du lieu tren tap tin ma chung ta can chuyen
tung phan hoac toan bo noi dung cua tap tin vao trong bo nho trong de xu ly.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 6
Cau hoi va Bai tap
1. Trnh bay tam quan trong cua Cau truc du lieu va Ciai thuat doi voi nguoi lap trnh
2. Cac tieu chuan de danh gia cau truc du lieu va giai thuat
3. Khi xay dung giai thuat co can thiet phai quan tam toi cau truc du lieu hay khong
Tai sao
4. Liet ke cac kieu du lieu co so, cac kieu du lieu co cau truc trong C, Pascal
5. Su dung cac kieu du lieu co ban trong C, hay xay dung cau truc du lieu de luu tru
trong bo nho trong (RAM) cua may tinh da thuc co bac tu nhien n (0 n T00) tren
truong so thuc (a
i
, x R):
Voi cau truc du lieu duoc xay dung, hay trnh bay thuat toan va cai dat chuong trnh de
thuc hien cac cong viec sau:
- Hhap, xuat cac da thuc.
- Tinh gia tr cua da thuc tai gia tr x
0
nao do.
- Tinh tong, tich cua hai da thuc.
6. Tuong tu nhu bai tap 5. nhung da thuc trong truong so huu ty (cac he so a
i
va x la
cac phan so co tu so va mau so la cac so nguyen).
T. Cho bang gio tau di tu ga Saigon den cac ga nhu sau (ga cuoi la ga Ha noi):
TAU I S2 S4 S6 S8 S10 S12 S14 S16 S18 LH2 SN2
HAHH TPHH 32 gio 4T gio 4T gio 4T gio 4T gio 4T gio 4T gio 4T gio 4T gio 27gio T0g30
SAIGCN I 21g00 21g50 11g10 15g40 10g00 12g30 1Tg00 20g00 22g20 13g20 18g40
MUOHC MAH 2gT0 T5g2T T9g53 T4g07 T6g4T 2Tg04 TgT5 3gT6 T7g35 22g58
THAP CHAM 5g0T T8g06 22g47 T6g43 T9gT9 0g08 4g05 6g03 20gT9 2gT5
NHA TRANG 4g10 6g4T 20g00 0g4T 18g50 21g10 1g5T 5g42 8g06 22g46 5g15
TGY HOA 9g43 23g09 3g39 2Tg53 0gT9 5gTT 8g36 T0g50 2gT0
DIEU TR 8g12 11g49 1g20 5g46 0g00 2g30 Tg09 10g42 13g00 4g15
GAHC HCAl T5g4T 4g55 9g24 3g24 5g55 TTg2T T4g35 T7g04 7g34
TAM KY 6gTT T0g39 4g38 7gT0 T2g40 T6g08 T8g2T 9g03
A NANG 13g2T 19g04 8g29 12g20 6g19 9g26 14g41 1Tg43 20g1T 10g53
HUE 16g21 22g42 12g29 15g4T 11g12 14g32 18g13 21g14 23g50 15g10
OHC HA 0gT4 T3g52 T7gT2 T2g42 T6g05 T9g38 22g39 Tg25
OHC HOl T9gT5 2g27 T5g52 T9g46 T4g4T T7g59 2Tg38 0g52 3g28
VINH 23g21 Tg45 21g00 1g08 20g12 23g50 2g59 Tg0T 9g20
THAHH HOA T0g44 0g0T 4g33 23g09 3g33 6g39 9g59 T2g20
HlHH BHH T2g04 Tg28 5g54 0g3T 4g50 7g57 TTgT2 T3g5T
HAM |HH T2g37 2g0T 6g26 Tg24 5g22 8g29 TTg44 T4g25
PHG LY T3g23 2g42 7g08 2g02 6g00 9g09 T2g23 T5g06
EN HA NCI 5g00 14g40 4g00 8g30 3g15 Tg10 10g25 13g45 16g20
Su dung cac kieu du lieu co ban, hay xay dung cau truc du lieu thich hop de luu tru
bang gio tau tren vao bo nho trong va bo nho ngoai (disk) cua may tinh.
Voi cau truc du lieu da duoc xay dung o tren, hay trnh bay thuat toan va cai dat
chuong trnh de thuc hien cac cong viec sau:
- Xuat ra gio den cua mot tau T
0
nao do tai mot ga C
0
nao do.

=
=
n
i
i
i
x a x fn
0
) (
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 7
- Xuat ra gio den cac ga cua mot tau T
0
nao do.
- Xuat ra gio cac tau den mot ga C
0
nao do.
- Xuat ra bang gio tau theo mau o tren.
Luu y:
- Cac o trong ghi nhan tai cac ga do, tau nay khong di den hoac ch di qua ma
khong dung lai.
- Dong HAHH TPHH ghi nhan tong so gio tau chay tu ga Saigon den ga Ha noi.
8. Tuong tu nhu bai tap 7. nhung chung ta can ghi nhan them thong tin ve doan tau khi
dung tai cac ga ch de tranh tau hay de cho khach len/xuong (cac dong in nghieng
tng ng vi cac ga co khach len/xuong, cac dong khac ch dng e tranh tau).
9. Su dung kieu du lieu cau truc trong C, hay xay dung cau truc du lieu de luu tru trong
bo nho trong (PAM) cua may tinh trang thai cua cac cot den giao thong (co 3 den:
Xanh, o, Vang). Voi cau truc du lieu da duoc xay dung, hay trnh bay thuat toan va
cai dat chuong trnh de mo phong (minh hoa) cho hoat dong cua 2 cot den tren hai
tuyen duong giao nhau tai mot nga tu.
10. Su dung cac kieu du lieu co ban trong C, hay xay dung cau truc du lieu de luu tru
trong bo nho trong (RAM) cua may tinh trang thai cua mot ban co CAPO co kich
thuoc MH (0 M, H 20). Voi cau truc du lieu duoc xay dung, hay trnh bay thuat
toan va cai dat chuong trnh de thuc hien cac cong viec sau:
- ln ra man hnh ban co CAPO trong trang thai hien hanh.
- Kiem tra xem co ai thang hay khong Heu co th thong bao Ket thuc, neu khong
co th thong bao Tiep tuc.

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 8
Chng 2: KY THUAT TM KIEM (SEARCHING)
2.1. Khai quat ve tm kiem
Trong thuc te, khi thao tac, khai thac du lieu chung ta hau nhu luc nao cung phai thuc
hien thao tac tm kiem. Viec tm kiem nhanh hay cham tuy thuoc vao trang thai va trat
tu cua du lieu tren do. Ket qua cua viec tm kiem co the la khong co (khong tm thay)
hoac co (tm thay). Heu ket qua tm kiem la co tm thay th nhieu khi chung ta con phai
xac dnh xem v tri cua phan tu du lieu tm thay la o dau Trong pham vi cua chuong
nay chung ta tm cach giai quyet cac cau hoi nay.
Truoc khi di vao nghien cuu chi tiet, chung ta gia su rang moi phan tu du lieu duoc
xem xet co mot thanh phan khoa (Key) de nhan dien, co kieu du lieu la T nao do, cac
thanh phan con lai la thong tin (lnfo) lien quan den phan tu du lieu do. Hhu vay moi
phan tu du lieu co cau truc du lieu nhu sau:
typedef struct DataElement
{ T Key;
lnfoType lnfo;
} DataType;
Trong tai lieu nay, khi noi toi gia tr cua mot phan tu du lieu chung ta muon noi toi gia
tr khoa (Key) cua phan tu du lieu do. e don gian, chung ta gia su rang moi phan tu
du lieu ch la thanh phan khoa nhan dien.
Viec tm kiem mot phan tu co the dien ra tren mot day/mang (tm kiem noi) hoac dien
ra tren mot tap tin/ file (tm kiem ngoai). Phan tu can tm la phan tu can thoa man dieu
kien tm kiem (thuong co gia tr bang gia tr tm kiem). Tuy thuoc vao tung bai toan cu
the ma dieu kien tm kiem co the khac nhau song chung quy viec tm kiem du lieu
thuong duoc van dung theo cac thuat toan trnh bay sau day.
2.2. Cac giai thuat tm kiem noi (Tm kiem tren day/mang)
2.2.J. at VaD de
Cia su chung ta co mot mang M gom H phan tu. Van de dat ra la co hay khong phan tu
co gia tr bang X trong mang M Heu co th phan tu co gia tr bang X la phan tu thu
may trong mang M
2.2.2. T1m tuyeD t1DD (L1Deaz SeazcD,
Thuat toan tm tuyen tinh con duoc goi la Thuat toan tm kiem tuan tu (Sequential
Search).
a. T tng:
Lan luot so sanh cac phan tu cua mang M voi gia tr X bat dau tu phan tu dau tien
cho den khi tm den duoc phan tu co gia tr X hoac da duyet qua het tat ca cac phan
tu cua mang M th ket thuc.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 9
b. Thuat toan:
BT: k - T //Duyet tu dau mang
B2: lF M|k] X AHD k H //Heu chua tm thay va cung chua duyet het mang
B2.T: k++
B2.2: Lap lai B2
B3: lF k H
Tm thay tai v tri k
B4: ELSE
Khong tm thay phan tu co gia tr X
B5: Ket thuc
c. Cai at thuat toan:
Ham LinearSearch co prototype:
int LinearSearch (T M|], int H, T X);
Ham thuc hien viec tm kiem phan tu co gia tr X tren mang M co H phan tu. Heu tm
thay, ham tra ve mot so nguyen co gia tr tu 0 den H-T la v tri tuong ung cua phan
tu tm thay. Trong truong hop nguoc lai, ham tra ve gia tr T (khong tm thay). Hoi
dung cua ham nhu sau:
int LinearSearch (T M|], int H, T X)
{ int k - 0;
while (M|k] !- X && k < H)
k++;
if (k < H)
return (k);
return (-T);
}
d. Phan tch thuat toan:
- Truong hop tot nhat khi phan tu dau tien cua mang co gia tr bang X:
So phep gan: Cmin - T
So phep so sanh: Smin - 2 + T - 3
- Truong hop xau nhat khi khong tm thay phan tu nao co gia tr bang X:
So phep gan: Cmax - T
So phep so sanh: Smax - 2H+T
- Trung bnh:
So phep gan: Cavg - T
So phep so sanh: Savg - (3 + 2H + T) : 2 - H + 2
e. Cai tien thuat toan:
Trong thuat toan tren, o moi buoc lap chung ta can phai thuc hien 2 phep so sanh de
kiem tra su tm thay va kiem soat su het mang trong qua trnh duyet mang. Chung ta
co the giam bot T phep so sanh neu chung ta them vao cuoi mang mot phan tu cam
canh (sentinel/stand by) co gia tr bang X de nhan dien ra su het mang khi duyet
mang, khi do thuat toan nay duoc cai tien lai nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 10
BT: k - T
B2: M|H+T] - X //Phan tu cam canh
B3: lF M|k] X
B3.T: k++
B3.2: Lap lai B3
B4: lF k < H
Tm thay tai v tri k
B5: ELSE //k - H song do ch la phan tu cam canh
Khong tm thay phan tu co gia tr X
B6: Ket thuc
Ham LinearSearch duoc viet lai thanh ham LinearSearchT nhu sau:
int LinearSearchT (T M|], int H, T X)
{ int k - 0;
M|H] - X;
while (M|k] !- X)
k++;
if (k < H)
return (k);
return (-T);
}
f. Phan tch thuat toan cai tien:
- Truong hop tot nhat khi phan tu dau tien cua mang co gia tr bang X:
So phep gan: Cmin - 2
So phep so sanh: Smin - T + T - 2
- Truong hop xau nhat khi khong tm thay phan tu nao co gia tr bang X:
So phep gan: Cmax - 2
So phep so sanh: Smax - (H+T) + T - H + 2
- Trung bnh:
So phep gan: Cavg - 2
So phep so sanh: Savg - (2 + H + 2) : 2 - H/2 + 2
- Hhu vay, neu thoi gian thuc hien phep gan khong dang ke th thuat toan cai tien se
chay nhanh hon thuat toan nguyen thuy.
2.2.. T1m DD( pDaD (E1Dazy SeazcD,
Thuat toan tm tuyen tinh to ra don gian va thuan tien trong truong hop so phan tu cua
day khong lon lam. Tuy nhien, khi so phan tu cua day kha lon, chang han chung ta tm
kiem ten mot khach hang trong mot danh ba dien thoai cua mot thanh pho lon theo
thuat toan tm tuan tu th qua thuc mat rat nhieu thoi gian. Trong thuc te, thong thuong
cac phan tu cua day da co mot thu tu, do vay thuat toan tm nh phan sau day se rut
ngan dang ke thoi gian tm kiem tren day da co thu tu. Trong thuat toan nay chung ta
gia su cac phan tu trong day da co thu tu tang (khong giam dan), tuc la cac phan tu
dung truoc luon co gia tr nho hon hoac bang (khong lon hon) phan tu dung sau no.
Khi do, neu X nho hon gia tr phan tu dung o giua day (M|Mid]) th X ch co the tm
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 11
thay o nua dau cua day va nguoc lai, neu X lon hon phan tu M|Mid] th X ch co the tm
thay o nua sau cua day.
a. T tng:
Pham vi tm kiem ban dau cua chung ta la tu phan tu dau tien cua day (First - T)
cho den phan tu cuoi cung cua day (Last - H).
So sanh gia tr X voi gia tr phan tu dung o giua cua day M la M|Mid].
Heu X - M|Mid]: Tm thay
Heu X < M|Mid]: Put ngan pham vi tm kiem ve nua dau cua day M (Last - MidT)
Heu X > M|Mid]: Put ngan pham vi tm kiem ve nua sau cua day M (First - Mid+T)
Lap lai qua trnh nay cho den khi tm thay phan tu co gia tr X hoac pham vi tm
kiem cua chung ta khong con nua (First > Last).
b. Thuat toan e quy (Recursion Algorithm):
BT: First - T
B2: Last - H
B3: lF (First > Last) //Het pham vi tm kiem
B3.T: Khong tm thay
B3.2: Thuc hien Bkt
B4: Mid - (First + Last)/ 2
B5: lF (X - M|Mid])
B5.T: Tm thay tai v tri Mid
B5.2: Thuc hien Bkt
B6: lF (X < M|Mid])
Tm de quy tu First den Last - Mid T
B7: lF (X > M|Mid])
Tm de quy tu First - Mid + T den Last
Bkt: Ket thuc
c. Cai at thuat toan e quy:
Ham BinarySearch co prototype:
int BinarySearch (T M|], int H, T X);
Ham thuc hien viec tm kiem phan tu co gia tr X trong mang M co H phan tu da co
thu tu tang. Heu tm thay, ham tra ve mot so nguyen co gia tr tu 0 den H-T la v tri
tuong ung cua phan tu tm thay. Trong truong hop nguoc lai, ham tra ve gia tr T
(khong tm thay). Ham BinarySearch su dung ham de quy PecBinarySearch co
prototype:
int PecBinarySearch(T M|], int First, int Last, T X);
Ham PecBinarySearch thuc hien viec tm kiem phan tu co gia tr X tren mang M
trong pham vi tu phan tu thu First den phan tu thu Last. Heu tm thay, ham tra ve
mot so nguyen co gia tr tu First den Last la v tri tuong ung cua phan tu tm thay.
Trong truong hop nguoc lai, ham tra ve gia tr T (khong tm thay). Hoi dung cua cac
ham nhu sau:

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 12
int PecBinarySearch (T M|], int First, int Last, T X)
{ if (First > Last)
return (-T);
int Mid - (First + Last)/2;
if (X -- M|Mid])
return (Mid);
if (X < M|Mid])
return(PecBinarySearch(M, First, Mid T, X));
else
return(PecBinarySearch(M, Mid + T, Last, X));
}
//-------------------------------------------------------
int BinarySearch (T M|], int H, T X)
{ return (PecBinarySearch(M, 0, H T, X));
}
d. Phan tch thuat toan e quy:
- Truong hop tot nhat khi phan tu o giua cua mang co gia tr bang X:
So phep gan: Cmin - T
So phep so sanh: Smin - 2
- Truong hop xau nhat khi khong tm thay phan tu nao co gia tr bang X:
So phep gan: Cmax - log
2
H + T
So phep so sanh: Smax - 3log
2
H + T
- Trung bnh:
So phep gan: Cavg - log
2
H + T
So phep so sanh: Savg - (3log
2
H + 3)
e. Thuat toan khong e quy (Non-Recursion Algorithm):
BT: First - T
B2: Last - H
B3: lF (First > Last)
B3.T: Khong tm thay
B3.2: Thuc hien Bkt
B4: Mid - (First + Last)/ 2
B5: lF (X - M|Mid])
B5.T: Tm thay tai v tri Mid
B5.2: Thuc hien Bkt
B6: lF (X < M|Mid])
B6.T: Last - Mid T
B6.2: Lap lai B3
B7: lF (X > M|Mid])
B7.T: First - Mid + T
B7.2: Lap lai B3
Bkt: Ket thuc
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 13
f. Cai at thuat toan khong e quy:
Ham HPecBinarySearch co prototype: int HPecBinarySearch (T M|], int H, T X);
Ham thuc hien viec tm kiem phan tu co gia tr X trong mang M co H phan tu da co
thu tu tang. Heu tm thay, ham tra ve mot so nguyen co gia tr tu 0 den H-T la v tri
tuong ung cua phan tu tm thay. Trong truong hop nguoc lai, ham tra ve gia tr T
(khong tm thay). Hoi dung cua ham HPecBinarySearch nhu sau:
int HPecBinarySearch (T M|], int H, T X)
{ int First - 0;
int Last - H T;
while (First <- Last)
{ int Mid - (First + Last)/2;
if (X -- M|Mid])
return(Mid);
if (X < M|Mid])
Last - Mid T;
else
First - Mid + T;
}
return(-T);
}
g. Phan tch thuat toan khong e quy:
- Truong hop tot nhat khi phan tu o giua cua mang co gia tr bang X:
So phep gan: Cmin - 3
So phep so sanh: Smin - 2
- Truong hop xau nhat khi khong tm thay phan tu nao co gia tr bang X:
So phep gan: Cmax - 2log
2
H + 4
So phep so sanh: Smax - 3log
2
H + T
- Trung bnh:
So phep gan: Cavg - log
2
H + 3.5
So phep so sanh: Savg - (3log
2
H + 3)
h. V du:
Cia su ta co day M gom T0 phan tu co khoa nhu sau (H - T0):
T 3 4 5 8 T5 T7 22 25 30
- Truoc tien ta thuc hien tm kiem phan tu co gia tr X - 5 (tm thay):
Lan lap First Last First > Last Mid M|Mid] X -
M|Mid]
X <
M|Mid]
X >
M|Mid]
Ban dau 0 9 False 4 8 False True False
T 0 3 False T 3 False False True
2 2 3 False 2 4 False False True
3 3 3 False 3 5 True

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 14
Ket qua sau 3 lan lap (de quy) thuat toan ket thuc.
- Bay gio ta thuc hien tm kiem phan tu co gia tr X - 7 (khong tm thay):
Lan lap First Last First > Last Mid M|Mid] X -
M|Mid]
X <
M|Mid]
X >
M|Mid]
Ban dau 0 9 False 4 8 False True False
T 0 3 False T 3 False False True
2 2 3 False 2 4 False False True
3 3 3 False 3 5 False False True
4 4 3 True

Ket qua sau 4 lan lap (de quy) thuat toan ket thuc.
Luu y:
Thuat toan tm nh phan ch co the van dung trong truong hop day/mang da co
thu tu. Trong truong hop tong quat chung ta ch co the ap dung thuat toan tm
kiem tuan tu.
Cac thuat toan de quy co the ngan gon song ton kem bo nho de ghi nhan ma
lenh chuong trnh (moi lan goi de quy) khi chay chuong trnh, do vay co the
lam cho chuong trnh chay cham lai. Trong thuc te, khi viet chuong trnh neu co
the chung ta nen su dung thuat toan khong de quy.
2.3. Cac giai thuat tm kiem ngoai (Tm kiem tren tap tin)
2..J. at VaD de
Cia su chung ta co mot tap tin F luu tru H phan tu. Van de dat ra la co hay khong phan
tu co gia tr bang X duoc luu tru trong tap tin F Heu co th phan tu co gia tr bang X la
phan tu nam o v tri nao tren tap tin F
2..2. T1m tuyeD t1DD
a. T tng:
Lan luot doc cac phan tu tu dau tap tin F va so sanh voi gia tr X cho den khi doc
duoc phan tu co gia tr X hoac da doc het tap tin F th ket thuc.
b. Thuat toan:
BT: k - 0
B2: rewind(F) //Ve dau tap tin F
B3: read(F, a) //oc mot phan tu tu tap tin F
B4: k - k + sizeof(T) //V tri phan tu hien hanh (sau phan tu moi doc)
B5: lF a X AHD !(eof(F))
Lap lai B3
B6: lF (a - X)
Tm thay tai v tri k byte(s) tinh tu dau tap tin
B7: ELSE
Khong tm thay phan tu co gia tr X
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 15
B8: Ket thuc
c. Cai at thuat toan:
Ham FLinearSearch co prototype:
long FLinearSearch (char * FileHame, T X);
Ham thuc hien tm kiem phan tu co gia tr X trong tap tin co ten FileHame. Heu tm
thay, ham tra ve mot so nguyen co gia tr tu 0 den filelength(FileHame) la v tri
tuong ung cua phan tu tm thay so voi dau tap tin (tinh bang byte). Trong truong hop
nguoc lai, hoac co loi khi thao tac tren tap tin ham tra ve gia tr T (khong tm thay
hoac loi thao tac tren tap tin). Hoi dung cua ham nhu sau:
long FLinearSearch (char * FileHame, T X)
{ FlLE * Fp;
Fp - fopen(FileHame, rb);
if (Fp -- HGLL)
return (-T);
long k - 0;
T a;
int SOT - sizeof(T);
while (!feof(Fp))
{ if (fread(&a, SOT, T, Fp) -- 0)
break;
k - k + SOT;
if (a -- X)
break;
}
fclose(Fp);
if (a -- X)
return (k - SOT);
return (-T);
}
d. Phan tch thuat toan:
- Truong hop tot nhat khi phan tu dau tien cua tap tin co gia tr bang X:
So phep gan: Cmin - T + 2 - 3
So phep so sanh: Smin - 2 + T - 3
So lan doc tap tin: Dmin - T
- Truong hop xau nhat khi khong tm thay phan tu nao co gia tr bang X:
So phep gan: Cmax - H + 2
So phep so sanh: Smax - 2H + T
So lan doc tap tin: Dmax - H
- Trung bnh:
So phep gan: Cavg - (H + 5)
So phep so sanh: Savg - (3 + 2H + T) : 2 - H + 2
So lan doc tap tin: Davg - (H + T)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 16
2... T1m R1em tDeo cD1 muc (1De SeazcD,
Hhu chung ta da biet, moi phan tu du lieu duoc luu tru trong tap tin du lieu F thuong co
kich thuoc lon, dieu nay cung lam cho kich thuoc cua tap tin F cung kha lon. V vay
viec thao tac du lieu truc tiep len tap tin F se tro nen lau, chua ke su mat an toan cho
du lieu tren tap tin. e giai quyet van de nay, di kem theo mot tap tin du lieu thuong co
them cac tap tin ch muc (lndex File) de lam nhiem vu dieu khien thu tu truy xuat du
lieu tren tap tin theo mot khoa ch muc (lndex key) nao do. Moi phan tu du lieu trong
tap tin ch muc lDX gom co 2 thanh phan: Khoa ch muc va V tri vat ly cua phan tu du
lieu co khoa ch muc tuong ung tren tap tin du lieu. Cau truc du lieu cua cac phan tu
trong tap tin ch muc nhu sau:
typedef struct ldxElement
{ T ldxKey;
long Pos;
} ldxType;
Tap tin ch muc luon luon duoc sap xep theo thu tu tang cua khoa ch muc. Viec tao
tap tin ch muc lDX se duoc nghien cuu trong Chuong 3, trong phan nay chung ta xem
nhu da co tap tin ch muc lDX de thao tac.
a. T tng:
Lan luot doc cac phan tu tu dau tap tin lDX va so sanh thanh phan khoa ch muc voi
gia tr X cho den khi doc duoc phan tu co gia tr khoa ch muc lon hon hoac bang X
hoac da doc het tap tin lDX th ket thuc. Heu tm thay th ta da co v tri vat ly cua
phan tu du lieu tren tap tin du lieu F, khi do chung ta co the truy cap truc tiep den v
tri nay de doc du lieu cua phan tu tm thay.
b. Thuat toan:
BT: rewind(lDX)
B2: read(lDX, ai)
B3: lF ai.ldxKey < X AHD !(eof(lDX))
Lap lai B2
B4: lF ai.ldxKey - X
Tm thay tai v tri ai.Pos byte(s) tinh tu dau tap tin
B5: ELSE
Khong tm thay phan tu co gia tr X
B6: Ket thuc
c. Cai at thuat toan:
Ham lndexSearch co prototype:
long lndexSearch (char * ldxFileHame, T X);
Ham thuc hien tm kiem phan tu co gia tr X dua tren tap tin ch muc co ten
ldxFileHame. Heu tm thay, ham tra ve mot so nguyen co gia tr tu 0 den
filelength(FileHame)-T la v tri tuong ung cua phan tu tm thay so voi dau tap tin du
lieu (tinh bang byte). Trong truong hop nguoc lai, hoac co loi khi thao tac tren tap tin
ch muc ham tra ve gia tr T (khong tm thay). Hoi dung cua ham nhu sau:

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 17
long lndexSearch (char * ldxFileHame, T X)
{ FlLE * lDXFp;
lDXFp - fopen(ldxFileHame, rb);
if (lDXFp -- HGLL)
return (-T);
ldxType ai;
int SOlE - sizeof(ldxType);
while (!feof(lDXFp))
{ if (fread(&ai, SOlE, T, lDXFp) -- 0)
break;
if (ai.ldxKey >- X)
break;
}
fclose(lDXFp);
if (ai.ldxKey -- X)
return (ai.Pos);
return (-T);
}
d. Phan tch thuat toan:
- Truong hop tot nhat khi phan tu dau tien cua tap tin ch muc co gia tr khoa ch
muc lon hon hoac bang X:
So phep gan: Cmin - T
So phep so sanh: Smin - 2 + T - 3
So lan doc tap tin: Dmin - T
- Truong hop xau nhat khi moi phan tu trong tap tin ch muc deu co khoa ch muc
nho hon gia tr X:
So phep gan: Cmax - T
So phep so sanh: Smax - 2H + T
So lan doc tap tin: Dmax - H
- Trung bnh:
So phep gan: Cavg - T
So phep so sanh: Savg - (3 + 2H + T) : 2 - H + 2
So lan doc tap tin: Davg - (H + T)
Cau hoi va Bai tap
1. Trnh bay tu tuong cua cac thuat toan tm kiem: Tuyen tinh, Hh phan, Ch muc Cac
thuat toan nay co the duoc van dung trong cac truong hop nao Cho vi du
2. Cai dat lai thuat toan tm tuyen tinh bang cac cach:
- Su dung vong lap for,
- Su dung vong lap do while
Co nhan xet g cho moi truong hop
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 18
3. Trong truong hop cac phan tu cua day da co thu tu tang, hay cai tien lai thuat toan
tm tuyen tinh Cai dat cac thuat toan cai tien anh gia va so sanh giua thuat toan
nguyen thuy voi cac thuat toan cai tien.
4. Trong truong hop cac phan tu cua day da co thu tu giam, hay trnh bay va cai dat lai
thuat toan tm nh phan trong hai truong hop: e quy va Khong de quy
5. Van dung thuat toan tm nh phan, hay cai tien va cai dat lai thuat toan tm kiem dua
theo tap tin ch muc anh gia va so sanh giua thuat toan nguyen thuy voi cac thuat
toan cai tien
6. Su dung ham random trong C de tao ra mot day (mang) M co toi thieu T.000 so
nguyen, sau do chon ngau nhien (cung bang ham random) mot gia tr nguyen K. Van
dung cac thuat toan tm tuyen tinh, tm nh phan de tm kiem phan tu co gia tr K
trong mang M.
Voi cung mot du lieu nhu nhau, cho biet thoi gian thuc hien cac thuat toan.
T. Trnh bay va cai dat thuat toan tm tuyen tinh doi voi cac phan tu tren mang hai
chieu trong hai truong hop:
- Khong su dung phan tu Cam canh.
- Co su dung phan tu Cam canh.
Cho biet thoi gian thuc hien cua hai thuat toan trong hai truong hop tren.
8. Su dung ham random trong C de tao ra toi thieu T.000 so nguyen va luu tru vao mot
tap tin co ten SOHCGYEH.DAT, sau do chon ngau nhien (cung bang ham random)
mot gia tr nguyen K. Van dung thuat toan tm tuyen tinh de tm kiem phan tu co gia
tr K trong tap tin SOHCGYEH.DAT.
9. Thong tin ve moi nhan vien bao gom: Ma so la mot so nguyen duong, Ho va em
la mot choi co toi da 20 ky tu, Ten nhan vien la mot chuoi co toi da T0 ky tu,
Hgay, Thang, Ham sinh la cac so nguyen duong, Phai La Ham hoac Hu, He
so luong, Luong can ban, Phu cap la cac so thuc. Viet chuong trnh nhap vao danh
sach nhan vien (it nhat la T0 nguoi, khong nhap trung ma giua cac nhan vien voi
nhau) va luu tru danh sach nhan vien nay vao mot tap tin co ten HHAHSG.DAT, sau
do van dung thuat toan tm tuyen tinh de tm kiem tren tap tin HHAHSG.DAT xem co
hay khong nhan vien co ma la K (gia tr cua K co the nhap vao tu ban phim hoac
phat sinh bang ham random). Heu tm thay nhan vien co ma la K th in ra man hnh
toan bo thong tin ve nhan vien nay.
10. Voi tap tin du lieu co ten HHAHSG.DAT trong bai tap 9, thuc hien cac yeu cau sau:
- Tao mot bang ch muc theo Ten nhan vien.
- Tm kiem tren bang ch muc xem trong tap tin HHAHSG.DAT co hay khong nhan
vien co ten la X, neu co th in ra toan bo thong tin ve nhan vien nay.
- Luu tru bang ch muc nay vao trong tap tin co ten HSTEH.lDX.
- Van dung thuat toan tm kiem dua tren tap tin ch muc HSTEH.lDX de tm xem co
hay khong nhan vien co ten la X trong tap tin HHAHSG.DAT, neu co th in ra toan
bo thong tin ve nhan vien nay.
- Co nhan xet g khi thuc hien tm kiem du lieu tren tap tin bang cac phuong phap:
Tm tuyen tinh va Tm kiem dua tren tap tin ch muc.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 19
Chng 3: KY THUAT SAP XEP (SORTING)
3.1. Khai quat ve sap xep
e thuan tien va giam thieu thoi gian thao tac ma dac biet la de tm kiem du lieu de
dang va nhanh chong, thong thuong truoc khi thao tac th du lieu tren mang, tren tap
tin da co thu tu. Do vay, thao tac sap xep du lieu la mot trong nhung thao tac can thiet
va thuong gap trong qua trnh luu tru, quan ly du lieu.
Thu tu xuat hien du lieu co the la thu tu tang (khong giam dan) hoac thu tu giam
(khong tang dan). Trong pham vi chuong nay chung ta se thuc hien viec sap xep du
lieu theo thu tu tang. Viec sap xep du lieu theo thu tu giam hoan toan tuong tu.
Co rat nhieu thuat toan sap xep song chung ta co the phan chia cac thuat toan sap xep
thanh hai nhom chinh can cu vao v tri luu tru cua du lieu trong may tinh, do la:
- Cac giai thuat sap xep thu tu noi (sap xep thu tu tren day/mang),
- Cac giai thuat sap xep thu tu ngoai (sap xep thu tu tren tap tin/file).
Cung nhu trong chuong truoc, chung ta gia su rang moi phan tu du lieu duoc xem xet
co mot thanh phan khoa (Key) de nhan dien, co kieu du lieu la T nao do, cac thanh
phan con lai la thong tin (lnfo) lien quan den phan tu du lieu do. Hhu vay moi phan tu
du lieu co cau truc du lieu nhu sau:
typedef struct DataElement
{ T Key;
lnfoType lnfo;
} DataType;
Trong chuong nay noi rieng va tai lieu nay noi chung, cac thuat toan sap xep cua
chung ta la sap xep sao cho cac phan tu du lieu co thu tu tang theo thanh phan khoa
(Key) nhan dien. e don gian, chung ta gia su rang moi phan tu du lieu ch la thanh
phan khoa nhan dien.
3.2. Cac giai thuat sap xep noi (Sap xep tren day/mang)
O day, toan bo du lieu can sap xep duoc dua vao trong bo nho trong (PAM). Do vay, so
phan tu du lieu khong lon lam do gioi han cua bo nho trong, tuy nhien toc do sap xep
tuong doi nhanh. Cac giai thuat sap xep noi bao gom cac nhom sau:
- Sap xep bang phuong phap dem (counting sort),
- Sap xep bang phuong phap doi cho (exchange sort),
- Sap xep bang phuong phap chon lua (selection sort),
- Sap xep bang phuong phap chen (insertion sort),
- Sap xep bang phuong phap tron (merge sort).
Trong pham vi cua giao trnh nay chung ta ch trnh bay mot so thuat toan sap xep tieu
bieu trong cac thuat toan sap xep o cac nhom tren va gia su thu tu sap xep H phan tu
co kieu du lieu T trong mang M la thu tu tang.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 20
.2.J. Sap ep LaDQ pDuoDQ pDap do1 cDo (EcDaDQe Sozt,
Cac thuat toan trong phan nay se tm cach doi cho cac phan tu dung sai v tri (so voi
mang da sap xep) trong mang M cho nhau de cuoi cung tat ca cac phan tu trong mang
M deu ve dung v tri nhu mang da sap xep.
Cac thuat toan sap xep bang phuong phap doi cho bao gom:
- Thuat toan sap xep noi bot (bubble sort),
- Thuat toan sap xep lac (shaker sort),
- Thuat toan sap xep giam do tang hay do dai buoc giam dan (shell sort),
- Thuat toan sap xep dua tren su phan hoach (quick sort).
O day chung ta trnh bay hai thuat toan pho bien la thuat toan sap xep noi bot va sap
xep dua tren su phan hoach.
a. Thuat toan sap xep noi bot (Bubble Sort):
- Tu tuong:
+ i tu cuoi mang ve dau mang, trong qua trnh di neu phan tu o duoi (dung phia
sau) nho hon phan tu dung ngay tren (truoc) no th theo nguyen tac cua bot khi
phan tu nhe se b troi len phia tren phan tu nang (hai phan tu nay se duoc doi
cho cho nhau). Ket qua la phan tu nho nhat (nhe nhat) se duoc dua len (troi len)
tren be mat (dau mang) rat nhanh.
+ Sau moi lan di chung ta dua duoc mot phan tu troi len dung cho. Do vay, sau HT
lan di th tat ca cac phan tu trong mang M se co thu tu tang.
- Thuat toan:
BT: First - T
B2: lF (First - H)
Thuc hien Bkt
B3: ELSE
B3.T: Gnder - H
B3.2: lf (Gnder - First)
Thuc hien B4
B3.3: Else
B3.3.T: if (M|Gnder] < M|Gnder - T])
Swap(M|Gnder], M|Gnder T]) //oi cho 2 phan tu cho nhau
B3.3.2: Gnder--
B3.3.3: Lap lai B3.2
B4: First++
B5: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham BubbleSort co prototype nhu sau:
void BubbleSort(T M|], int H);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 21
Ham thuc hien viec sap xep H phan tu co kieu du lieu T tren mang M theo thu tu
tang dua tren thuat toan sap xep noi bot. Hoi dung cua ham nhu sau:
void BubbleSort(T M|], int H)
{ for (int l - 0; l < H-T; l++)
for (int J - H-T; J > l; J--)
if (M|J] < M|J-T])
Swap(M|J], M|J-T]);
return;
}
Ham Swap co prototype nhu sau:
void Swap(T &X, T &Y);
Ham thuc hien viec hoan v gia tr cua hai phan tu X va Y cho nhau. Hoi dung cua
ham nhu sau:
void Swap(T &X, T &Y)
{ T Temp - X;
X - Y;
Y - Temp;
return;
}
- V du minh hoa thuat toan:
Cia su ta can sap xep mang M co T0 phan tu sau (H - T0):
M: T5 T0 2 20 T0 5 25 35 22 30
Ta se thuc hien 9 lan di (H - T - T0 - T - 9) de sap xep mang M:
Lan T: First - T
J: 2 3 4 5 6 7 8 9 T0

M: T5 T0 2 20 T0 5 25 35 22 30

M: T5 T0 2 20 T0 5 25 22 35 30

M: T5 T0 2 20 T0 5 22 25 35 30

M: T5 T0 2 20 5 T0 22 25 35 30

M: T5 T0 2 5 20 T0 22 25 35 30

M: T5 2 T0 5 20 T0 22 25 35 30

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 22
M: 2 T5 T0 5 20 T0 22 25 35 30
Lan 2: First - 2
J: 3 4 5 6 7 8 9 T0

M: 2 T5 T0 5 20 T0 22 25 35 30

M: 2 T5 T0 5 20 T0 22 25 30 35

M: 2 T5 T0 5 T0 20 22 25 30 35

M: 2 T5 5 T0 T0 20 22 25 30 35

M: 2 5 T5 T0 T0 20 22 25 30 35
Lan 3: First - 3
J: 4 5 6 7 8 9 T0

M: 2 5 T5 T0 T0 20 22 25 30 35

M: 2 5 10 T5 T0 20 22 25 30 35
Lan 4: First - 4
J: 5 6 7 8 9 T0

M: 2 5 10 T5 T0 20 22 25 30 35

M: 2 5 10 10 T5 20 22 25 30 35
Lan 5: First - 5
J: 6 7 8 9 T0
M: 2 5 10 10 15 20 22 25 30 35
Lan 6: First - 6
J: 7 8 9 T0
M: 2 5 10 10 15 20 22 25 30 35
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 23
Lan 7: First - 7
J: 8 9 T0
M: 2 5 10 10 15 20 22 25 30 35
Lan 8: First - 8
J: 9 T0
M: 2 5 10 10 15 20 22 25 30 35
Lan 9: First - 9
J: T0
M: 2 5 10 10 15 20 22 25 30 35
Sau 9 lan di mang M tro thanh:
M: 2 5 T0 T0 T5 20 22 25 30 35
- Phan tch thuat toan:
+ Trong moi truong hop:
So phep gan: C - 0
So phep so sanh: S - (H-T) + (H-2) + + T - H(H-T)
+ Trong truong hop tot nhat: khi mang ban dau da co thu tu tang
So phep hoan v: Hmin - 0
+ Trong truong hop xau nhat: khi mang ban dau da co thu tu giam
So phep hoan v: Hmin - (H-T) + (H-2) + + T - H(H-T)
+ So phep hoan v trung bnh: Havg - H(H-T)
- Nhan xet ve thuat toan noi bot:
+ Thuat toan sap xep noi bot kha don gian, de hieu va de cai dat.
+ Trong thuat toan sap xep noi bot, moi lan di tu cuoi mang ve dau mang th phan tu
nhe duoc troi len rat nhanh trong khi do phan tu nang lai chm xuong kha cham
chap do khong tan dung duoc chieu di xuong (chieu tu dau mang ve cuoi mang).
+ Thuat toan noi bot khong phat hien ra duoc cac doan phan tu nam hai dau cua
mang da nam dung v tri de co the giam bot quang duong di trong moi lan di.
b. Thuat toan sap xep da tren s phan hoach (Partitioning Sort):
Thuat toan sap xep dua tren su phan hoach con duoc goi la thuat toan sap xep
nhanh (uick Sort).
- Tu tuong:
+ Phan hoach day M thanh 03 day con co thu tu tuong doi thoa man dieu kien:
Day con thu nhat (dau day M) gom cac phan tu co gia tr nho hon gia tr trung
bnh cua day M,
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 24
Day con thu hai (giua day M) gom cac phan tu co gia tr bang gia tr trung bnh
cua day M,
Day con thu ba (cuoi day M) gom cac phan tu co gia tr lon hon gia tr trung bnh
cua day M,
+ Heu day con thu nhat va day con thu ba co nhieu hon 0T phan tu th chung ta lai
tiep tuc phan hoach de quy cac day con nay.
+ Viec tm gia tr trung bnh cua day M hoac tm kiem phan tu trong M co gia tr bang
gia tr trung bnh cua day M rat kho khan va mat thoi gian. Trong thuc te, chung
ta chon mot phan tu bat ky (thuong la phan tu dung o v tri giua) trong day cac
phan tu can phan hoach de lam gia tr cho cac phan tu cua day con thu hai (day
giua) sau khi phan hoach. Phan tu nay con duoc goi la phan tu bien (boundary
element). Cac phan tu trong day con thu nhat se co gia tr nho hon gia tr phan tu
bien va cac phan tu trong day con thu ba se co gia tr lon hon gia tr phan tu bien.
+ Viec phan hoach mot day duoc thuc hien bang cach tm cac cap phan tu dung o
hai day con hai ben phan tu giua (day T va day 3) nhung b sai thu tu (phan tu
dung o day T co gia tr lon hon gia tr phan tu giua va phan tu dung o day 3 co
gia tr nho hon gia tr phan tu giua) de do i cho (hoan v) cho nhau.
- Thuat toan:
BT: First - T
B2: Last - H
B3: lF (First Last) //Day con ch con khong qua 0T phan tu
Thuc hien Bkt
B4: X - M|(First+Last)/2] //Lay gia tr phan tu giua
B5: l - First //Xuat phat tu dau day T de tm phan tu co gia tr > X
B6: lF (M|l] > X)
Thuc hien B8
B7: ELSE
B7.T: l++
B7.2: Lap lai B6
B8: J - Last //Xuat phat tu cuoi day 3 de tm phan tu co gia tr < X
B9: lF (M|J] < X)
Thuc hien BTT
BT0: ELSE
BT0.T: J--
BT0.2: Lap lai B9
BTT: lF (l J)
BTT.T: Hoan_V(M|l], M|J])
BTT.2: l++
BTT.3: J--
BTT.4: Lap lai B6
BT2: ELSE
BT2.T: Phan hoach de quy day con tu phan tu thu First den phan tu thu J
BT2.2: Phan hoach de quy day con tu phan tu thu l den phan tu thu Last
Bkt: Ket thuc
- Cai at thuat toan:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 25
Ham uickSort co prototype nhu sau:
void uickSort(T M|], int H);
Ham thuc hien viec sap xep H phan tu co kieu du lieu T tren mang M theo thu tu
tang dua tren thuat toan sap xep nhanh. Ham uickSort su dung ham phan hoach de
quy PartitionSort de thuc hien viec sap xep theo thu tu tang cac phan tu cua mot day
con gioi han tu phan tu thu First den phan tu thu Last tren mang M. Ham
PartitionSort co prototype nhu sau:
void PartitionSort(T M|], int First, int Last);
Hoi dung cua cac ham nhu sau:
void PartitionSort(T M|], int First, int Last)
{ if (First >- Last)
return;
T X - M|(First+Last)/2];
int l - First;
int J - Last;
do { while (M|l] < X)
l++;
while (M|J] > X)
J--;
if (l <- J)
{ Swap(M|l], M|J]);
l++;
J--;
}
}
while (l <- J);
PartitionSort(M, First, J);
PartitionSort(M, l, Last);
return;
}
//-------------------------------------------
void uickSort(T M|], int H)
{ PartitionSort(M, 0, H-T);
return;
}
- V du minh hoa thuat toan:
Cia su ta can sap xep mang M co T0 phan tu sau (H - T0):
M: 45 55 25 20 T5 5 25 30 T0 3
Ban dau: First - T Last - T0 X - M|(T+T0)/2] -M|5] - T5
First X - T5 Last
M: 45 55 25 20 T5 5 25 30 T0 3

Phan hoach:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 26
l X - T5 J
M: 45 55 25 20 T5 5 25 30 T0 3

l X - T5 J
M: 3 55 25 20 T5 5 25 30 T0 45

l X - T5 J
M: 3 T0 25 20 T5 5 25 30 55 45

l X - T5
M: 3 T0 5 20 T5 25 25 30 55 45
J
First X - T5 l Last
M: 3 T0 5 T5 20 25 25 30 55 45
J
Phan hoach cac phan tu trong day con tu First -> J:
First - T Last - J - 4 X - M|(T+4)/2] - M|2] - T0
First X - T0 Last
M: 3 T0 5 T5 20 25 25 30 55 45

Phan hoach:
l X - T0 J
M: 3 T0 5 T5 20 25 25 30 55 45

X - T0 J
M: 3 T0 5 T5 20 25 25 30 55 45
l
J X - T0
M: 3 5 T0 T5 20 25 25 30 55 45
l
Phan hoach cac phan tu trong day con tu First -> J:
First - T Last - J - 2 X - M|(T+2)/2] - M|T] - 3
First Last
M: 3 5 T0 T5 20 25 25 30 55 45
X - 3
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 27
Phan hoach:
l J
M: 3 5 T0 T5 20 25 25 30 55 45
X - 3
lJ
M: 3 5 T0 T5 20 25 25 30 55 45
X - 3
J l
M: 3 5 T0 T5 20 25 25 30 55 45
X - 3
First J l Last
M: 3 5 T0 T5 20 25 25 30 55 45

Phan hoach cac phan tu trong day con tu l -> Last:
First - l - 3 Last - 4 X - M|(3+4)/2] - M|3] - T0
First Last
M: 3 5 T0 T5 20 25 25 30 55 45
X - T0
Phan hoach:
l J
M: 3 5 T0 T5 20 25 25 30 55 45
X - T0
lJ
M: 3 5 T0 T5 20 25 25 30 55 45
X - T0
J l
M: 3 5 T0 T5 20 25 25 30 55 45
X - T0
First J l Last
M: 3 5 T0 T5 20 25 25 30 55 45

Phan hoach cac phan tu trong day con tu l -> Last:
First - l - 5 Last - T0 X - M|(5+T0)/2] - M|7] - 25
First X - 25 Last
M: 3 5 T0 T5 20 25 25 30 55 45

Phan hoach:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 28
l X - 25 J
M: 3 5 T0 T5 20 25 25 30 55 45

l X - 25
M: 3 5 T0 T5 20 25 25 30 55 45
J
First X - 25 l Last
M: 3 5 T0 T5 20 25 25 30 55 45
J
Phan hoach cac phan tu trong day con tu First -> J:
First - 5 Last - J - 6 X - M|(5+6)/2] - M|5] - 20
First Last
M: 3 5 T0 T5 20 25 25 30 55 45
X - 20
Phan hoach:
l J
M: 3 5 T0 T5 20 25 25 30 55 45
X - 20
lJ
M: 3 5 T0 T5 20 25 25 30 55 45
X - 20
J l
M: 3 5 T0 T5 20 25 25 30 55 45
X - 20
First J l Last
M: 3 5 T0 T5 20 25 25 30 55 45

Phan hoach cac phan tu trong day con tu l -> Last:
First - l - 7 Last - T0 X - M|(7+T0)/2] - M|8] - 30
First X - 30 Last
M: 3 5 T0 T5 20 25 25 30 55 45

Phan hoach:
l X - 30 J
M: 3 5 T0 T5 20 25 25 30 55 45

lJ
M: 3 5 T0 T5 20 25 25 30 55 45
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 29
X - 30
J l
M: 3 5 T0 T5 20 25 25 30 55 45
X - 30
FirstJ l Last
M: 3 5 T0 T5 20 25 25 30 55 45
X - 30
Phan hoach cac phan tu trong day con tu l -> Last:
First - l - 9 Last - T0 X - M|(9+T0)/2] - M|9] - 55
First Last
M: 3 5 T0 T5 20 25 25 30 55 45
X - 55
Phan hoach:
l J
M: 3 5 T0 T5 20 25 25 30 55 45
X - 55
J l
M: 3 5 T0 T5 20 25 25 30 45 55
X - 55

M: 3 5 T0 T5 20 25 25 30 45 55

Toan bo qua trnh phan hoach ket thuc, day M tro thanh:
M: 3 5 T0 T5 20 25 25 30 45 55

- Phan tch thuat toan:
+ Truong hop tot nhat, khi mang M ban dau da co thu tu tang:
So phep gan: Cmin - T + 2 + 4 + + 2^|Log
2
(H) T] - H-T
So phep so sanh: Smin - HLog
2
(H)/2
So phep hoan v: Hmin - 0
+ Truong hop xau nhat, khi phan tu X duoc chon o giua day con la gia tr lon nhat
cua day con. Truong hop nay thuat toan uickSort tro nen cham chap nhat:
So phep gan: Cmax - T + 2 + + (H-T) - H(H-T)/2
So phep so sanh: Smax - (H-T)(H-T)
So phep hoan v: Hmax - (H-T) + (H-2) + + T - H(H-T)/2
+ Trung bnh:
So phep gan: Cavg - |(H-T)+H(H-T)/2]/2 - (H-T)(H+2)/4
So phep so sanh: Savg - |HLog
2
(H)/2 + H(H-T)]/2 - H|Log
2
(H)+2H2]/4
So phep hoan v: Havg - H(H-T)/4
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 30
.2.2. Sap ep LaDQ pDuoDQ pDap cDoD (SeJect1oD Sozt,
Cac thuat toan trong phan nay se tm cach lua chon cac phan tu thoa man dieu kien
chon lua de dua ve dung v tri cua phan tu do, cuoi cung tat ca cac phan tu trong
mang M deu ve dung v tri.
Cac thuat toan sap xep bang phuong phap chon bao gom:
- Thuat toan sap xep chon truc tiep (straight selection sort),
- Thuat toan sap xep dua tren khoi/heap hay sap xep tren cay (heap sort).
O day chung ta ch trnh bay thuat toan sap xep chon truc tiep
Thuat toan sap xep chon trc tiep (Straight Selection Sort):
- Tu tuong:
+ Ban dau day co H phan tu chua co thu tu. Ta chon phan tu co gia tr nho nhat
trong H phan tu chua co thu tu nay de dua len dau nhom H phan tu.
+ Sau lan thu nhat chon lua phan tu nho nhat va dua len dau nhom chung ta con lai
H-T phan tu dung o phia sau day M chua co thu tu. Chung ta tiep tuc chon phan
tu co gia tr nho nhat trong H-T phan tu chua co thu tu nay de dua len dau nhom
H-T phan tu. . Do vay, sau HT lan chon lua phan tu nho nhat de dua len dau
nhom th tat ca cac phan tu trong day M se co thu tu tang.
+ Hhu vay, thuat toan nay chu yeu chung ta di tm gia tr nho nhat trong nhom H-K
phan tu chua co thu tu dung o phia sau day M. Viec nay don gian chung ta van
dung thuat toan tm kiem tuan tu.
- Thuat toan:
BT: K - 0
B2: lF (K - H-T)
Thuc hien Bkt
B3: Min - M|K+T]
B4: PosMin - K+T
B5: Pos - K+2
B6: lF (Pos > H)
Thuc hien B8
B7: ELSE
B7.T: lf (Min > M|Pos])
B7.T.T: Min - M|Pos]
B7.T.2: PosMin - Pos
B7.2: Pos++
B7.3: Lap lai B6
B8: HoanV(M|K+T], M|PosMin])
B9: K++
BT0: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham SelectionSort co prototype nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 31
void SelectionSort(T M|], int H);
Ham thuc hien viec sap xep H phan tu co kieu du lieu T tren mang M theo thu tu
tang dua tren thuat toan sap xep chon truc tiep. Hoi dung cua ham nhu sau:
void SelectionSort(T M|], int H)
{ int K - 0, PosMin;
while (K < H-T)
{ T Min - M|K];
PosMin - K;
for (int Pos - K+T; Pos < H; Pos++)
if (Min > M|Pos])
{ Min - M|Pos];
PosMin - Pos
}
Swap(M|K], M|PosMin]);
K++;
}
return;
}
- V du minh hoa thuat toan:
Cia su ta can sap xep mang M co T0 phan tu sau (H - T0):
M: T 60 2 25 T5 45 5 30 33 20
Ta se thuc hien 9 lan chon lua (H - T - T0 - T - 9) phan tu nho nhat de sap xep
mang M:
Lan T: Min - T PosMin - T K - 0
K+T
M: T 60 2 25 T5 45 5 30 33 20

Lan 2: Min - 2 PosMin - 3 K - T
K+T
M: 1 60 2 25 T5 45 5 30 33 20

K+T
M: 1 2 60 25 T5 45 5 30 33 20

Lan 3: Min - 5 PosMin - 7 K - 2
K+T
M: 1 2 60 25 T5 45 5 30 33 20

K+T
M: 1 2 5 25 T5 45 60 30 33 20

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 32
Lan 4: Min - T5 PosMin - 5 K - 3
K+T
M: 1 2 5 25 T5 45 60 30 33 20

K+T
M: 1 2 5 15 25 45 60 30 33 20

Lan 5: Min - 20 PosMin - T0 K - 4
K+T
M: 1 2 5 15 25 45 60 30 33 20

K+T
M: 1 2 5 15 20 45 60 30 33 25

Lan 6: Min - 25 PosMin - T0 K - 5
K+T
M: 1 2 5 15 20 45 60 30 33 25

K+T
M: 1 2 5 15 20 25 60 30 33 45

Lan 7: Min - 30 PosMin - 8 K - 6
K+T
M: 1 2 5 15 20 25 60 30 33 45

K+T
M: 1 2 5 15 20 25 30 60 33 45


Lan 8: Min - 33 PosMin - 9 K - 7
K+T
M: 1 2 5 15 20 25 30 60 33 45

K+T
M: 1 2 5 15 20 25 30 33 60 45

Lan 9: Min - 45 PosMin - T0 K - 8
K+T
M: 1 2 5 15 20 25 30 33 60 45
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 33
K+T
M: 1 2 5 15 20 25 30 33 45 60

Sau lan 9: K - 9 va mang M tro thanh:
M: 1 2 5 15 20 25 30 33 45 60

- Phan tch thuat toan:
+ Trong moi truong hop:
So phep so sanh: S - (H-T)+(H-2)++T - H(H-T)/2
So phep hoan v: H - H-T
+ Truong hop tot nhat, khi mang M ban dau da co thu tu tang:
So phep gan: Cmin - 2(H-T)
+ Truong hop xau nhat, khi mang M ban dau da co thu tu giam dan:
So phep gan: Cmax - 2|H+(H-T)+ +T] - H(H+T)
+ Trung bnh:
So phep gan: Cavg - |2(H-T)+H(H+T)]/2 - (H-T) + H(H+T)/2
.2.. Sap ep LaDQ pDuoDQ pDap cDeD (1Dezt1oD Sozt,
Cac thuat toan trong phan nay se tm cach tan dung K phan tu dau day M da co thu tu
tang, chung ta dem phan tu thu K+T chen vao K phan tu dau day sao cho sau khi chen
chung ta co K+T phan tu dau day M da co thu tu tang.
Ban dau day M co it nhat T phan tu dau day da co thu tu tang (K-T). Hhu vay sau toi
da H-T buoc chen la chung ta se sap xep xong day M co H phan tu theo thu tu tang.
Cac thuat toan sap xep bang phuong phap chen bao gom:
- Thuat toan sap xep chen truc tiep (straight insertion sort),
- Thuat toan sap xep chen nh phan (binary insertion sort).
Trong tai lieu nay chung ta ch trnh bay thuat toan sap xep chen truc tiep.
Thuat toan sap xep chen trc tiep (Straight Insertion Sort):
- Tu tuong:
e chen phan tu thu K+T vao K phan tu dau day da co thu tu chung ta se tien hanh
tm v tri dung cua phan tu K+T trong K phan tu dau bang cach van dung thuat giai
tm kiem tuan tu (Sequential Search). Sau khi tm duoc v tri chen (chac chan co v
tri chen) th chung ta se tien hanh chen phan tu K+T vao dung v tri chen bang cach
doi cac phan tu tu v tri chen den phan tu thu K sang phai (ra phia sau) 0T v tri va
chen phan tu K+T vao v tri cua no.
- Thuat toan:
BT: K - T
B2: lF (K - H)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 34
Thuc hien Bkt
B3: X - M|K+T]
B4: Pos - T
B5: lF (Pos > K)
Thuc hien B7
B6: ELSE //Tm v tri chen
B6.T: lf (X <- M|Pos])
Thuc hien B7
B6.2: Pos++
B6.3: Lap lai B6.T
B7: l - K+T
B8: lF (l > Pos) //Heu con phai doi cac phan tu tu Pos->K ve phia sau T v tri
B8.T: M|l] - M|l-T]
B8.2: l--
B8.3: Lap lai B8
B9: ELSE //a doi xong cac phan tu tu Pos->K ve phia sau T v tri
B9.T: M|Pos] - X //Chen X vao v tri Pos
B9.2: K++
B9.3: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham lnsertionSort co prototype nhu sau:
void lnsertionSort(T M|], int H);
Ham thuc hien viec sap xep H phan tu co kieu du lieu T tren mang M theo thu tu
tang dua tren thuat toan sap xep chen truc tiep. Hoi dung cua ham nhu sau:
void lnsertionSort(T M|], int H)
{ int K - T, Pos;
while (K < H)
{ T X - M|K];
Pos - 0;
while (X > M|Pos])
Pos++;
for (int l - K; l > Pos; l--)
M|l] - M|l-T];
M|Pos] - X;
K++;
}
return;
}
- V du minh hoa thuat toan:
Cia su ta can sap xep mang M co T0 phan tu sau (H - T0):
M: TT T6 T2 75 5T 54 5 73 36 52
Ta se thuc hien 9 lan chen (H - T - T0 - T - 9) cac phan tu vao day con da co thu tu
tang dung dau day M:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 35
Lan T: K - T X - M|K+T] - M|2] - T6 Pos - 2
K: T
M: TT T6 T2 75 5T 54 5 73 36 52

X
Lan 2: K - 2 X - M|K+T] - M|3] - T2 Pos - 2
K: T 2
M: TT T6 T2 75 5T 54 5 73 36 52

X
K: T 2
M: TT T2 T6 75 5T 54 5 73 36 52

X
Lan 3: K - 3 X - M|K+T] - M|4] - 75 Pos - 4
K: T 2 3
M: TT T2 T6 75 5T 54 5 73 36 52

X
K: T 2 3
M: TT T2 T6 75 5T 54 5 73 36 52

X

Lan 4: K - 4 X - M|K+T] - M|5] - 5T Pos - 4
K: T 2 3 4
M: TT T2 T6 75 5T 54 5 73 36 52

X
K: T 2 3 4
M: TT T2 T6 5T 75 54 5 73 36 52

X

Lan 5: K - 5 X - M|K+T] - M|6] - 54 Pos - 5
K: T 2 3 4 5
M: TT T2 T6 5T 75 54 5 73 36 52

X
K: T 2 3 4 5
M: TT T2 T6 5T 54 75 5 73 36 52

X
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 36
Lan 6: K - 6 X - M|K+T] - M|7] - 5 Pos - T
K: T 2 3 4 5 6
M: TT T2 T6 5T 54 75 5 73 36 52

X
K: T 2 3 4 5 6
M: 5 TT T2 T6 5T 54 75 73 36 52

X

Lan 7: K - 7 X - M|K+T] - M|8] - 73 Pos - 7
K: T 2 3 4 5 6 7
M: 5 TT T2 T6 5T 54 75 73 36 52

X
K: T 2 3 4 5 6 7
M: 5 TT T2 T6 5T 54 73 75 36 52

X

Lan 8: K - 8 X - M|K+T] - M|9] - 36 Pos - 5
K: T 2 3 4 5 6 7 8
M: 5 TT T2 T6 5T 54 73 75 36 52

X
K: T 2 3 4 5 6 7 8
M: 5 TT T2 T6 36 5T 54 73 75 52
X

Lan 9: K - 9 X - M|K+T] - M|T0] - 52 Pos - 7
K: T 2 3 4 5 6 7 8 9
M: 5 TT T2 T6 36 5T 54 73 75 52
X
K: T 2 3 4 5 6 7 8 9
M: 5 TT T2 T6 36 5T 52 54 73 75

X

Thuat toan ket thuc: K - T0, mang M da duoc sap xep theo thu tu tang
K: T 2 3 4 5 6 7 8 9 T0
M: 5 TT T2 T6 36 5T 52 54 73 75

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 37
- Phan tch thuat toan:
+ Truong hop tot nhat, khi mang M ban dau da co thu tu tang:
So phep gan: Cmin - 2(H-T)
So phep so sanh: Smin - T+2++(H-T) - H(H-T)/2
So phep hoan v: Hmin - 0
+ Truong hop xau nhat, khi mang M ban dau luon co phan tu nho nhat trong H-K
phan tu con lai dung o v tri sau cung sau moi lan hoan v:
So phep gan: Cmax - |2(H-T)]+| T+2++(H-T)] - |2(H-T)] + |H(H-T)/2]
So phep so sanh: Smax - (H-T)
So phep hoan v: Hmax - 0
+ Trung bnh:
So phep gan: Cavg - 2(H-T) + |H(H-T)/4]
So phep so sanh: Savg - |H(H-T)/2 + (H-T)]/2 - (H+2)(H-T)/4
So phep hoan v: Havg - 0
+ Chung ta nhan thay rang qua trnh tm kiem v tri chen cua phan tu K+T va qua
trnh doi cac phan tu tu v tri chen den K ra phia sau 0T v tri co the ket hop lai
voi nhau. Hhu vay, qua trnh di doi cac phan tu ra sau nay se bat dau tu phan tu
thu K tro ve dau day M cho den khi gap phan tu co gia tr nho hon phan tu K+T
th chung ta dong thoi vua di doi xong va do ng thoi cung bat gap v tri chen.
Hgoai ra, chung ta cung co the tinh toan gia tr ban dau cho K tuy thuoc vao so
phan tu dung dau day M ban dau co thu tu tang la bao nhieu phan tu chu khong
nhat thiet phai la T. Khi do, thuat toan sap xep chen truc tiep cua chung ta co the
duoc hieu chnh lai nhu sau:
- Thuat toan hieu chnh:
BT: K - T
B2: lF (M|K] <- M|K+T] And K < H)
B2.T: K++
B2.2: Lap lai B2
B3: lF (K - H)
Thuc hien Bkt
B4: X - M|K+T]
B5: Pos - K
B6: lF (Pos > 0 And X < M|Pos])
B6.T: M|Pos+T] - M|Pos]
B6.2: Pos--
B6.3: Lap lai B6
B7: ELSE //Chen X vao v tri Pos+T
B7.T: M|Pos+T] - X
B7.2: K++
B7.3: Lap lai B3
Bkt: Ket thuc
- Cai at thuat toan hieu chnh:
Ham lnsertionSortT co prototype nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 38
void lnsertionSortT(T M|], int H);
Ham thuc hien viec sap xep H phan tu co kieu du lieu T tren mang M theo thu tu
tang dua tren thuat toan sap xep chen truc tiep da hieu chnh. Hoi dung cua ham
nhu sau:
void lnsertionSortT(T M|], int H)
{ int K - T, Pos;
while(M|K-T] <- M|K] && K<H)
K++;
while (K < H)
{ T X - M|K];
Pos - K-T;
while (X < M|Pos] && Pos >- 0)
{ M|Pos+T] - M|Pos]; Pos--; }
M|Pos+T] - X;
K++;
}
return;
}
- V du minh hoa thuat toan hieu chnh:
Cia su ta can sap xep mang M co T0 phan tu sau (H - T0):
M: T4 T6 20 75 50 5 25 75 60 50
Ban dau K - 4 nen ta se thuc hien 6 lan chen (H - 4 - T0 - 4 - 6) cac phan tu vao
day con da co thu tu tang dung dau day M:
Lan T: K - 4 X - M|K+T] - M|5] - 50 Pos - 3 -> Pos + T - 4
K: T 2 3 4
M: T4 T6 20 75 50 5 25 75 60 50

X-50
K: T 2 3 4
M: T4 T6 20 75 75 5 25 75 60 50

K: T 2 3 4
M: T4 T6 20 50 75 5 25 75 60 50
X
Lan 2: K - 5 X - M|K+T] - M|6] - 5 Pos - 0 -> Pos + T - T
K: T 2 3 4 5
M: T4 T6 20 50 75 5 25 75 60 50

X-5
K: T 2 3 4 5
M: T4 T4 T6 20 50 75 25 75 60 50

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 39
K: T 2 3 4 5
M: 5 T4 T6 20 50 75 25 75 60 50

X

Lan 3: K - 6 X - M|K+T] - M|7] - 25 Pos - 4 -> Pos + T - 5
K: T 2 3 4 5 6
M: 5 T4 T6 20 50 75 25 75 60 50

X-25
K: T 2 3 4 5 6
M: 5 T4 T6 20 50 50 75 75 60 50

K: T 2 3 4 5 6
M: 5 T4 T6 20 25 50 75 75 60 50
X

Lan 4: K - 7 X - M|K+T] - M|8] - 75 Pos - 7 -> Pos + T - 8
K: T 2 3 4 5 6 7
M: 5 T4 T6 20 25 50 75 75 60 50

X-75
K: T 2 3 4 5 6 7
M: 5 T4 T6 20 25 50 75 75 60 50

X-75
Lan 5: K - 8 X - M|K+T] - M|9] - 60 Pos - 6 -> Pos + T - 7
K: T 2 3 4 5 6 7 8
M: 5 T4 T6 20 25 50 75 75 60 50

X-60
K: T 2 3 4 5 6 7 8
M: 5 T4 T6 20 25 50 75 75 75 50

K: T 2 3 4 5 6 7 8
M: 5 T4 T6 20 25 50 60 75 75 50

X

Lan 6: K - 9 X - M|K+T] - M|T0] - 50 Pos - 6 -> Pos + T - 7
K: T 2 3 4 5 6 7 8 9
M: 5 T4 T6 20 25 50 60 75 75 50

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 40
X-50
K: T 2 3 4 5 6 7 8 9
M: 5 T4 T6 20 25 50 60 60 75 75

K: T 2 3 4 5 6 7 8 9
M: 5 T4 T6 20 25 50 50 60 75 75

X

Thuat toan ket thuc: K - T0, mang M da duoc sap xep theo thu tu tang
K: T 2 3 4 5 6 7 8 9 T0
M: 5 T4 T6 20 25 50 50 60 75 75

- Phan tch thuat toan hieu chnh:
+ Truong hop tot nhat, khi mang M ban dau da co thu tu tang:
So phep gan: Cmin - T
So phep so sanh: Smin - 2(H-T) + T
So phep hoan v: Hmin - 0
+ Truong hop xau nhat, khi mang M ban dau da co thu tu giam dan:
So phep gan: Cmax - T+|T+2++(H-T)]+|H-T] - H(H+T)/2
So phep so sanh: Smax - T+2|T+2++(H-T)]+|H-T] - H
2

So phep hoan v: Hmax - 0
+ Trung bnh:
So phep gan: Cavg - |T+ H(H-T)/2]/2
So phep so sanh: Savg - |2(H-T) + T+H
2
]/2
So phep hoan v: Havg - 0
.2.4. Sap ep LaDQ pDuoDQ pDap tzoD (HezQe Sozt,
Cac thuat toan trong phan nay se tm cach tach mang M thanh cac mang con theo cac
duong chay (run) roi sau do tien hanh nhap cac mang nay lai theo tung cap duong
chay de tao thanh cac duong chay moi co chieu dai lon hon duong chay cu. Sau mot
so lan tach/nhap th cuoi cung mang M ch con lai T duong chay, luc do th cac phan tu
tren mang M se tro nen co thu tu.
Cac thuat toan sap xep bang phuong phap tron bao gom:
- Thuat toan sap xep tron thang hay tron truc tiep (straight merge sort),
- Thuat toan sap xep tron tu nhien (natural merge sort).
Truoc khi di vao chi tiet tung thuat toan chung ta hay tm hieu khai niem va cac van de
lien quan den duong chay (run)
- uong chay (Run):
Day M|l], M|l+T], , M|J] (l J: T l, J H) la mot duong chay neu no co thu tu.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 41
- Chieu dai cua uong chay (Runs Length):
So phan tu cua mot duong chay con duoc goi la chieu dai cua duong chay.
Hhu vay:
+ Moi phan tu cua day la mot duong chay co chieu dai bang T.
+ Mot day co the bao gom nhieu duong chay.
- Tron cac uong chay:
Khi ta tron cac duong chay lai voi nhau se cho ra mot duong chay moi co chieu dai
bang tong chieu dai cac duong chay ban dau.
a. Thuat toan sap xep tron trc tiep hay tron thang (Straight Merge Sort):
- Tu tuong:
Ban dau day M co H run(s) voi chieu dai moi run: L - T, ta tien hanh phan phoi luan
phien H run(s) cua day M ve hai day phu TempT, Temp2 (Moi day phu co H/2
run(s)). Sau do tron tuong ung tung cap run o hai day phu TempT, Temp2 thanh mot
run moi co chieu dai L - 2 de dua ve M va day M tro thanh day co H/2 run(s) voi
chieu dai moi run: L - 2.
Hhu vay, sau moi lan phan phoi va tron cac run tren day M th so run tren day M se
giam di mot nua, dong thoi chieu dai moi run se tang gap doi. Do do, sau Log
2
(H)
lan phan phoi va tron th day M ch con lai 0T run voi chieu dai la H va khi do day M
tro thanh day co thu tu.
Trong thuat giai sau, de de theo doi chung ta trnh bay rieng 02 thuat giai:
+ Thuat giai phan phoi luan phien (tach) cac duong chay voi chieu dai L tren day
M ve cac day phu TempT, Temp2.
+ Thuat giai tron (nhap) cac cap duong chay tren TempT, Temp2 co chieu dai L
ve M thanh cac duong chay voi chieu dai 2*L.
- Thuat toan phan phoi:
BT: l - T //Ch so tren M
B2: JT - T //Ch so tren TempT
B3: J2 - T //Ch so tren Temp2
B4: lF (l > H) //a phan phoi het
Thuc hien Bkt
//Chep T run tu M sang TempT
B5: K - T //Ch so de duyet cac run
B6: lF (K > L) //Duyet het T run
Thuc hien BT3
B7: TempT|JT] - M|l] //Chep cac phan tu cua run tren M sang TempT
B8: l++
B9: JT++
BT0: K++
BTT: lF (l > H) //a phan phoi het
Thuc hien Bkt
BT2: Lap lai B6
//Chep T run tu M sang Temp2
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 42
BT3: K - T
BT4: lF (K > L)
Thuc hien B2T
BT5: Temp2|J2] - M|l] //Chep cac phan tu cua run tren M sang Temp2
BT6: l++
BT7: J2++
BT8: K++
BT9: lF (l > H) //a phan phoi het
Thuc hien Bkt
B20: Lap lai BT4
B2T: Lap lai B4
B22: HT - JT-T //So phan tu tren TempT
B23: H2 - J2-T //So phan tu tren Temp2
Bkt: Ket thuc
- Thuat toan tron:
BT: l - T // Ch so tren M
B2: JT - T //Ch so tren TempT
B3: J2 - T //Ch so tren Temp2
B4: KT - T //Ch so de duyet cac run tren TempT
B5: K2 - T //Ch so de duyet cac run tren Temp2
B6: lF (JT > HT) //a chep het cac phan tu trong TempT
Thuc hien B25
B7: lF (J2 > H2) //a chep het cac phan tu trong Temp2
Thuc hien B30
B8: lF (TempT|JT] Temp2|J2]) //TempT|JT] dung truoc Temp2|J2] tren M
B8.T: M|l] - TempT|JT]
B8.2: l++
B8.3: JT++
B8.4: KT++
B8.5: lf (KT > L) //a duyet het T run trong TempT
Thuc hien BTT
B8.6: Lap lai B6
B9: ELSE //Temp2|J2] dung truoc TempT|JT] tren M
B9.T: M|l] - Temp2|J2]
B9.2: l++
B9.3: J2++
B9.4: K2++
B9.5: lf (K2 > L) //a duyet het T run trong Temp2
Thuc hien BT8
B9.6: Lap lai B6
BT0: Lap lai B4
//Chep phan run con lai trong Temp2 ve M
BTT: lF (K2 > L) //a chep het phan run con lai trong Temp2 ve M
Lap lai B4
BT2: M|l] - Temp2|J2]
BT3: l++
BT4: J2++
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 43
BT5: K2++
BT6: lF (J2 > H2) //a chep het cac phan tu trong Temp2
Thuc hien B30
BT7: Lap lai BTT
//Chep phan run con lai trong TempT ve M
BT8: lF (KT > L) //a chep het phan run con lai trong TempT ve M
Lap lai B4
BT9: M|l] - TempT|JT]
B20: l++
B2T: JT++
B22: KT++
B23: lF (JT > HT) //a chep het cac phan tu trong TempT
Thuc hien B25
B24: Lap lai BT8
//Chep cac phan tu con lai trong Temp2 ve M
B25: lF (J2>H2)
Thuc hien Bkt
B26: M|l] - Temp2|J2]
B27: l++
B28: J2++
B29: Lap lai B25
//Chep cac phan tu con lai trong TempT ve M
B30: lF (JT>HT)
Thuc hien Bkt
B3T: M|l] - TempT|JT]
B32: l++
B33: JT++
B34: Lap lai B30
Bkt: Ket thuc
- Thuat toan sap xep tron thang:
BT: L - T //Chieu dai ban dau cua cac run
B2: lF (L H) //Day ch con 0T run
Thuc hien Bkt
B3: Phan_Phoi(M, H, TempT, HT, Temp2, H2, L)
B4: Tron(TempT, HT, Temp2, H2, M, H, L)
B5: L - 2*L
B6: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham StraightMergeSort co prototype nhu sau:
void StraightMergeSort(T M|], int H);
Ham thuc hien viec sap xep H phan tu co kieu du lieu T tren mang M theo thu tu
tang dua tren thuat toan sap tron truc tiep. Ham su dung cac ham Distribute, Merge
co prototype va y nghia nhu sau:
void Distribute(T M|], int H, T TempT|], int &HT, T Temp2|], int &H2, int L);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 44
Ham thuc hien viec phan phoi luan phien cac duong chay co chieu dai L tren day M
co H phan tu ve thanh cac day TempT va Temp2 co tuong ung HT va H2 phan tu.
void Merge(T TempT|], int HT, T Temp2|], int H2, T M|], int &H, int L);
Ham thuc hien viec tron tung cap tuong ung cac duong chay voi do dai L tren
TempT, Temp2 ve day M thanh cac duong chay co chieu dai 2*L.
Hoi dung cua cac ham nhu sau:
void Distribute(T M|], int H, T TempT|], int &HT, T Temp2|], int &H2, int L)
{ int l - 0, JT - 0, J2 - 0;
while (l < H)
{ for(int K - 0; K<L && l<H; K++, l++, JT++)
TempT|JT] - M|l];
for(K - 0; K<L && l<H; K++, l++, J2++)
Temp2|J2] - M|l];
}
HT - JT;
H2 - J2;
return;
}
//--------------------------------------------------------
void Merge(T TempT|], int HT, T Temp2|], int H2, T M|], int &H, int L)
{ int l - 0, JT - 0, J2 - 0, KT - 0, K2 - 0;
while (JT < HT && J2 < H2)
{ while (TempT|JT] <- Temp2|J2] && JT < HT && J2 < H2)
{ M|l] - TempT|JT];
l++;
JT++;
if (JT -- HT)
{ for (; J2 < H2; J2++, l++)
M|l] - Temp2|J2];
return;
}
KT++;
if (KT -- L)
{ for (; K2 < L && J2 < H2; K2++, l++, J2++)
M|l] - Temp2|J2];
KT - K2 - 0;
break;
}
}
while (Temp2|J2] < TempT|JT] && JT < HT && J2 < H2)
{ M|l] - Temp2|J2];
l++;
J2++;
if (J2 -- H2)
{ for (; JT < HT; JT++, l++)
M|l] - TempT|JT];
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 45
return;
}
K2++;
if (K2 -- L)
{ for (; KT < L && JT < HT; KT++, l++, JT++)
M|l] - TempT|JT];
KT - K2 - 0;
break;
}
}
}
while (JT < HT)
{ M|l] - TempT|JT];
l++;
JT++;
}
while (J2 < H2)
{ M|l] - Temp2|J2];
l++;
J2++;
}
H - HT + H2;
return;
}
//--------------------------------------------------------
void StraightMergeSort(T M|], int H)
{ int L - T, HT - 0, H2 - 0;
T * TempT - new T|H];
T * Temp2 - new T|H];
if (TempT -- HGLL ll Temp2 -- HGLL)
return;
while (L < H)
{ Distribute(M, H, TempT, HT, Temp2, H2, L);
Merge(TempT, HT, Temp2, H2, M, H, L);
L - 2*L;
}
delete TempT;
delete Temp2;
return;
}
- V du minh hoa thuat toan:
Cia su ta can sap xep mang M co T0 phan tu sau (H - T0):
M: 4T 36 32 47 65 2T 52 57 70 50
Ta thuc hien cac lan phan phoi va tron cac phan tu cua M nhu sau:
Lan T: L - T
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 46
Phan phoi M thanh TempT, Temp2:

M: 4T 36 32 47 65 2T 52 57 70 50

TempT:HT-5
4T 32 65 52 70

Temp2:H2-5
36 47 2T 57 50


Tron TempT, Temp2 thanh M:
TempT:HT-5
4T 32 65 52 70

Temp2:H2-5
36 47 2T 57 50

M: 36 4T 32 47 2T 65 52 57 50 70

Lan 2: L - 2

Phan phoi M thanh TempT, Temp2:

M: 36 4T 32 47 2T 65 52 57 50 70

TempT: HT-6
36 4T 2T 65 50 70

Temp2: H2-4
32 47 52 57


Tron TempT, Temp2 thanh M:
TempT: HT-6
36 4T 2T 65 50 70

Temp2: H2-4
32 47 52 57


M: 32 36 4T 47 2T 52 57 65 50 70

Lan 3: L - 4

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 47
Phan phoi M thanh TempT, Temp2:

M: 32 36 4T 47 2T 52 57 65 50 70


TempT:HT-6 32 36 4T 47 50 70


Temp2: H2-4 2T 52 57 65


Tron TempT, Temp2 thanh M:

TempT:HT-6 32 36 4T 47 50 70


Temp2: H2-4 2T 52 57 65

M: 2T 32 36 4T 47 52 57 65 50 70
Lan 4: L - 8

Phan phoi M thanh TempT, Temp2:

M: 2T 32 36 4T 47 52 57 65 50 70


TempT: HT-8 2T 32 36 4T 47 52 57 65

Temp2: H2-2 50 70


Tron TempT, Temp2 thanh M:

TempT: HT-8 2T 32 36 4T 47 52 57 65

Temp2: H2-2 50 70


M: 2T 32 36 4T 47 50 52 57 65 70


L - T6 > T0: Ket thuc thuat toan
- Phan tch thuat toan:
+ Trong thuat giai nay chung ta luon thuc hien log
2
(H) lan phan phoi va tron cac run.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 48
+ O moi lan phan phoi run chung ta phai thuc hien: H phep gan va 2H phep so sanh
(H phep so sanh het duong chay va H phep so sanh het day).
+ O moi lan tron run chung ta cung phai thuc hien: H phep gan va 2H+H/2 phep so
sanh (H phep so sanh het duong chay, H phep so sanh het day va H/2 phep so
sanh gia tr cac cap tuong ung tren 2 day phu).
+ Trong moi truong hop:
So phep gan: C - 2HLog
2
(H)
So phep so sanh: S - (4H+H/2)Log
2
(H)
So phep hoan v: Hmin - 0
+ Trong thuat giai nay chung ta su dung 02 day phu, tuy nhien tong so phan tu o 02
day phu nay cung ch bang H, do vay da tao ra su lang phi bo nho khong can
thiet. e giai quyet van de nay chung ta ch can su dung 0T day phu song chung
ta ket hop qua trnh tron cac cap run co chieu dai L tuong ung o hai dau day
thanh cac run co chieu dai 2L va phan phoi luan phien ve hai dau cua mot day
phu. Sau do chung ta doi vai tro cua 02 day nay cho nhau.
+ Truoc khi hieu chnh lai thuat giai chung ta xet day M gom T0 phan tu sau de minh
hoa cho qua trnh nay:
Cia su ta can sap xep mang M co T0 phan tu sau (H - T0):
M: 8T 63 69 74 T4 77 56 57 9 25
Ta thuc hien cac lan tron cac cap run o hai dau day nay va ket hop phan phoi cac
run moi tron ve hai dau day kia nhu sau:
Lan T: L - T
Tron cac cap run co chieu dai L - T tren M thanh cac run co chieu dai L - 2 va ket
hop phan phoi luan phien cac run nay ve hai dau day Tmp:

M: 8T 63 69 74 T4 77 56 57 9 25


Tmp: 25 8T 57 69 T4 77 74 56 63 9

oi vai tro cua M va Tmp cho nhau

M: 25 8T 57 69 T4 77 74 56 63 9

Lan 2: L - 2
Tron cac cap run co chieu dai L - 2 tren M thanh cac run co chieu dai L - 4 va ket
hop phan phoi luan phien cac run nay ve hai dau day Tmp:

M: 25 8T 57 69 T4 77 74 56 63 9


Tmp: 9 25 63 8T T4 77 74 69 57 56

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 49
oi vai tro cua M va Tmp cho nhau

M: 9 25 63 8T T4 77 74 69 57 56

Lan 3: L - 4
Tron cac cap run co chieu dai L - 4 tren M thanh cac run co chieu dai L - 8 va ket
hop phan phoi luan phien cac run nay ve hai dau day Tmp:

M: 9 25 63 8T T4 77 74 69 57 56


Tmp: 9 25 56 57 63 69 74 8T 77 T4

oi vai tro cua M va Tmp cho nhau

M: 9 25 56 57 63 69 74 8T 77 T4

Lan 4: L - 8
Tron cac cap run co chieu dai L - 4 tren M thanh cac run co chieu dai L - 8 va ket
hop phan phoi luan phien cac run nay ve hai dau day Tmp:

M: 9 25 56 57 63 69 74 8T 77 T4


Tmp: 9 T4 25 56 57 63 69 74 77 8T

oi vai tro cua M va Tmp cho nhau

M: 9 T4 25 56 57 63 69 74 77 8T

L - T6 > T0: Ket thuc thuat toan
+ Hhu vay, trong thuat giai nay chung ta ch con thao tac tron cac cap run co chieu
dai L tuong ung o hai dau day thanh mot run moi co chieu dai 2L de dua ve day
phu. Van de la chung ta se luan phien dat run moi vao dau day phu (theo thu tu
tang) va cuoi day phu (theo thu tu giam). Tuc la hai buoc tron va phan phoi da
duoc ket hop lai voi nhau. Thuat giai hieu chnh nhu sau:
- Thuat toan Tron Phan phoi cac cap uong chay:
BT: lT - T // Ch so tu dau day M
B2: l2 - H // Ch so tu cuoi day M
B3: JT - T // Ch so tu dau day Temp
B4: J2 - H // Ch so tu cuoi day Temp
B5: Head - True // Co bao phia dat run moi trong qua trnh tron - phan phoi
B6: KT - T // Ch so de duyet cac run dau day M
B7: K2 - T // Ch so de duyet cac run cuoi day M
B8: lF (lT > l2) // a tron va phan phoi het cac run
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 50
Thuc hien Bkt
B9: lF (M|lT] M|l2]) // M|lT] dung truoc M|l2] tren Temp
B9.T: lf (Head - True)
B9.T.T: Temp|JT] - M|lT]
B9.T.2: JT++
B9.2: Else
B9.2.T: Temp|J2] - M|lT]
B9.2.2: J2--
B9.3: lT++
B9.4: lf (lT > l2)
Thuc hien Bkt
B9.5: KT++
B9.6: lf (KT > L) //a duyet het T run phia dau trong M
Thuc hien BTT
B9.7: Lap lai B9
BT0: ELSE // M|l2] dung truoc M|lT] tren Temp
BT0.T: lf (Head - True)
BT0.T.T: Temp|JT] - M|l2]
BT0.T.2: JT++
BT0.2: Else
BT0.2.T: Temp|J2] - M|l2]
BT0.2.2: J2--
BT0.3: l2--
BT0.4: lf (lT > l2)
Thuc hien Bkt
BT0.5: K2++
BT0.6: lf (K2 > L) //a duyet het T run phia sau trong M
Thuc hien BT8
BT0.7: Lap lai B9
//Chep phan run con lai o phia sau trong M ve Temp
BTT: lF (K2 > L) //a chep het phan run con lai o phia sau trong M ve Temp
BTT.T: Head - Hot(Head)
BTT.2: Lap lai B6
BT2: lF (Head - True)
BT2.T: Temp|JT] - M|l2]
BT2.2: JT++
BT3: ELSE
BT3.T: Temp|J2] - M|l2]
BT3.2: J2--
BT4: l2--
BT5: lf (lT > l2)
Thuc hien Bkt
BT6: K2++
BT7: Lap lai BTT
//Chep phan run con lai o phia truoc trong M ve Temp
BT8: lF (KT > L) //a chep het phan run con lai o phia truoc trong M ve Temp
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 51
BT8.T: Head - Hot(Head)
BT8.2: Lap lai B6
BT9: lF (Head - True)
BT9.T: Temp|JT] - M|lT]
BT9.2: JT++
B20: ELSE
B20.T: Temp|J2] - M|lT]
B20.2: J2--
B2T: lT++
B22: lf (lT > l2)
Thuc hien Bkt
B23: KT++
B24: Lap lai BT8
Bkt: Ket thuc
- Thuat toan sap xep tron thang hieu chnh:
BT: L - T //Chieu dai ban dau cua cac run
B2: lF (L H) //Day ch con 0T run
Thuc hien Bkt
B3: Tron_Phan_Phoi(M, H, Temp, L)
B4: L - 2*L
B5: lF (L > H)
// Chep cac phan tu tu Temp ve M
B5.T: l - T
B5.2: lf (l > H)
Thuc hien Bkt
B5.3: M|l] - Temp|l]
B5.4: l++
B5.5: Lap lai B5.2
B6: Tron_Phan_Phoi(Temp, H, M, L)
B7: L - 2*L
B8: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan hieu chnh:
Ham StraightMergeSortModify co prototype nhu sau:
void StraightMergeSortModify(T M|], int H);
Ham thuc hien viec sap xep H phan tu co kieu du lieu T tren mang M theo thu tu
tang dua tren thuat toan sap tron truc tiep da hieu chnh. Ham su dung ham
MergeDistribute co prototype va y nghia nhu sau:
void MergeDistribute(T M|], int H, T Temp|], int L);
Ham thuc hien viec tron cac cap run co chieu dai L o hai dau day M thanh mot run
co chieu dai 2L va phan phoi luan phien cac run co chieu dai 2L nay ve hai dau day
Temp. Hoi dung cua ham nhu sau:
void MergeDistribute(T M|], int H, T Temp|], int L)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 52
{ int lT - 0, l2 - H-T, JT - 0, J2 - H-T, KT - 0, K2 - 0, Head - T;
while (lT <- l2)
{ while (M|lT] <- M|l2] && lT <- l2)
{ if (Head -- T)
{ Temp|JT] - M|lT];
JT++;
}
else
{ Temp|J2] - M|lT];
J2--;
}
lT++;
if (lT > l2)
break;
KT++;
if (KT -- L)
{ for (; K2 < L && lT <- l2; K2++, l2--)
if (Head -- T)
{ Temp|JT] - M|l2];
JT++;
}
else
{ Temp|J2] - M|l2];
J2--;
}
Head - 0-Head;
KT - K2 - 0;
break;
}
}
while (M|l2] <- M|lT] && lT <- l2)
{ if (Head -- T)
{ Temp|JT] - M|l2];
JT++;
}
else
{ Temp|J2] - M|l2];
J2--;
}
l2--;
if (lT > l2)
break;
K2++;
if (K2 -- L)
{ for (; KT < L && lT<- l2; KT++, lT++)
if (Head -- T)
{ Temp|JT] - M|lT];
JT++;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 53
}
else
{ Temp|J2] - M|lT]
J2--;
}
Head - 0-Head;
KT - K2 - 0;
break;
}
}
}
return;
}
//--------------------------------------------------------
void StraightMergeSortModify(T M|], int H)
{ int L - T ;
T * Temp - new T|H];
if (Temp -- HGLL)
return;
while (L < H)
{ MergeDistribute(M, H, Temp, L);
L - 2*L;
if (L >- H)
{ for (int l - 0; l < H; l++)
M|l] - Temp|l];
break;
}
MergeDistribute(Temp, H, M, L);
L - 2*L;
}
delete Temp;
return;
}
- Phan tch thuat toan hieu chnh:
+ Trong thuat giai nay chung ta luon thuc hien log
2
(H) lan tron - phan phoi cac run.
+ Moi lan tron-phan phoi chung ta phai thuc hien: H phep gan va H+H/2+H/2-2H
phep so sanh.
+ Trong moi truong hop:
So phep gan: C - HLog
2
(H)
So phep so sanh: S - 2HLog
2
(H)
So phep hoan v: Hmin - 0
+ Hhu vay thuat giai tron thang hieu chnh vua tiet kiem bo nho, vua thuc hien nhanh
hon thuat giai tron thang ban dau.
+ Tuy nhien, trong thuat giai tron thang chung ta da thuc hien viec phan phoi va tron
cac cap duong chay co chieu dai co dnh ma trong thuc te tren day cac duong
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 54
chay co the co chieu dai lon hon. ieu nay se giam bot so lan phan phoi va tron
cac cap duong chay cho chung ta. Thuat giai tron tu nhien duoc trnh bay sau day
se loai bo duoc nhuoc diem nay cua thuat giai tron thang.
b. Thuat toan sap xep tron t nhien (Natural Merge Sort):
- Tu tuong:
Tan dung cac duong chay tu nhien co san tren day, tien hanh tron tuong ung cac
cap duong chay tu nhien nam hai dau day M thanh mot duong chay moi va phan
phoi luan phien cac duong chay moi nay ve hai dau day phu Temp. Sau do lai tiep
tuc tron tuong ung tung cap run o hai dau day phu Temp thanh mot run moi va phan
phoi luan phien run moi nay ve hai dau day M. Cu tiep tuc nhu vay cho den khi tren
M hoac tren Temp ch con lai 0T run th ket thuc.
- Thuat toan Tron Phan phoi cac cap uong chay tu nhien:
BT: lT - T // Ch so tu dau day M
B2: l2 - H // Ch so tu cuoi day M
B3: JT - T // Ch so tu dau day Temp
B4: J2 - H // Ch so tu cuoi day Temp
B5: Head - True // Co bao phia dat run moi trong qua trnh tron - phan phoi
B6: lF (lT > l2) // a tron va phan phoi het cac run
Thuc hien Bkt
B7: lF (M|lT] M|l2]) // M|lT] dung truoc M|l2] tren Temp
B7.T: lf (Head - True)
B7.T.T: Temp|JT] - M|lT]

B7.T.2: JT++
B7.2: Else
B7.2.T: Temp|J2] - M|lT]
B7.2.2: J2--
B7.3: lT++
B7.4: lf (lT > l2)
Thuc hien Bkt
B7.5: lf (M|lT] < M|lT-T]) //a duyet het T run phia dau trong M
Thuc hien B9
B7.6: Lap lai B7
B8: ELSE // M|l2] dung truoc M|lT] tren Temp
B8.T: lf (Head - True)
B8.T.T: Temp|JT] - M|l2]
B8.T.2: JT++
B8.2: Else
B8.2.T: Temp|J2] - M|l2]
B8.2.2: J2--
B8.3: l2--
B8.4: lf (lT > l2)
Thuc hien Bkt
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 55
B8.5: lf (M|l2] < M|l2+T]) //a duyet het T run phia sau trong M
Thuc hien BT5
B8.6: Lap lai B7
//Chep phan run con lai o phia sau trong M ve Temp
B9: lF (M|l2] < M|l2+T]) //a chep het phan run con lai o phia sau trong M ve Temp
B9.T: Head - Hot(Head)
B9.2: Lap lai B6
BT0: lF (Head - True)
BT0.T: Temp|JT] - M|l2]
BT0.2: JT++
BTT: ELSE
BTT.T: Temp|J2] - M|l2]
BTT.2: J2--
BT2: l2--
BT3: lF (lT> l2)
Thuc hien Bkt
BT4: Lap lai B9
//Chep phan run con lai o phia truoc trong M ve Temp
BT5: lF (M|lT]< M|lT-T]) //a chep het phan run con lai phia truoc trong M ve Temp
BT5.T: Head - Hot(Head)
BT5.2: Lap lai B6
BT6: lF (Head - True)
BT6.T: Temp|JT] - M|lT]
BT6.2: JT++
BT7: ELSE
BT7.T: Temp|J2] - M|lT]
BT7.2: J2--
BT8: lT++
BT9: lF (lT> l2)
Thuc hien Bkt
B20: Lap lai BT5
Bkt: Ket thuc
- Thuat toan sap xep tron tu nhien:
BT: L - T //Khoi tao chieu dai ban dau cua run dau tien
//Tm chieu dai ban dau cua run dau tien
B2: lF (H < 2)
B2.T: L-H
B2.2: Thuc hien Bkt
B3: lF (M|L] M|L+T] And L < H)
B3.T: L++
B3.2: Lap lai B3
B4: lF (L - H) //Day ch con 0T run
Thuc hien Bkt
B5: Tron_Phan_Phoi(M, H, Temp, L)
B6: lF (L - H)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 56
// Chep cac phan tu tu Temp ve M
B6.T: l - T
B6.2: lf (l > H)
Thuc hien Bkt
B6.3: M|l] - Temp|l]
B6.4: l++
B6.5: Lap lai B6.2
B7: Tron_Phan_Phoi(Temp, H, M, L)
B8: Lap lai B4
Bkt: Ket thuc
- Cai at thuat toan tron tu nhien:
Ham HaturalMergeSort co prototype nhu sau:
void HaturalMergeSort(T M|], int H);
Ham thuc hien viec sap xep H phan tu co kieu du lieu T tren mang M theo thu tu
tang dua tren thuat toan sap tron truc tu nhien. Ham su dung ham
HaturalMergeDistribute co prototype va y nghia nhu sau:
void HaturalMergeDistribute(T M|], int H, T Temp|], int &L);
Ham thuc hien viec tron cac cap run o hai dau day M ma run dau tien co chieu dai L
thanh mot run moi chieu dai lon hon hoac bang L va phan phoi luan phien run moi
nay ve hai dau day Temp. Hoi dung cua ham nhu sau:
void HaturalMergeDistribute(T M|], int H, T Temp|], int &L)
{ int lT - 0, l2 - H-T, JT - 0, J2 - H-T, Head - T, FirstPair - T;
while (lT < l2)
{ while (M|lT] <- M|l2] && lT < l2)
{ if (Head -- T)
{ Temp|JT] - M|lT];
JT++;
}
else
{ Temp|J2] - M|lT];
J2--;
}
lT++;
if (M|lT] < M|lT-T])
{ while (M|l2] <- M|l2-T] && l2 > lT)
{ if (Head -- T)
{ Temp|JT] - M|l2];
JT++;
if (FirstPair -- T)
L++;
}
else
{ Temp|J2] - M|l2];
J2--;
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 57
l2--;
}
if (Head -- T)
{ Temp|JT] - M|l2];
JT++;
lf (FirstPair -- T)
L++;
}
else
{ Temp|J2] - M|l2];
J2--;
}
l2--;
FirstPair - 0;
if (lT > l2)
return;
Head - 0 Head;
break;
}
}
if (lT -- l2)
{ Temp|JT] - M|lT];
if (lT -- H-T)
L - H;
return;
}
while (M|l2] <- M|lT] && lT < l2)
{ if (Head -- T)
{ Temp|JT] - M|l2];
JT++;
if (FirstPair -- T)
L++;
}
else
{ Temp|J2] - M|l2];
J2--;
}
l2--;
if (M|l2] < M|l2+T])
{ while (M|lT] <- M|lT+T] && lT < l2)
{ if (Head -- T)
{ Temp|JT] - M|lT];
JT++;
}
else
{ Temp|J2] - M|lT];
J2--;
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 58
lT++;
}
if (Head -- T)
{ Temp|JT] - M|lT];
JT++;
}
else
{ Temp|J2] - M|lT];
J2--;
}
lT++;
FirstPair - 0;
if (lT > l2)
return;
Head - 0 Head;
break;
}
}
if (lT -- l2)
{ Temp|JT] - M|lT];
if (lT -- H-T)
L - H;
return;
}
}
return;
}
//--------------------------------------------------------
void HaruralMergeSortT(T M|], int H)
{ int L - T ;
if (H < 2)
return;
while (M|L-T] < M|L] && L<H)
L++;
T * Temp - new T|H];
if (Temp -- HGLL)
return;
while (L < H)
{ HaturalMergeDistribute(M, H, Temp, L);
if (L -- H)
{ for (int l - 0; l < H; l++)
M|l] - Temp|l];
break;
}
HaturalMergeDistribute(Temp, H, M, L);
}
delete Temp;
return;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 59
}
- V du minh hoa thuat toan:
Cia su ta can sap xep mang M co T0 phan tu sau (H - T0):
M: 5T 39 45 55 20 T5 20 T7 40 T0
Ta thuc hien cac lan tron cac cap run tu nhien o hai dau day nay va ket hop pha n
phoi cac run moi tron ve hai dau day kia nhu sau:
Lan T: L - T
Tron cac cap run tu nhien co chieu dai LT - T va L2 - 2 tren M thanh cac run co
chieu dai L - 3 va ket hop phan phoi luan phien cac run nay ve hai dau day Tmp:

M: 5T 39 45 55 20 T5 20 T7 40 T0


Tmp: T0 40 5T T5 20 55 45 39 20 T7

oi vai tro cua M va Tmp cho nhau

M: T0 40 5T T5 20 55 45 39 20 T7
Lan 2: L - 3
Tron cac cap run tu nhien co chieu dai LT - 3 va L2 - 5 tren M thanh cac run co
chieu dai L - 8 va ket hop phan phoi luan phien cac run nay ve hai dau day Tmp:

M: T0 40 5T T5 20 55 45 39 20 T7


Tmp: T0 T7 20 39 40 45 5T 55 20 T5

oi vai tro cua M va Tmp cho nhau

M: T0 T7 20 39 40 45 5T 55 20 T5

Lan 3: L - 8
Tron cac cap run tu nhien co chieu dai LT - 8 va L2 - 2 tren M thanh cac run co
chieu dai L - T0 va ket hop phan phoi luan phien cac run nay ve hai dau day Tmp:

M: T0 T7 20 39 40 45 5T 55 20 T5


Tmp: T0 T5 T7 20 20 39 40 45 5T 55

oi vai tro cua M va Tmp cho nhau

M: T0 T5 T7 20 20 39 40 45 5T 55

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 60
L - T0: Ket thuc thuat toan
- Phan tch thuat toan tron tu nhien:
+ Trong truong hop tot nhat, khi day co thu tu tang th chung ta khong phai qua
buoc phan phoi va tron nao het:
So phep gan: Cmin - T
So phep so sanh: Smin - 2(H-T) + 2 - 2H
So phep hoan v: Hmin - 0
+ Trong truong hop xau nhat, khi day co thu tu giam o nua dau va co thu tu tang o
nua cuoi va o moi buoc tron phan phoi th do dai duong chay moi cung ch tang
gap doi. Trong truong hop nay se giong nhu thuat toan tron thang da hieu chnh:
So phep gan: Cmax - HLog
2
(H)+T
So phep so sanh: Smax - 2HLog
2
(H)+2
So phep hoan v: Hmin - 0
+ Trung bnh:
So phep gan: Cavg - HLog
2
(H)/2+T
So phep so sanh: Savg - HLog
2
(H) + H + T
So phep hoan v: Havg - 0
Luu y:
+ Trong thuat toan nay chung ta cung co the su dung 2 day phu TempT, Temp2 nhu
trong thuat toan tron truc tiep, khi do chung ta luon luon duyet tu dau den cuoi
cac day chu khong can thiet phai duyet tu hai dau day vao giua. Tuy nhien, trong
truong nay th bo nho trung gian se ton nhieu hon.
+ Trong cac thuat toan sap xep theo phuong phap tron, viec su dung nhieu day phu
co the lam giam bot so lan phan phoi va tron cac run. Tuy nhien, viec quan ly cac
day phu se phuc tap hon.
3.3. Cac giai thuat sap xep ngoai (Sap xep tren tap tin)
O day, do so phan tu du lieu thuong lon nen mot phan du lieu can sap xep duoc dua
vao trong bo nho trong (PAM), phan con lai duoc luu tru o bo nho ngoai (DlSK). Do
vay, toc do sap xep du lieu tren tap tin tuong doi cham. Cac giai thuat sap xep ngoai
bao gom cac nhom sau:
- Sap xep bang phuong phap tron (merge sort),
- Sap xep theo ch muc (index sort).
Hhu vay trong phan nay chung ta tm cach sap xep tap tin F co H phan tu du lieu co
kieu T (khoa nhan dien cac phan tu du lieu co kieu T) theo thu tu tang.
..J. Sap ep LaDQ pDuoDQ pDap tzoD (HezQe Sozt,
Tuong tu nhu doi voi sap xep theo phuong phap tron tren mang, trong cac thuat giai o
day chung ta se tm cach phan phoi cac duong chay trong tap tin du lieu ve cac tap tin
trung gian va sau do lai tron tuong ung cac cap duong chay tren cac tap tin trung gian
thanh mot duong chay moi co chieu dai lon hon.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 61
Cac thuat toan sap xep bang phuong phap tron tren tap tin bao gom:
- Thuat toan sap xep tron thang hay tron truc tiep (straight merge sort),
- Thuat toan sap xep tron tu nhien (natural merge sort),
- Thuat toan tron da loi can bang (multiways merge sort),
- Thuat toan tron da pha (multiphases merge sort).
O day chung ta ch nghien cuu hai thuat toan tron dau tien.
a. Thuat toan sap xep tron trc tiep (Straight Merge Sort):
- Tu tuong:
Tuong tu nhu thuat toan tron truc tiep tren mang, ban dau tap tin Fd co H run(s) voi
chieu dai moi run: L - T, ta tien hanh phan phoi luan phien H run(s) cua tap tin Fd
ve K tap tin phu FtT, Ft2, , FtK (Moi tap tin phu co H/K run(s)). Sau do tron tuong
ung tung bo K run(s) o K tap tin phu FtT, Ft2, , FtK thanh mot run moi co chieu
dai L - K de dua ve tap tin Fd va tap tin Fd tro thanh tap tin co H/K run(s) voi chieu
dai moi run: L - K.
Hhu vay, sau moi lan phan phoi va tron cac run tren tap tin Fd th so run tren tap tin
Fd se giam di K lan, dong thoi chieu dai moi run tren Fd se tang len K lan. Do do,
sau Log
K
(H) lan phan phoi va tron th tap tin Fd ch con lai 0T run voi chieu dai la H
va khi do tap tin Fd tro thanh tap tin co thu tu.
Trong thuat giai nay, de de theo doi chung ta su dung 2 tap tin phu (K - 2) va qua
trnh phan phoi, tron cac run duoc trnh bay rieng thanh 2 thuat giai:
+ Thuat giai phan phoi luan phien (tach) cac duong chay voi chieu dai L tren tap
tin Fd ve hai tap tin phu FtT, Ft2;
+ Thuat giai tron (nhap) cac cap duong chay tren hai tap tin FtT, Ft2 co chieu dai
L ve tap tin Fd thanh cac duong chay voi chieu dai 2*L;
Cia su rang cac loi thao tac tren tap tin se b bo qua trong qua trnh thuc hien.
- Thuat toan phan phoi:
BT: Fd - fopen(DataFile, r) //Mo tap tin du lieu can sap xep de doc du lieu
B2: FtT - fopen(DataTempT, w) //Mo tap tin trung gian thu nhat de ghi du lieu
B3: Ft2 - fopen(DataTemp2, w) //Mo tap tin trung gian thu hai de ghi du lieu
B4: lF (feof(Fd)) //a phan phoi het
Thuc hien Bkt
//Chep T run tu Fd sang FtT
B5: K - T //Ch so dem de duyet cac run
B6: lF (K > L) //Duyet het T run
Thuc hien BT2
B7: fread(&a, sizeof(T), T, Fd) //oc T phan tu cua run tren Fd ra bien tam a
B8: fwrite(&a, sizeof(T), T, FtT) //Chi gia tr bien tam a vao tap tin FtT
B9: K++
BT0: lF (feof(Fd)) //a phan phoi het
Thuc hien Bkt
BTT: Lap lai B6
//Chep T run tu Fd sang Ft2
BT2: K - T
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 62
BT3: lF (K > L)
Thuc hien BT9
BT4: fread(&a, sizeof(T), T, Fd) //oc T phan tu cua run tren Fd ra bien tam a
BT5: fwrite(&a, sizeof(T), T, Ft2) //Chi gia tr bien tam a vao tap tin Ft2
BT6: K++
BT7: lF (feof(Fd)) //a phan phoi het
Thuc hien Bkt
BT8: Lap lai BT3
BT9: Lap lai B4
Bkt: Ket thuc
- Thuat toan tron:
BT: FtT - fopen(DataTempT, r) //Mo tap tin trung gian thu nhat de doc du lieu
B2: Ft2 - fopen(DataTemp2, r) //Mo tap tin trung gian thu hai de doc du lieu
B3: Fd - fopen(DataFile, w) //Mo tap tin du lieu de ghi du lieu
B4: fread(&aT, sizeof(T), T, FtT) //oc T phan tu cua run tren FtT ra bien tam aT
B5: fread(&a2, sizeof(T), T, Ft2) //oc T phan tu cua run tren Ft2 ra bien tam a2
B6: KT - T //Ch so de duyet cac run tren FtT
B7: K2 - T //Ch so de duyet cac run tren Ft2
B8: lF (aT a2) // aT dung truoc a2 tren Fd
B8.T: fwrite(&aT, sizeof(T), T, Fd)
B8.2: KT++
B8.3: lf (feof(FtT)) //a chep het cac phan tu trong FtT
Thuc hien B23
B8.4: fread(&aT, sizeof(T), T, FtT)
B8.5: lf (KT > L) //a duyet het T run trong FtT
Thuc hien BTT
B8.6: Lap lai B8
B9: ELSE // a2 dung truoc aT tren Fd
B9.T: fwrite(&a2, sizeof(T), T, Fd)
B9.2: K2++
B9.3: lf (feof(Ft2)) //a chep het cac phan tu trong Ft2
Thuc hien B27
B9.4: fread(&a2, sizeof(T), T, Ft2)
B9.5: lf (K2 > L) //a duyet het T run trong Ft2
Thuc hien BT7
B9.6: Lap lai B8
BT0: Lap lai B6
//Chep phan run con lai trong Ft2 ve Fd
BTT: lF (K2 > L) //a chep het phan run con lai trong Ft2 ve Fd
Lap lai B6
BT2: fwrite(&a2, sizeof(T), T, Fd)
BT3: K2++
BT4: lF (feof(Ft2)) //a chep het cac phan tu trong Ft2
Thuc hien B27
BT5: fread(&a2, sizeof(T), T, Ft2)
BT6: Lap lai BTT
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 63
//Chep phan run con lai trong FtT ve Fd
BT7: lF (KT > L) //a chep het phan run con lai trong FtT ve Fd
Lap lai B6
BT8: fwrite(&aT, sizeof(T), T, Fd)
BT9: KT++
B20: lF (feof(FtT)) //a chep het cac phan tu trong FtT
Thuc hien B23
B2T: fread(&aT, sizeof(T), T, FtT)
B22: Lap lai BT7
//Chep cac phan tu con lai trong Ft2 ve Fd
B23: fwrite(&a2, sizeof(T), T, Fd)
B24: lF (feof(Ft2))
Thuc hien Bkt
B25: fread(&a2, sizeof(T), T, Ft2)
B26: Lap lai B23
//Chep cac phan tu con lai trong FtT ve Fd
B27: fwrite(&aT, sizeof(T), T, Fd)
B28: lF (feof(FtT))
Thuc hien Bkt
B29: fread(&aT, sizeof(T), T, FtT)
B30: Lap lai B27
Bkt: Ket thuc
- Thuat toan sap xep tron thang:
BT: L - T //Chieu dai ban dau cua cac run
B2: lF (L H) //Tap tin Fd ch con 0T run
Thuc hien Bkt
B3: Phan_Phoi(DataFile, DataTempT, DataTemp2, L)
B4: Tron(DataTempT, DataTemp2, DataFile, L)
B5: L - 2*L
B6: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham FileStraightMergeSort co prototype nhu sau:
int FileStraightMergeSort(char * DataFile);
Ham thuc hien viec sap xep cac phan tu co kieu du lieu T tren tap tin co ten
DataFile theo thu tu tang dua tren thuat toan sap tron truc tiep. Heu viec sap xep
thanh cong ham tra ve gia tr T, trong truong hop nguoc lai (do co loi khi thuc hien
cac thao tac tren tap tin) ham tra ve gia tr T. Ham su dung cac ham FileDistribute,
FileMerge co prototype va y nghia nhu sau:
int FileDistribute(char * DataFile, char * DataTempT, char * DataTemp2, int L);
Ham thuc hien viec phan phoi luan phien cac duong chay co chieu dai L tren tap tin
du lieu co ten DataFile ve cho cac tap tin tam thoi co ten tuong ung la DataTempT
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 64
va DataTemp2. Ham tra ve gia tr T neu viec phan phoi hoan tat, trong truong hop
nguoc lai ham tra ve gia tr T.
int FileMerge(char * DataTempT, char * DataTemp2, char * DataFile, int L);
Ham thuc hien viec tron tung cap tuong ung cac duong chay voi do dai L tren hai
tap tin tam thoi co ten DataTempT, DataTemp2 ve tap tin du lieu ban dau co ten
DataFile thanh cac duong chay co chieu dai 2*L. Ham tra ve gia tr T neu viec tron
hoan tat, trong truong hop nguoc lai ham tra ve gia tr T.
Ca hai ham nay deu su dung cac ham Finished de lam nhiem vu don dep (dong
cac tap tin da mo, huy vung nho da cap phat, ) va tra ve mot gia tr nguyen de ket
thuc. Cac ham Finished co prototype nhu sau:
int Finished (FlLE * FT, int PeturnValue);
int Finished (FlLE * FT, FlLE * F2, int PeturnValue);
int Finished (FlLE * FT, FlLE * F2, FlLE * F3, int PeturnValue);
Hoi dung cua cac ham nhu sau:
int Finished (FlLE * FT, int PeturnValue)
{ fclose (FT);
return (PeturnValue);
}
//--------------------------------------------------------
int Finished (FlLE * FT, FlLE * F2, int PeturnValue)
{ fclose (FT);
fclose (F2);
return (PeturnValue);
}
//--------------------------------------------------------
int Finished (FlLE * FT, FlLE * F2, FlLE * F3, int PeturnValue);
{ fclose (FT);
fclose (F2);
fclose (F3);
return (PeturnValue);
}
//--------------------------------------------------------
int FileDistribute(char * DataFile, char * DataTempT, char * DataTemp2, int L)
{ FlLE * Fd - fopen(DataFile, rb);
if (Fd -- HGLL)
return (-T);
FlLE * FtT - fopen(DataTempT, wb);
if (FtT -- HGLL)
return(Finished(Fd, -T));
FlLE * Ft2 - fopen(DataTemp2, wb);
if (Ft2 -- HGLL)
return(Finished(Fd, FtT, -T));
T a;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 65
int SOT - sizeof(T);
while (!feof(Fd))
{ for(int K - 0; K<L && !feof(Fd); K++)
{ int t - fread(&a, SOT, T, Fd);
if (t < T)
{ if (feof(Fd))
break;
return (Finished(Fd, FtT, Ft2, -T));
}
t - fwrite(&a, SOT, T, FtT);
if (t < T)
return(Finished(Fd, FtT, Ft2, -T));
}
for(K - 0; K<L && !feof(Fd); K++)
{ int t - fread(&a, SOT, T, Fd);
if (t < T)
{ if (feof(Fd))
break;
return (Finished(Fd, FtT, Ft2, -T));
}
t - fwrite(&a, SOT, T, Ft2);
if (t < T)
return(Finished(Fd, FtT, Ft2, -T));
}
}
return (Finished(Fd, FtT, Ft2, T));
}
//--------------------------------------------------------
int FileMerge(char * DataTempT, char * DataTemp2, char * DataFile, int L)
{ FlLE * FtT - fopen(DataTempT, rb);
if (FtT -- HGLL)
return (-T);
FlLE * Ft2 - fopen(DataTemp2, rb);
if (Ft2 -- HGLL)
return (Finished(FtT, -T);
FlLE * Fd - fopen(DataFile, wb);
if (Fd -- HGLL)
return (Finished(FtT, Ft2, -T);
int KT - 0, K2 - 0;
T aT, a2;
int SOT - sizeof(T);
if (fread(&aT, SOT, T, FtT) < T)
return (Finished(Fd, FtT, Ft2, -T));
if (fread(&a2, SOT, T, Ft2) < T)
return (Finished(Fd, FtT, Ft2, -T));
while (!feof(FtT) && !feof(Ft2))
{ if (aT <- a2)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 66
{ int t - fwrite(&aT, SOT, T, Fd);
if (t < T)
return (Finished(Fd, FtT, Ft2, -T));
KT++;
t - fread(&aT, SOT, T, FtT);
if (t < T)
{ if (feof(FtT))
break;
return (Finished (Fd, FtT, Ft2, -T));
}
if (KT -- L)
{ for (; K2 < L && !feof(Ft2); K2++)
{ t - fwrite(&a2, SOT, T, Fd);
if (t < T)
return (Finished(Fd, FtT, Ft2, -T));
t - fread(&a2, SOT, T, Ft2);
if (t < T)
{ if (feof(Ft2))
break;
return (Finished(Fd, FtT, Ft2, -T));
}
}
if (feof(Ft2))
break;
}
if (KT -- L && K2 -- L)
KT - K2 - 0;
}
else
{ int t - fwrite(&a2, SOT, T, Fd);
if (t < T)
return (Finished(Fd, FtT, Ft2, -T));
K2++;
t - fread(&a2, SOT, T, Ft2);
if (t < T)
{ if (feof(FtT))
break;
return (Finished (Fd, FtT, Ft2, -T));
}
if (K2 -- L)
{ for (; KT < L && !feof(FtT); KT++)
{ t - fwrite(&aT, SOT, T, Fd);
if (t < T)
return (Finished(Fd, FtT, Ft2, -T));
t - fread(&aT, SOT, T, FtT);
if (t < T)
{ if (feof(FtT))
break;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 67
return (Finished(Fd, FtT, Ft2, -T));
}
}
if (feof(FtT))
break;
}
if (KT -- L && K2 -- L)
KT - K2 - 0;
}
}
while (!feof(FtT))
{ int t - fwrite(&aT, SOT, T, Fd);
if (t < T)
return (Finished(Fd, FtT, Ft2, -T));
t - fread(&aT, SOT, T, FtT);
if (t < T)
{ if (feof(FtT))
break;
return (Finished (Fd, FtT, Ft2, -T));
}
}
while (!feof(Ft2))
{ int t - fwrite(&a2, SOT, T, Fd);
if (t < T)
return (Finished(Fd, FtT, Ft2, -T));
t - fread(&a2, SOT, T, Ft2);
if (t < T)
{ if (feof(Ft2))
break;
return (Finished (Fd, FtT, Ft2, -T));
}
}
return (Finished(Fd, FtT, Ft2, T));
}
//--------------------------------------------------------
int FileStraightMergeSort(char * DataFile)
{ int Fhd - open(DataFile, O_PDOHLY);
if (Fhd < 0)
return (-T);
int H - filelength(Fhd)/sizeof(T);
close(Fhd);
if (H < 2)
return (T);
int L - T;
char * TempT - DataT.Tmp;
char * Temp2 - Data2.Tmp;
while (L < H)
{ if (FileDistribute(DataFile, TempT, Temp2, L) -- -T)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 68
{ remove(TempT);
remove(Temp2);
return (-T);
}
if (FileMerge(TempT, Temp2, DataFile, L) -- -T)
{ remove(TempT);
remove(Temp2);
return (-T);
}
L - 2*L;
}
remove (TempT);
remove (Temp2);
return (T);
}
- V du minh hoa thuat toan sap xep tron thang:
Cia su du lieu ban dau tren tap tin Fd nhu sau:
T0 4 T5 2 T 20 22 T5 T4 30 5 8 40 3T 36
Ta tien hanh phan phoi va tron cac duong chay co chieu dai co dnh L:
Lan T: L - T
Phan phoi luan phien cac duong chay chieu dai L - T tren Fd ve FtT va Ft2:
Fd: 10 4 15 2 1 20 22 15 14 30 5 8 40 31 36
FtT: 10 15 1 22 14 5 40 36
Ft2: 4 2 20 15 30 8 31
Tron cac cap duong chay tuong ung chieu dai L - T tren FtT va Ft2 thanh cac duong
chay chieu dai L - 2 (thuc te L co the nho hon 2) va dua ve Fd:
FtT: 10 15 1 22 14 5 40 36
Ft2: 4 2 20 15 30 8 31
Fd: 4 10 2 15 1 20 15 22 14 30 5 8 31 40 36
Lan 2: L - 2
Phan phoi luan phien cac duong chay chieu dai L 2 tren Fd ve FtT va Ft2:
Fd: 4 10 2 15 1 20 15 22 14 30 5 8 31 40 36
FtT: 4 10 1 20 14 30 31 40
Ft2: 2 15 15 22 5 8 36
Tron cac cap duong chay tuong ung chieu dai L 2 tren FtT va Ft2 thanh cac duong
chay chieu dai L 4 va dua ve Fd:
FtT: 4 10 1 20 14 30 31 40
Ft2: 2 15 15 22 5 8 36
Fd: 2 4 10 15 1 15 20 22 5 8 14 30 31 36 40
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 69
Lan 3: L - 4
Phan phoi luan phien cac duong chay chieu dai L 4 tren Fd ve FtT va Ft2:
Fd: 2 4 10 15 1 15 20 22 5 8 14 30 31 36 40
FtT: 2 4 10 15 5 8 14 30
Ft2: 1 15 20 22 31 36 40
Tron cac cap duong chay tuong ung chieu dai L 4 tren FtT va Ft2 thanh cac duong
chay chieu dai L 8 va dua ve Fd:
FtT: 2 4 10 15 5 8 14 30
Ft2: 1 15 20 22 31 36 40
Fd: 1 2 4 10 15 15 20 22 5 8 14 30 31 36 40
Lan 4: L - 8
Phan phoi luan phien cac duong chay chieu dai L 8 tren Fd ve FtT va Ft2:
Fd: 1 2 4 10 15 15 20 22 5 8 14 30 31 36 40
FtT: 1 2 4 10 15 15 20 22
Ft2: 5 8 14 30 31 36 40
Tron cac cap duong chay tuong ung chieu dai L 8 tren FtT va Ft2 thanh cac duong
chay chieu dai L T6 va dua ve Fd. Thuat toan ket thuc:
FtT: 1 2 4 10 15 15 20 22
Ft2: 5 8 14 30 31 36 40
FtT: 1 2 4 5 8 10 14 15 15 20 22 30 31 36 40
- Phan tch thuat toan:
+ Trong thuat giai nay chung ta luon thuc hien log
2
(H) lan phan phoi va tron cac run.
+ O moi lan phan phoi run chung ta phai thuc hien: H lan doc va ghi dia, 2H phep so
sanh (H lan so sanh het run va H lan so sanh het tap tin).
+ O moi lan tron run chung ta cung phai thuc hien: H lan doc va ghi dia, 2H+H/2
phep so sanh (H lan so sanh het run, H lan so sanh het tap tin va H/2 lan so sanh
cac cap gia tr tuong ung tren 2 tap tin phu).
+ Trong moi truong hop:
So lan doc va ghi dia: D - 2HLog
2
(H)
So phep so sanh: S - (4H + H/2)Log
2
(H)
+ Trong thuat toan nay chung ta su dung 2 tap tin phu de thuc hien viec phan phoi
va tron cac duong chay. Khi so tap tin phu tu 3 tap tin tro len (K>2) th cac thuat
toan tron duoc goi la tron da loi (multiways) va se lam giam so lan phan phoi tron
cac duong chay, tuc la lam giam so lan doc va ghi dia.
+ Can luu y la thoi gian thuc hien cac thua t giai sap xep/tm kiem tren tap tin phu
thuoc rat nhieu vao cac thao tac doc va ghi dia.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 70
b. Thuat toan sap xep tron t nhien (Natural Merge Sort):
- Tu tuong:
Tuong tu nhu thuat toan tron tu nhien tren mang, chung ta tan dung cac duong chay
tu nhien ban dau tren tap tin Fd co chieu dai khong co dnh. Tien hanh phan phoi
luan phien cac duong chay tu nhien nay cua tap tin Fd ve 2 tap tin phu FtT, Ft2. Sau
do tron tuong ung tung cap duong chay tu nhien o 2 tap tin phu FtT, Ft2 thanh mot
duong chay moi co chieu dai bang tong chie u dai cua cap hai duong chay dem tron
va dua ve tap tin Fd.
Hhu vay, sau moi lan phan phoi va tron cac duong chay tu nhien tren tap tin Fd th
so duong chay tu nhien tren tap tin Fd se giam di mot nua, dong thoi chieu dai cac
duong chay tu nhien cung duoc tang len. Do do, sau toi da Log
2
(H) lan phan phoi va
tron th tap tin Fd ch con lai 0T duong chay voi chieu dai la H va khi do tap tin Fd
tro thanh tap tin co thu tu.
Trong thuat giai nay chung ta su dung 2 tap tin phu (co the su dung nhieu hon) va
qua trnh phan phoi, tron cac duong chay tu nhien duoc trnh bay rieng biet thanh 2
thuat giai:
+ Thuat giai phan phoi luan phien (tach) cac duong chay tu nhien tren tap tin Fd
ve hai tap tin phu FtT, Ft2;
+ Thuat giai tron (nhap) cac cap duong chay tu nhien tren hai tap tin FtT, Ft2 ve
tap tin Fd thanh cac duong chay tu nhien vo i chieu dai lon hon;
va chung ta cung gia su rang cac loi thao tac tren tap tin se b bo qua.
- Thuat toan phan phoi:
BT: Fd - fopen(DataFile, r) //Mo tap tin du lieu can sap xep de doc du lieu
B2: FtT - fopen(DataTempT, w) //Mo tap tin trung gian thu nhat de ghi du lieu
B3: Ft2 - fopen(DataTemp2, w) //Mo tap tin trung gian thu hai de ghi du lieu
B4: lF (feof(Fd)) //a phan phoi het
Thuc hien Bkt
B5: fread(&a, sizeof(T), T, Fd) //oc T phan tu cua run tren Fd ra bien tam a
//Chep T duong chay tu nhien tu Fd sang FtT
B6: fwrite(&a, sizeof(T), T, FtT) //Chi gia tr bien tam a vao tap tin FtT
B7: lF (feof(Fd)) //a phan phoi het
Thuc hien Bkt
B8: fread(&b, sizeof(T), T, Fd) //oc tiep T phan tu cua run tren Fd ra bien tam b
B9: lF (a > b) // a duyet het T duong chay tu nhien
B9.T: a - b // Chuyen vai tro cua b cho a
B9.2: Thuc hien BT2
BT0: a - b
BTT: Lap lai B6
//Chep T duong chay tu nhien tu Fd sang Ft2
BT2: fwrite(&a, sizeof(T), T, Ft2) //Chi gia tr bien tam a vao tap tin Ft2
BT3: lF (feof(Fd)) //a phan phoi het
Thuc hien Bkt
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 71
BT4: fread(&b, sizeof(T), T, Fd) //oc T phan tu cua run tren Fd ra bien tam b
BT5: lF (a > b) // a duyet het T duong chay tu nhien
BT5.T: a - b // Chuyen vai tro cua b cho a
BT5.2: Thuc hien BT8
BT6: a - b
BT7: Lap lai BT2
BT8: Lap lai B6
Bkt: Ket thuc
- Thuat toan tron:
BT: FtT - fopen(DataTempT, r) //Mo tap tin trung gian thu nhat de doc du lieu
B2: Ft2 - fopen(DataTemp2, r) //Mo tap tin trung gian thu hai de doc du lieu
B3: Fd - fopen(DataFile, w) //Mo tap tin du lieu de ghi du lieu
B4: fread(&aT, sizeof(T), T, FtT) //oc T phan tu cua run tren FtT ra bien tam aT
B5: fread(&a2, sizeof(T), T, Ft2) //oc T phan tu cua run tren Ft2 ra bien tam a2
B6: lF (aT a2) // aT dung truoc a2 tren Fd
B6.T: fwrite(&aT, sizeof(T), T, Fd)
B6.2: lf (feof(FtT)) //a chep het cac phan tu trong FtT
Thuc hien B2T //Chep cac phan tu con lai trong Ft2 ve Fd
B6.3: fread(&bT, sizeof(T), T, FtT) //oc tiep T phan tu tren FtT ra bien tam bT
B6.4: lf (aT > bT) //a duyet het duong chay tu nhien trong FtT
B6.4.T: aT - bT // Chuyen vai tro cua bT cho aT
B6.4.2: Thuc hien B9
B6.5: aT - bT
B6.6: Lap lai B6
B7: ELSE // a2 dung truoc aT tren Fd
B7.T: fwrite(&a2, sizeof(T), T, Fd)
B7.2: lf (feof(Ft2)) // a chep het cac phan tu trong Ft2
Thuc hien B25 // Chep cac phan tu con lai trong FtT ve Fd
B7.3: fread(&b2, sizeof(T), T, Ft2) //oc tiep T phan tu tren Ft2 ra bien tam b2
B7.4: lf (a2 > b2) // a duyet het duong chay tu nhien trong Ft2
B7.4.T: a2 - b2 // Chuyen vai tro cua b2 cho a2
B7.4.2: Thuc hien BT5
B7.5: a2 - b2
B7.6: Lap lai B7
B8: Lap lai B6
//Chep phan duong chay tu nhien con lai trong Ft2 ve Fd
B9: fwrite(&a2, sizeof(T), T, Fd)
BT0: lF (feof(Ft2)) // a chep het cac phan tu trong Ft2
Thuc hien B25 //Chep cac phan tu con lai trong FtT ve Fd
BTT: fread(&b2, sizeof(T), T, Ft2)
BT2: lF (a2 > b2) // a chep het T duong chay tu nhien trong Ft2
BT2.T: a2 - b2
BT2.2: Lap lai B6
BT3: a2 - b2
BT4: Lap lai B9
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 72
//Chep phan duong chay tu nhien con lai trong FtT ve Fd
BT5: fwrite(&aT, sizeof(T), T, Fd)
BT6: lF (feof(FtT)) // a chep het cac phan tu trong FtT
Thuc hien B2T //Chep cac phan tu con lai trong Ft2 ve Fd
BT7: fread(&bT, sizeof(T), T, FtT)
BT8: lF (aT > bT) // a chep het T duong chay tu nhien trong FtT
BT8.T: aT - bT
BT8.2: Lap lai B6
BT9: aT - bT
B20: Lap lai BT5
//Chep cac phan tu con lai trong Ft2 ve Fd
B2T: fwrite(&a2, sizeof(T), T, Fd)
B22: lF (feof(Ft2))
Thuc hien Bkt
B23: fread(&a2, sizeof(T), T, Ft2)
B24: Lap lai B2T
//Chep cac phan tu con lai trong FtT ve Fd
B25: fwrite(&aT, sizeof(T), T, Fd)
B26: lF (feof(FtT))
Thuc hien Bkt
B27: fread(&aT, sizeof(T), T, FtT)
B28: Lap lai B25
Bkt: Ket thuc
- Thuat toan sap xep tron tu nhien:
BT: L - Phan_Phoi(DataFile, DataTempT, DataTemp2)
B2: lF (L H) //Tap tin Fd ch con 0T run
Thuc hien Bkt
B3: L - Tron(DataTempT, DataTemp2, DataFile)
B4: lF (L H) //Tap tin Fd ch con 0T run
Thuc hien Bkt
B5: Lap lai BT
Bkt: Ket thuc
- Cai at thuat toan:
Ham FileHaturalMergeSort co prototype nhu sau:
int FileHaturalMergeSort(char * DataFile);
Ham thuc hien viec sap xep cac phan tu co kieu du lieu T tren tap tin co ten
DataFile theo thu tu tang dua tren thuat toan sap tron tu nhien. Heu viec sap xe p
thanh cong ham tra ve gia tr T, trong truong hop nguoc lai (do co loi khi thuc hien
cac thao tac tren tap tin) ham tra ve gia tr T. Ham su dung cac ham
FileHaturalDistribute, FileHaturalMerge co prototype va y nghia nhu sau:
int FileHaturalDistribute(char * DataFile, char * DataTempT, char * DataTemp2);
Ham thuc hien viec phan phoi luan phien cac duong chay tu nhien tren tap tin du
lieu co ten DataFile ve cho cac tap tin tam thoi co ten tuong ung la DataTempT va
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 73
DataTemp2. Ham tra ve gia tr la chieu dai cua duong chay tu nhien dau tien trong
tap tin du lieu DataFile neu viec phan phoi hoan tat, trong truong hop nguoc lai ham
tra ve gia tr T.
int FileHaturalMerge(char * DataTempT, char * DataTemp2, char * DataFile);
Ham thuc hien viec tron tung cap tuong ung cac duong chay tu nhien tren hai tap tin
tam thoi co ten DataTempT, DataTemp2 ve tap tin du lieu ban dau co ten DataFile
thanh cac duong chay co chieu bang tong chieu dai 2 duong chay dem tron. Ham
tra ve chieu dai cua duong chay tu nhien dau tien sau khi tron tren tap tin DataFile
neu viec tron hoan tat, trong truong hop nguoc lai ham tra ve gia tr T.
Hoi dung cua cac ham nhu sau:
int FileHaturalDistribute(char * DataFile, char * DataTempT, char * DataTemp2)
{ FlLE * Fd - fopen(DataFile, rb);
if (Fd -- HGLL)
return (-T);
FlLE * FtT - fopen(DataTempT, wb);
if (FtT -- HGLL)
return (Finished (Fd, -T));
FlLE * Ft2 - fopen(DataTemp2, wb);
if (Ft2 -- HGLL)
return (Finished (Fd, FtT, -T));
T a, b;
int SOT - sizeof(T);
int L - 0, FirstPunT - T;
if (fread(&a, SOT, T, Fd) < T)
{ if (feof(Fd))
return (Finished(Fd, FtT, Ft2, 0));
return (Finished (Fd, FtT, Ft2, -T));
}
while (!feof(Fd))
{ do { int t - fwrite(&a, SOT, T, FtT);
if (t < T)
return (Finished (Fd, FtT, Ft2, -T));
if (FirstPunT -- T)
L++;
t - fread(&b, SOT, T, Fd);
if (t < T)
{ if (feof(Fd))
break;
return (Finished (Fd, FtT, Ft2, -T));
}
if (a > b)
{ a - b;
break;
}
a - b;
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 74
while (T);
if (feof(Fd))
break;
do { int t - fwrite(&a, SOT, T, Ft2);
if (t < T)
return (Finished (Fd, FtT, Ft2, -T));
t - fread(&b, SOT, T, Fd);
if (t < T)
{ if (feof(Fd))
break;
return (Finished (Fd, FtT, Ft2, -T));
}
if (a > b)
{ a - b;
FirstPunT - 0;
break;
}
a - b;
}
while (T);
}
return (Finished (Fd, FtT, Ft2, L);
}
//--------------------------------------------------------
int FileHaturalMerge(char * DataTempT, char * DataTemp2, char * DataFile)
{ FlLE * Fd - fopen(DataFile, "wb");
if(Fd -- HGLL)
return(-T);
FlLE * FtT - fopen(DataTempT, "rb");
if(FtT -- HGLL)
return(Finished(Fd, -T));
FlLE * Ft2 - fopen(DataTemp2, "rb");
if(Ft2 -- HGLL)
return(Finished(Fd, FtT, -T));
int aT, a2, bT, b2;
if (fread(&aT, SOT, T, FtT) < T)
return(Finished(Fd, FtT, Ft2, -T));
if (fread(&a2, SOT, T, Ft2) < T)
return(Finished(Fd, FtT, Ft2, -T));
int L - 0;
int FirstPunT - T, FirstPun2 - T;
while(!feof(FtT) && !feof(Ft2))
{ if (aT <- a2)
{ int t - fwrite(&aT, SOT, T, Fd);
if (t < T)
return(Finished(Fd, FtT, Ft2, -T));
if (FirsPunT -- T)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 75
L++;
t - fread(&bT, SOT, T, FtT);
if (t < T)
{ if (feof(FtT))
break;
return(Finished(Fd, FtT, Ft2, -T));
}
if (aT > bT)
{ do { t - fwrite(&a2, SOT, T, Fd);
if (t < T)
return(Finished(Fd, FtT, Ft2, -T));
if (FirstPun2 -- T)
L++;
t - fread(&b2, SOT, T, Ft2);
if (t < T)
{ if (feof(Ft2))
{ FirstPun2 - 0;
break;
}
return(Finished(Fd, FtT, Ft2, -T));
}
if (a2 > b2)
{ FirstPun2 - 0;
a2 - b2;
break;
}
}
while(T);
aT - bT;
FirstPunT - 0;
if (feof(Ft2))
break;
}
aT - bT;
}
else
{ int t - fwrite(&a2, SOT, T, Fd);
if (t < T)
return(Finished(Fd, FtT, Ft2, -T));
if (FirstPun2 -- T)
L++;
t - fread(&b2, SOT, T, Ft2);
if (t < T)
{ if (feof(Ft2))
break;
return(Finished(Fd, FtT, Ft2, -T));
}
if (a2 > b2)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 76
{ do { t - fwrite(&aT, SOT, T, Fd);
if (t < T)
return(Finished(Fd, FtT, Ft2, -T));
if (FrT -- T)
L++;
t - fread(&bT, SOT, T, FtT);
if (t < T)
{ if (feof(FtT))
{ FirstPunT - 0;
break;
}
return(Finished(Fd, FtT, Ft2, -T));
}
if (aT > bT)
{ FirstPunT - 0;
aT - bT;
break;
}
}
while(T);
a2 - b2;
FirstPun2 - 0;
if (feof(FtT))
break;
}
a2 - b2;
}
}
while(!feof(FtT))
{ int t - fwrite(&aT, SOT, T, Fd);
if (t < T)
return(Finished(Fd, FtT, Ft2, -T));
if (FirstPunT -- T)
L++;
t - fread(&aT, SOT, T, FtT);
if (t < T)
{ if (feof(FtT))
break;
return(Finished(Fd, FtT, Ft2, -T));
}
}
while(!feof(Ft2))
{ int t - fwrite(&a2, SOT, T, Fd);
if (t < T)
return(Finished(Fd, FtT, Ft2, -T));
if (FirstPun2 -- T)
L++;
t - fread(&a2, SOT, T, Ft2);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 77
if (t < T)
{ if (feof(Ft2))
break;
return(Finished(Fd, FtT, Ft2, -T));
}
}
return(Finished(Fd, FtT, Ft2, L));
}
//--------------------------------------------------------
int FileHaturalMergeSort(char * DataFile)
{ int Fhd - open(DataFile, O_PDOHLY);
if (Fhd < 0)
return (-T);
int H - filelength(Fhd)/sizeof(T);
close (Fhd);
if (H < 2)
return (T);
char * TempT - DataT.Tmp;
char * Temp2 - Data2.Tmp;
int L - 0;
do{ L - FileHaturalDistribute(DataFile, TempT, Temp2);
if (L -- -T)
{ remove(TempT);
remove(Temp2);
return (-T);
}
if (L -- H)
break;
L - FileHaturalMerge(TempT, Temp2, DataFile);
if (L -- -T)
{ remove(TempT);
remove(Temp2);
return (-T);
}
if (L -- H)
break;
}
while (L < H);
remove(TempT);
remove(Temp2);
return (T);
}
- V du minh hoa thuat toan sap xep tron tu nhien:
Cia su du lieu ban dau tren tap tin Fd nhu sau:
80 24 5 T2 TT 2 2 T5 T0 35 35 T8 4 T 6
Ta tien hanh phan phoi va tron cac duong chay tu nhien:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 78
Lan T: L - T
Phan phoi luan phien cac duong chay tu nhien tren Fd ve FtT va Ft2:
Fd: 80 24 5 12 11 2 2 15 10 35 35 18 4 1 6
FtT: 80 5 12 2 2 15 18 1 6
Ft2: 24 11 10 35 35 4
Tron cac cap duong chay tu nhien tuong ung tren FtT va Ft2 thanh cac duong chay
tu nhien trong do duong chay tu nhien dau tien co chieu dai L - 2 va dua ve Fd:
FtT: 80 5 12 2 2 15 18 1 6
Ft2: 24 11 10 35 35 4
Fd: 24 80 5 11 12 2 2 10 15 18 35 35 1 4 6
Lan 2: L - 2
Phan phoi luan phien cac duong chay tu nhien tren Fd ve FtT va Ft2:
Fd: 24 80 5 11 12 2 2 10 15 18 35 35 1 4 6
FtT: 24 80 2 2 10 15 18 35 35
Ft2: 5 11 12 1 4 6
Tron cac cap duong chay tu nhien tuong ung tren FtT va Ft2 thanh cac duong chay
tu nhien trong do duong chay tu nhien dau tien co chieu dai L - 5 va dua ve Fd:
FtT: 24 80 2 2 10 15 18 35 35
Ft2: 5 11 12 1 4 6
Fd: 5 11 12 24 80 1 2 2 4 6 10 15 18 35 35
Lan 3: L - 5
Phan phoi luan phien cac duong chay tu nhien tren Fd ve FtT va Ft2:
Fd: 5 11 12 24 80 1 2 2 4 6 10 15 18 35 35
FtT: 5 11 12 24 80
Ft2: 1 2 2 4 6 10 15 18 35 35
Tron cac cap duong chay tu nhien tuong ung tren FtT va Ft2 thanh cac duong chay
tu nhien trong do duong chay tu nhien dau tien co chieu dai L - T5 va dua ve Fd.
Thuat toan ket thuc:
FtT: 5 11 12 24 80
Ft2: 1 2 2 4 6 10 15 18 35 35
Fd: 1 2 2 4 5 6 10 11 12 15 18 24 35 35 80
- Phan tch thuat toan:
+ Trong truong hop tot nhat, khi day co thu tu tang th sau khi phan phoi lan thu
nhat thuat toan ket thuc, do do:
So lan doc ghi dia: Dmin - H
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 79
So phep so sanh: Smin - 2H
+ Trong truong hop xau nhat, khi day co thu tu giam va o moi buoc tron phan phoi
th do dai duong chay moi cung ch tang gap doi. Trong truong hop nay se giong
nhu thuat toan tron truc tiep:
So lan doc va ghi dia: Dmax - 2HLog
2
(H)
So phep so sanh: Smax - (4H + H/2)Log
2
(H)
+ Trung bnh:
So lan doc va ghi dia: Davg - HLog
2
(H) + H/2
So phep so sanh: Savg - (2H + H/4)Log
2
(H) + H
..2. Sap ep tDeo cD1 muc (1De Sozt,
Thong thuong kich thuoc cua cac phan tu du lieu tren tap tin du lieu kha lon va kich
thuoc cua tap tin du lieu cung lon. Va lai bien dong du lieu tren tap tin du lieu it lien tuc
ma chu yeu la chung ta truy xuat du lieu thuong xuyen. Do vay, viec doc ghi nhieu
len tap tin du lieu se lam cho thoi gian truy xuat tap tin du lieu rat mat nhieu thoi gian
va khong bao dam an toan cho du lieu. e giai quyet van de nay chung ta tien hanh
thao tac tap tin du lieu thong qua mot tap tin tuan tu ch muc theo khoa nhan dien cua
cac phan tu du lieu.
a. T tng:
Tu tap tin du lieu ban dau, chung ta tien hanh tao tap tin ch muc theo khoa nhan
dien cua cac phan tu du lieu (Tap tin ch muc duoc sap xep tang theo khoa nhan
dien cua cac phan tu du lieu). Tren co so truy xuat lan luot cac phan tu trong tap tin
ch muc chung ta se dieu khien trat tu xuat hien cua cac phan tu du lieu trong tap tin
du lieu theo dung trat tu tren tap tin ch muc. Hhu vay trong thuc tien, tap tin du lieu
khong b thay doi thu tu vat ly ban dau tren dia ma ch b thay doi trat tu xuat hien
cac phan tu du lieu khi duoc liet ke ra man hnh, may in, .
Ve cau truc cac phan tu trong tap tin ch muc th nhu da trnh bay trong phan tm
kiem theo ch muc (Chuong 2). O day chung ta ch trnh bay cach tao tap tin ch
muc theo khoa nhan dien tu tap tin du lieu ban dau va cach thuc ma tap tin ch muc
se dieu khien thu tu xuat hien cua cac phan tu du lieu tren tap tin du lieu. Hai thao
tac nay se duoc trnh bay rieng thanh hai thuat toan:
- Thuat toan tao tap tin ch muc
- Thuat toan dieu khien thu tu xuat hien cac phan tu du lieu dua tren tap tin ch muc.
b. Thuat toan:
- Thuat toan tao tap tin ch muc
BT: Fd - open(DataFile, r) //Mo tap tin du lieu de doc du lieu
B2: Fidx - open(ldxFile, w) // Mo de tao moi tap tin ch muc
B3: CurPos - 0
B4: read (Fd, a)
B5: lF (EOF(Fd))
Thuc hien BTT
B6: ai.Key - a.Key
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 80
B7: ai.Pos - CurPos
B8: write (Fidx, ai)
B9: CurPos +- SOT
BT0: Lap lai B4
BTT: close (Fd)
BT2: close (Fidx)
BT3: FileHaturalMergeSort(ldxFile)
Bkt: Ket thuc
- Thuat toan ieu khien thu tu xuat hien cac phan tu du Iieu dua tren tap tin ch muc
BT: Fd - open(DataFile, r) //Mo tap tin du lieu de doc du lieu
B2: Fidx - open(ldxFile, r) // Mo tap tin ch muc de doc
B3: read (Fidx, ai)
B4: lF (EOF(Fidx))
Thuc hien B9
B5: seek(Fd, ai.Pos)
B6: read (Fd, a)
B7: Output (a) //Xu ly phan tu du lieu moi doc duoc
B8: Lap lai B3
B9: close (Fd)
BT0: close (Fidx)
Bkt: Ket thuc
c. Cai at thuat toan:
Ham Createlndex thuc hien viec tao tap tin ch muc tu tap tin du lieu va sap xep cac
phan tu trong tap tin ch muc theo thu tu ta ng theo khoa nhan dien. Heu viec tao tap
tin ch muc thanh cong, ham tra ve gia tr T, nguoc lai ham tra ve gia tr T. Ham
Createlndex co prototype nhu sau:
int Createlndex (char * DataFile, char * ldxFile);
Hoi dung cua ham Createlndex:
int Createlndex (char * DataFile, char * ldxFile)
{ FlLE * Fd - fopen (DataFile, rb);
if (Fd -- HGLL)
return (-T);
FlLE * Fidx - fopen (ldxFile, wb);
if (Fidx -- HGLL)
return (Finished (Fd, -T));
DataType a;
ldxType ai;
int SOT - sizeof(DataType);
int SOl - sizeof(ldxType);
long CurPos - 0;
while (!feof(Fd))
{ if (fread (&a, SOT, T, Fd) < T)
{ if (feof(Fd))
break;
return (Finished (Fd, Fidx, -T));
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 81
}
ai.Key - a.Key;
ai.Pos - CurPos;
if (fwrite (&ai, SOl, T, Fidx) < T)
return (Finished (Fd, Fidx, -T));
CurPos +- SOT;
}
fclose (Fd);
fclose (Fidx);
if (FileHaturalMergeSort(ldxFile) -- -T)
{ remove (ldxFile);
return (-T);
}
return (T);
}
Ham DisplayData thuc hien dieu khien thu tu xuat hien cac phan tu du lieu tren tap
tin du lieu dua tren tap tin ch muc da duoc tao. Heu viec liet ke thanh cong, ham tra
ve gia tr T, nguoc lai ham tra ve gia tr T. Ham DisplayData co prototype nhu sau:
int DisplayData (char * DataFile, char * ldxFile);
Hoi dung cua ham DisplayData:
int DisplayData (char * DataFile, char * ldxFile)
{ FlLE * Fd - fopen (DataFile, rb);
if (Fd -- HGLL)
return (-T);
FlLE * Fidx - fopen (ldxFile, rb);
if (Fidx -- HGLL)
return (Finished (Fd, -T));
DataType a;
ldxType ai;
int SOT - sizeof(DataType);
int SOl - sizeof(ldxType);
while (!feof(Fidx))
{ if (fread (&ai, SOl, T, Fidx) < T)
{ if (feof(Fidx))
return (Finished (Fd, Fidx, T));
return (Finished (Fd, Fidx, -T));
}
fseek(Fd, ai.Pos, SEEK_SET);
if (fread (&a, SOT, T, Fd) < T)
return (Finished (Fd, Fidx, -T));
Output(a);
}
return (Finished (Fd, Fidx, T));
}
Luu y:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 82
Ham Output thuc hien viec xuat thong tin cua mot phan tu du lieu ra thiet b xuat
thong tin. Hgoai ra, neu chung ta muon xu ly du lieu trong phan tu du lieu nay theo
thu tu dieu khien boi tap tin ch muc th chung ta cung co the viet mot ham thuc
hien thao tac xu ly thay cho ham Output nay.
d. Phan tch thuat toan:
Trong thuat toan nay chung ta phai thuc hien it nhat 0T lan tao tap tin ch muc. e
tao tap tin ch muc chung ta phai thuc hien H lan doc ghi dia. Khi thuc hien viec
liet ke cac phan tu du lieu chung ta cung phai thuc hien 2H lan doc dia.
Hhuoc diem lon nhat trong thuat toan nay la chung ta phai cap nhat lai tap tin ch
muc khi co su thay doi du lieu tren tap tin du lieu.
Cau hoi va Bai tap
1. Trnh bay tu tuong cua cac thuat toan sap xep
2. Trong cac thuat toan sap xep ban thich nhat la thuat toan nao Thuat toan nao ban
khong thich nhat Tai sao
3. Trnh bay va cai dat tat ca cac thuat toan sap xep noi, ngoai theo thu tu giam Cho
nhan xet ve cac thuat toan nay
4. Hay trnh bay nhung uu khuyet diem cua moi thuat toan sap xep Theo ban cach
khac phuc nhung nhuoc diem nay la nhu the nao
5. Su dung ham random trong C de tao ra mot day M co T.000 so nguyen. Van dung
cac thuat toan sap xep de sap xep cac phan tu cua mang M theo thu tu tang dan ve
mat gia tr. Voi cung mot du lieu nhu nhau, cho biet thoi gian thuc hien cac thuat
toan Co nhan xet g doi voi cac thuat toan sap xep nay Ban hay de xuat va cai dat
thuat toan uick-Sort trong truong hop khong dung de quy
6. Thong tin ve moi so hang cua mot da thuc bac n bao gom: He so la mot so thuc,
Bac la mot so nguyen co gia tr tu 0 den T00. Hay dnh nghia cau truc du lieu de
luu tru cac da thuc trong bo nho trong cua may tinh. Voi cau truc du lieu da duoc
dnh nghia, hay van dung mot thuat toan sap xep va cai dat chuong trnh thuc hien
viec sap xep cac so hang trong da thuc theo thu tu tang dan cua cac bac.
T. Thong tin ve cac phong thi tai mot hoi dong thi bao gom: So phong la mot so
nguyen co gia tr tu T den 200, Hha la mot chu cai in hoa tu A Z, Kha nang
chua la mot so nguyen co gia tr tu T0 250. Hay dnh nghia cau truc du lieu de
luu tru cac phong thi nay trong bo nho trong cua may tinh. Voi cau truc du lieu da
duoc dnh nghia, van dung cac thuat toan sap xep va cai dat chuong trnh thuc hien
viec cac cong viec sau:
- Sap xep va in ra man hnh danh sach cac phong thi theo thu tu giam dan ve Kha
nang chua.
- Sap xep va in ra man hnh danh sach cac phong thi theo thu tu tang dan theo
Hha (Tu A Z), cac phong cung mot nha th sap xep theo thu tu tang dan theo
So phong.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 83
- Sap xep va in ra man hnh danh sach cac phong thi theo thu tu tang dan theo
Hha (Tu A Z), cac phong cung mot nha th sap xep theo thu tu giam dan theo
Kha nang chua.
8. Tao tap tin du lieu SOHCGYEH.DAT gom T0000 so nguyen. Van dung cac thuat toan
sap xep tren file, hay cai dat chuong trnh de sap xep du lieu tren tap tin nay theo
thu tu tang dan ve gia tr cua cac so nguyen trong do. Cho biet thoi gian thuc hien
moi thuat toan Co nhan xet g doi voi cac thuat toan nay
9. Thong tin ve mot sinh vien bao gom: Ma so la mot so nguyen duong, Ho va dem
la mot chuoi co toi da 20 ky tu, Ten sinh vien la mot chuoi co toi da T0 ky tu,
Hgay, thang, nam sinh la cac so nguyen duong, Phai La Ham hoac Hu, iem
trung bnh la cac so thuc co gia tr tu 0.00 T0.00. Viet chuong trnh nhap vao
danh sach sinh vien (it nhat la T0 sinh vien, khong nhap trung ma giua cac sinh vien
voi nhau) va luu tru danh sach nay vao tap tin co ten SlHHVlEH.DAT, sau do van
dung cac thuat toan sap xep tren file de sap xep danh sach sinh vien theo thu tu tang
dan theo Ma sinh vien. ln danh sach sinh vien trong file SlHHVlEH.DAT sau khi sap
xep ra man hnh.
10. Voi tap tin du lieu co ten SlHHVlEH.DAT trong bai tap 9, thuc hien cac yeu cau sau:
- Tao cac tap tin ch muc theo cac khoa trong cac truong hop sau:
+ Ch muc sap xep theo Ma sinh vien tang dan;
+ Ch muc sap xep theo Ten sinh vien tu A Z, neu cung ten th sap sep Ho va
dem theo thu tu tu A Z;
+ Ch muc sap xep theo iem trung bnh giam dan.
- Luu cac tap tin ch muc theo cac khoa nhu trong ba truong hop neu tren vao
trong dia voi cac ten tuong ung la SVMASO.lDX, SVTH.lDX, SVDTB.lDX.
- Dua vao cac tap tin ch muc, in ra toan bo danh sach sinh vien trong tap tin
SlHHVlEH.DAT theo dung thu su sap xep quy dnh trong cac tap tin ch muc.
- Co nhan xet g khi thuc hien viec sap xep du lieu tren tap tin theo ch muc.
11. Trnh bay va cai dat cac thuat toan de cap nhat lai tap tin ch muc khi tap tin du
lieu b thay doi trong cac truong hop sau:
- Khi them 0T phan tu du lieu vao tap tin du lieu.
- Khi huy 0T phan tu du lieu trong tap tin du lieu.
- Khi hieu chnh thanh khoa ch muc cua 0T phan tu du lieu trong tap tin du lieu.
12. Trnh bay va cai dat cac thuat toan de minh hoa (mo phong) cac buoc trong qua
trnh sap xep du lieu cho cac thuat toan sap xep noi (Su dung cac giao dien do hoa
de cai dat),

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 84
Chng 4: DANH SACH (LIST)
4.1. Khai niem ve danh sach
Danh sach la tap hop cac phan tu co kieu du lieu xac dnh va giua chung co mot moi
lien he nao do.
So phan tu cua danh sach goi la chieu dai cua danh sach. Mot danh sach co chieu dai
bang 0 la mot danh sach rong.
4.2. Cac phep toan tren danh sach
Tuy thuoc vao dac diem, tinh chat cua tung loai danh sach ma moi loai danh sach co
the co hoac ch can thiet co mot so phep toan (thao tac) nhat dnh nao do. Hoi chung,
tren danh sach thuong co cac phep toan nhu sau:
- Tao moi mot danh sach:
Trong thao tac nay, chung ta se dua vao danh sach noi dung cua cac phan tu, do
vay chieu dai cua danh sach se duoc xac dnh. Trong mot so truong hop, chung ta
ch can khoi tao gia tr va trang thai ban dau cho danh sach.
- Them mot phan tu vao danh sach:
Thao tac nay nham them mot phan tu vao trong danh sach, neu viec them thanh
cong th chieu dai cua danh sach se tang len T. Cung tuy thuoc vao tung loai danh
sach va tung truong hop cu the ma viec them phan tu se duoc tien hanh dau, cuoi
hay giua danh sach.
- Tm kiem mot phan tu trong danh sach:
Thao tac nay se van dung cac thuat toan tm kiem de tm kiem mot phan tu tren
danh sach thoa man mot tieu chuan nao do (thuong la tieu chuan ve gia tr).
- Loai bo bot mot phan tu ra khoi danh sach:
Hguoc voi thao tac them, thao tac nay se loai bo bot mot phan tu ra khoi danh sach
do vay, neu viec loai bo thanh cong th chieu dai cua danh sach cung b giam xuong
T. Thong thuong, truoc khi thuc hien thao tac nay chung ta thuong phai thuc hien
thao tac tm kiem phan tu can loai bo.
- Cap nhat (sua oi) gia tr| cho mot phan tu trong danh sach:
Thao tac nay nham sua doi noi dung cua mot phan tu trong danh sach. Tuong tu nhu
thao tac loai bo, truoc khi thay doi thuong chung ta cung phai thuc hien thao tac tm
kiem phan tu can thay doi.
- Sap xep thu tu cac phan tu trong danh sach:
Trong thao tac nay chung ta se van dung cac thuat toan sap xep de sap xep cac
phan tu tren danh sach theo mot trat tu xac dnh.
- Tach mot danh sach thanh nhieu danh sach:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 85
Thao tac nay thuc hien viec chia mot danh sach thanh nhieu danh sach con theo mot
tieu thuc chia nao do. Ket qua sau khi chia la tong chieu dai trong cac danh sach
con phai bang chieu dai cua danh sach ban dau.
- Nhap nhieu danh sach thanh mot danh sach:
Hguoc voi thao tac chia, thao tac nay tien hanh nhap nhieu danh sach con thanh mot
danh sach co chieu dai bang tong chieu dai cac danh sach con. Tuy vao tung truong
hop ma viec nhap co the la:
+ Chep noi duoi cac danh sach lai voi nhau,
+ Tron xen lan cac phan tu trong danh sach con vao danh sach lon theo mot trat
tu nhat dnh.
- Sao chep mot danh sach:
Thao tac nay thuc hien viec sao chep toan bo noi dung cua danh sach nay sang mot
danh sach khac sao cho sau khi sao chep, hai danh sach co noi dung giong het nhau.
- Huy danh sach:
Thao tac nay se tien hanh huy bo (xoa bo) toan bo cac phan tu trong danh sach.
Viec xoa bo nay tuy vao tung loai danh sach ma co the la xoa bo toan bo noi dung
hay ca noi dung lan khong gian bo nho luu tru danh sach.
4.3. Danh sach ac (Condensed List)
4..J. (DD DQD1a
Danh sach dac la danh sach ma khong gian bo nho luu tru cac phan tu duoc dat lien
tiep nhau trong bo nho.
4..2. E1eu 1eD aDD acD dac
e bieu dien danh sach dac chung ta su dung mot day (mang) cac phan tu co kieu du
lieu la kieu du lieu cua cac phan tu trong danh sach. Do vay, chung ta can biet truoc so
phan tu toi da cua mang cung chinh la chieu dai toi da cua danh sach thong qua mot
hang so nguyen. Hgoai ra, do chieu dai cua danh sach luon luon bien dong cho nen
chung ta cung can quan ly chieu dai thuc cua danh sach thong qua mot bien nguyen.
Cia su chung ta quy uoc chieu dai toi da cua danh sach dac la T0000, khi do cau truc
du lieu de bieu dien danh sach dac nhu sau:
const int MaxLen - T0000; // hoac: +define MaxLen T0000
int Length;
T CD_LlST|MaxLen]; // hoac: T * CD_LlST - new T|MaxLen];
Heu chung ta su dung co che cap phat dong de cap phat bo nho cho danh sach dac th
can kiem tra su thanh cong cua viec cap phat dong.
4... Cac tDao tac tzeD aDD acD dac
O day co nhieu thao tac da duoc trnh bay o cac chuong truoc, do vay chung ta khong
trnh bay lai ma ch liet ke cho co he thong hoac trnh bay tom tat nhung noi dung
chinh cua cac thao tac nay.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 86
Cac thao tac co ban tren danh sach dac nhu sau:
a. Khi tao danh sach (Initialize):
Trong thao tac nay ch don gian la chung ta cho chieu dai cua danh sach ve 0. Ham
khoi tao danh sach dac nhu sau:
void CD_lnitialize(int &Len)
{ Len - 0;
return;
}
b. Tao mi danh sach/ Nhap danh sach:
Ham CD_Create_List co prototype:
int CD_Create_List(T M|], int &Len);
Ham tao danh sach dac co chieu dai toi da MaxLen. Ham tra ve chieu dai thuc cua
danh sach sau khi tao.
Hoi dung cua ham nhu sau:
int CD_Create_List(T M|], int &Len)
{ if (Len > MaxLen)
Len - MaxLen;
for (int i - 0; i < Len; i++)
M|i] - lnput_One_Element();
return (Len);
}
Luu y: Ham lnput_One_Element thuc hien nhap vao noi dung cua mot phan tu co kieu
du lieu T va tra ve gia tr cua phan tu moi nhap vao. Tuy vao tung truong hop
cu the ma chung ta viet ham lnput_One_Element cho phu hop.
c. Them mot phan t vao trong danh sach:
Cia su chung ta can them mot phan tu co gia tr HewValue vao trong danh sach M co
chieu dai Length tai v tri lnsPos.
- Thuat toan:
BT: lF (Length - MaxLen)
Thuc hien Bkt
//Doi cac phan tu tu v tri lnsPos->Length ra sau mot v tri
B2: Pos - Length+T
B3: lF (Pos - lnsPos)
Thuc hien B7
B4: M|Pos] - M|Pos-T]
B5: Pos--
B6: Lap lai B3
B7: M|lnsPos] - HewValue //ua phan tu co gia tr HewValue vao v tri lnsPos
B8: Length++ //Tang chieu dai cua danh sach len T
Bkt: Ket thuc
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 87
- Cai at thuat toan:
Ham CD_lnsert_Element co prototype:
int CD_lnsert_Element(T M|], int &Len, T HewValue, int lnsPos);
Ham thuc hien viec chen phan tu co gia tr HewValue vao trong danh sach M co
chieu dai Len tai v tri lnsPos. Ham tra ve chieu dai thuc cua danh sach sau khi
chen neu viec chen thanh cong va nguoc lai, ham tra ve gia tr -T. Hoi dung cua
ham nhu sau:
int CD_lnsert_Element(T M|], int &Len, T HewValue, int lnsPos)
{ if (Len -- MaxLen)
return (-T);
for (int i - Len; i > lnsPos; i--)
M|i] - M|i-T];
M|lnsPos] - HewValue;
Len++;
return (Len);
}
d. Tm kiem mot phan t trong danh sach:
Thao tac nay chung ta su dung cac thuat toan tm kiem noi (Tm tuyen tinh hoac tm
nh phan) da duoc trnh bay trong Chuong 2.
e. Loai bo bt mot phan t ra khoi danh sach:
Cia su chung ta can loai bo phan tu tai v tri DelPos trong danh sach M co chieu dai
Length (Trong mot so truong hop co the chung ta phai thuc hien thao tac tm kiem
de xac dnh v tri cua phan tu can xoa).
- Thuat toan:
BT: lF (Length - 0 OP DelPos > Len)
Thuc hien Bkt
//Doi cac phan tu tu v tri DelPos+T->Length ra truoc mot v tri
B2: Pos - DelPos
B3: lF (Pos - Length)
Thuc hien B7
B4: M|Pos] - M|Pos+T]
B5: Pos++
B6: Lap lai B3
B7: Length-- //Ciam chieu dai cua danh sach di T
Bkt: Ket thuc
- Cai at thuat toan:
Ham CD_Delete_Element co prototype:
int CD_Delete_Element(T M|], int &Len, int DelPos);
Ham thuc hien viec xoa phan tu tai v tri DelPos trong danh sach M co chieu dai
Len. Ham tra ve chieu dai thuc cua danh sach sau khi xoa neu viec xoa thanh
cong va nguoc lai, ham tra ve gia tr -T. Hoi dung cua ham nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 88
int CD_Delete_Element(T M|], int &Len, int DelPos)
{ if (Len -- 0 ll DelPos >- Len)
return (-T);
for (int i - DelPos; i < Len-T; i++)
M|i] - M|i+T];
Len--;
return (Len);
}
f. Cap nhat (sa oi) gia tr cho mot phan t trong danh sach:
Cia su chung ta can sua doi phan tu tai v tri ChgPos trong danh sach M co chieu dai
Length thanh gia tr moi HewValue. Thao tac nay ch don gia la viec gan lai gia tr
moi cho phan tu can thay doi: M|ChgPos] - HewValue;
Trong mot so truong hop, truoc tien chung ta phai thuc hien thao tac tm kiem phan
tu can thay doi gia tr de xac dnh v tri cua no sau do moi thuc hien phep gan nhu
tren.
g. Sap xep th t cac phan t trong danh sach:
Thao tac nay chung ta su dung cac thuat toan sap xep noi (tren mang) da trnh bay
trong Chuong 3.
h. Tach mot danh sach thanh nhieu danh sach:
Tuy thuoc vao tung yeu cau cu the ma viec tach mot danh sach thanh nhieu danh
sach co the thuc hien theo nhung tieu thuc khac nhau:
+ Co the phan phoi luan phien theo cac duong chay nhu da trnh bay trong cac
thuat toan sap xep theo phuong phap tron o Chuong 3;
+ Co the phan phoi luan phien tung phan cua danh sach can tach cho cac danh
sach con. O day chung ta se trnh bay theo cach phan phoi nay;
+ Tach cac phan tu trong danh sach thoa man mot dieu kien cho truoc.
Cia su chung ta can tach danh sach M co chieu dai Length thanh cac danh sach con
SMT, SM2 co chieu dai tuong ung la SLenT, SLen2.
- Thuat toan:
// Kiem tra tinh hop le cua SLenT va SLen2: SLenT + SLen2 - Length
BT: lF (SLenT Length)
BT.T: SLenT - Length
BT.2: SLen2 - 0
B2: lF (SLen2 Length)
B2.T: SLen2 - Length
B2.2: SLenT - 0
B3: lF (SLenT + Slen2 Length)
SLen2 - Length SLenT
B4: lF (SLenT < 0)
SLenT - 0
B5: lF (SLen2 < 0)
SLen2 - 0
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 89
// Chep SLenT phan tu dau trong M vao SMT
B6: i - T, si - T
B7: lF (i > SLenT)
Thuc hien BTT
B8: SMT|si] - M|i]
B9: i++, si++
BT0: Lap lai B7
// Chep SLen2 phan tu cuoi trong M vao SM2
BTT: si - T
BT2: lF (i > Length)
Thuc hien Bkt
BT3: SM2|si] - M|i]
BT4: i++, si++
BT5: Lap lai BT2
Bkt: Ket thuc
- Cai at thuat toan:
Ham CD_Split co prototype:
void CD_Split(T M|], int Len, T SMT|], int &SLenT, T SM2|], int &SLen2);
Ham thuc hien viec sao chep noi dung SLenT phan tu dau tien trong danh sach M
vao trong danh con SMT va sao chep SLen2 phan tu cuoi cung trong danh sach M
vao trong danh sach con SM2. Ham hieu chnh lai SLenT, SLen2 neu can thiet.
Hoi dung cua ham nhu sau:
void CD_Split(T M|], int Len, T SMT|], int &SLenT, T SM2|], int &SLen2)
{ if (SLenT >- Len)
{ SLenT - Len;
SLen2 - 0;
}
if (SLen2 >- Len)
{ SLen2 - Len;
SLenT - 0;
}
if (SLenT < 0) SLenT - 0;
if (SLen2 < 0) SLen2 - 0;
if (SLenT + SLen2 !- Len)
SLen2 - Len SLenT;
for (int i - 0; i < SLenT; i++)
SMT|i] - M|i];
for (int | - 0; i < Len; i++, |++)
SM2||] - M|i];
return;
}
i. Nhap nhieu danh sach thanh mot danh sach:
Tuy thuoc vao tung yeu cau cu the ma viec nhap nhieu danh sach thanh mot danh
sach co the thuc hien theo cac phuong phap khac nhau, co the la:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 90
+ Chep noi duoi cac danh sach lai voi nhau;
+ Tron xen lan cac phan tu trong danh sach con vao danh sach lon theo mot trat
tu nhat dnh nhu chung ta da trnh bay trong cac thuat toan tron o Chuong 3.
O day chung ta trnh bay cach ghep cac danh sach thanh mot danh sach.
Cia su chung ta can ghep cac danh sach SMT, SM2 co chieu dai SLenT, SLen2 vao
thanh mot danh sach M co chieu dai Length - SLenT + SLen2 theo thu tu tu SMT roi
den SM2.
- Thuat toan:
// Kiem tra kha nang chua cua M: SLenT + SLen2 MaxLen
BT: lF (SLenT + SLen2 > MaxLen)
Thuc hien Bkt
// Chep SLenT phan tu dau trong SMT vao dau M
B2: i - T
B3: lF (i > SLenT)
Thuc hien B7
B4: M|i] - SMT|i]
B5: i++
B6: Lap lai B3
// Chep SLen2 phan tu dau trong SM2 vao sau M
B7: si - T
B8: lF (si > SLen2)
Thuc hien Bkt
B9: M|i] - M2|si]
BT0: i++, si++
BTT: Lap lai B8
Bkt: Ket thuc
- Cai at thuat toan:
Ham CD_Concat co prototype:
int CD_Concat (T SMT|], int SLenT, T SM2|], int SLen2, T M|], int &Len);
Ham thuc hien viec sao ghep noi dung hai danh sach SMT, SM2 co chieu dai
tuong ung SLenT, SLen2 ve danh sach M co chieu dai Len - SLenT + SLen2 theo
thu tu SMT den SM2. Ham tra ve chieu dai cua danh sach M sau khi ghep neu viec
ghep thanh cong, trong truong hop nguoc lai ham tra ve gia tr -T.
Hoi dung cua ham nhu sau:
int CD_Concat (T SMT|], int SLenT, T SM2|], int SLen2, T M|], int &Len)
{ if (SLenT + SLen2 > MaxLen)
return (-T);
for (int i - 0; i < SLenT; i++)
M|i] - SMT|i];
for (int | - 0; | < SLen2; i++, |++)
M|i] - SM2||];
Len - SLenT + SLen2;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 91
return (Len);
}
j. Sao chep mot danh sach:
Cia su chung ta can sao chep noi dung dach sach M co chieu dai Length vao thanh
danh sach CM co cung chieu dai.
- Thuat toan:
BT: i - T
B2: lF (i > Length)
Thuc hien Bkt
B3: CM|i] - M|i]
B4: i++
B5: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham CD_Copy co prototype:
int CD_Copy (T M|], int Len, T CM|]);
Ham thuc hien viec sao chep noi dung danh sach M co chieu dai Len ve danh
sach CM co cung chieu dai. Ham tra ve chieu dai cua danh sach CM sau khi sao
chep.
Hoi dung cua ham nhu sau:
int CD_Copy (T M|], int Len, T CM|])
{ for (int i - 0; i < Len; i++)
CM|i] - M|i];
return (Len);
}
k. Huy danh sach:
Trong thao tac nay, neu danh sach duoc cap phat dong th chung ta tien hanh huy
bo (xoa bo) toan bo cac phan tu trong danh sach bang toan tu huy bo (trong C/C++
la free/delete). Heu danh sach duoc cap phat tinh th viec huy bo ch la tam thoi cho
chieu dai cua danh sach ve 0 con viec thu hoi bo nho se do ngon ngu tu thuc hien.
4..4. Uu DDuoc d1em Va UDQ uDQ
a. u nhc iem:
Do cac phan tu duoc luu tru lien tiep nhau trong bo nho, do vay danh sach dac co
cac uu nhuoc diem sau day:
- Mat do su dung bo nho cua danh sach dac la toi uu tuyet doi (T00);
- Viec truy xuat va tm kiem cac phan tu cua danh sach dac la de dang v cac phan
tu dung lien nhau nen chung ta ch can su dung ch so de dnh v v tri cac phan tu
trong danh sach (dnh v da ch cac phan tu);
- Viec them, bot cac phan tu trong danh sach dac co nhieu kho khan do chung ta
phai di doi cac phan tu khac di qua cho khac.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 92
b. ng dung cua danh sach ac:
Danh sach dac duoc ung dung nhieu trong cac cau truc du lieu mang: mang T chieu,
mang nhieu chieu; Mang cap phat tinh, mang cap phat dong; ma chung ta da
nghien cuu va thao tac kha nhieu trong qua trnh lap trnh tren nhieu ngon ngu lap
trnh khac nhau.
4.4. Danh sach lien ket (Linked List)
4.4.J. (DD DQD1a
Danh sach lien ket la tap hop cac phan tu ma giua chung co mot su noi ket voi nhau
thong qua vung lien ket cua chung.
Su noi ket giua cac phan tu trong danh sach lien ket do la su quan ly, rang buoc lan
nhau ve noi dung cua phan tu nay va da ch dnh v phan tu kia. Tuy thuoc vao muc do
va cach thuc noi ket ma danh sach lien ket co the chia ra nhieu loai khac nhau:
- Danh sach lien ket don;
- Danh sach lien ket doi/kep;
- Danh sach da lien ket;
- Danh sach lien ket vong (vong don, vong doi).
Moi loai danh sach se co cach bieu dien cac phan tu (cau truc du lieu) rieng va cac
thao tac tren do. Trong tai lieu nay chung ta ch trnh bay 02 loai danh sach lien ket co
ban la danh sach lien ket don va danh sach lien ket doi.
4.4.2. DaDD acD J1eD Ret doD (S1DQJy L1DRe L1t,
A. Cau truc du Iieu:
Hoi dung cua moi phan tu trong danh sach lien ket (con goi la mot nut) gom hai
vung: Vung du lieu va Vung lien ket va co cau truc du lieu nhu sau:
typedef struct SLL_Hode
{ T Key;
lnfoType lnfo;
SLL_Hode * HextHode; // Vung lien ket quan ly da ch phan tu ke tiep
} SLL_OneHode;
Tuong tu nhu trong cac chuong truoc, o day de don gian chung ta cung gia thiet
rang vung du lieu cua moi phan tu trong danh sach lien ket don ch bao gom mot
thanh phan khoa nhan dien (Key) cho phan tu do. Khi do, cau truc du lieu tren co
the viet lai don gian nhu sau:
typedef struct SLL_Hode
{ T Key;
SLL_Hode * HextHode; // Vung lien ket quan ly da ch phan tu ke tiep
} SLL_OneHode;
typedef SLL_OneHode * SLL_Type;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 93
e quan ly mot danh sach lien ket chung ta co the su dung nhieu phuong phap kha c
nhau va tuong ung voi cac phuong phap nay chung ta se co cac cau truc du lieu
khac nhau, cu the:
- Quan Iy |a ch phan tu au danh sach:
SLL_Type SLListT;
Hnh anh minh hoa:
SLList1 NULL
15 10 20 18 40 35 30

- Quan Iy |a ch phan tu au va cuoi danh sach:
typedef struct SLL_PairHode
{ SLL_Type SLLFirst;
SLL_Type SLLLast;
} SLLP_Type;
SLLP_Type SLList2;
Hnh anh minh hoa:
SLLFirst SLLLast NULL
15 10 20 18 40 35 30

- Quan Iy |a ch phan tu au, |a ch phan tu cuoi va so phan tu trong danh sach:
typedef struct SLL_PairHHode
{ SLL_Type SLLFirst;
SLL_Type SLLLast;
unsigned HumHode;
} SLLPH_Type;
SLLPH_Type SLList3;
Hnh anh minh hoa:
SLLFirst SLLLast NULL
15 10 20 18 40 35 30
HumHode - 7
B. Cac thao tac tren danh sach Iien ket on:
Voi moi cach quan ly khac nhau cua danh sach lien ket don , cac thao tac cung se
co su khac nhau ve mat chi tiet song noi dung co ban it co su khac nhau. Do vay, o
day chung ta ch trnh bay cac thao tac theo cach quan ly thu nhat (quan ly da ch
cua phan tu dau danh sach lien ket don), cac cach quan ly khac sinh vien tu van
dung de dieu chnh cho thich hop.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 94
a. Khi tao danh sach (Initialize):
Trong thao tac nay ch don gian la chung ta cho gia tr con tro quan ly da ch phan
tu dau danh sach ve con tro HGLL. Ham khoi tao danh sach lien ket don nhu sau:
void SLL_lnitialize(SLL_Type &First)
{ First - HGLL;
return;
}
Hnh anh minh hoa:
SLList1 NULL

b. Tao mi mot phan t / nut:
Cia su chung ta can tao moi mot phan tu co thanh phan du lieu la HewData.
- Thuat toan:
BT: First - new SLL_OneHode
B2: lF (First - HGLL)
Thuc hien Bkt
B3: First->HextHode - HGLL
B4: First->Key - HewData
Bkt: Ket thuc
- Cai at thuat toan:
Ham SLL_Create_Hode co prototype:
SLL_Type SLL_Create_Hode(T HewData);
Ham tao moi mot nut co thanh phan du lieu la HewData, ham tra ve con tro tro
toi da ch cua nut moi tao. Heu khong du bo nho de tao, ham tra ve con tro
HGLL.
SLL_Type SLL_Create_Hode(T HewData)
{ SLL_Type Pnode - new SLL_OneHode;
if (Pnode !- HGLL)
{ Pnode->HextHode - HGLL;
Pnode->Key - HewData;
}
return (Pnode);
}
- Minh hoa thuat toan:
Cia su chung ta can tao nut co thanh phan du lieu la 20: HewData - 20
Pnode - new SLL_OneHode
Pnode

Pnode->HextHode - HGLL
Pnode->Key - HewData
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 95
Pnode 20 NULL
c. Them mot phan t vao trong danh sach:
Cia su chung ta can them mot phan tu co gia tr thanh phan du lieu la HewData vao
trong danh sach. Viec them co the dien ra o dau, cuoi hay o giua danh sach lien ket.
Do vay, o day chung ta trnh bay 3 thao tac them rieng biet nhau:
- Thuat toan them phan tu vao au danh sach Iien ket on:
BT: HewHode - SLL_Create_Hode (HewData)
B2: lF (HewHode - HGLL)
Thuc hien Bkt
B3: HewHode->HextHode - SLList // Hoi SLList vao sau HewHode
B4: SLList - HewHode // Chuyen vai tro dung dau cua HewHode cho SLList
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them nut co thanh phan du lieu la 25: HewData - 25
NewNode
25 NULL
NULL
SLList 10 20 18 40 35 30

HewHode->HextHode - SLList:
NewNode
25
NULL
SLList 10 20 18 40 35 30

SLList - HewHode:
NewNode
25
SLList NULL
10 20 18 40 35 30

Ket qua sau khi chen:
SLList NULL
25 10 20 18 40 35 30

- Thuat toan them phan tu vao cuoi danh sach Iien ket on:
BT: HewHode - SLL_Create_Hode (HewData)
B2: lF (HewHode - HGLL)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 96
Thuc hien Bkt
B3: lF (SLList - HGLL)
B3.T: SLList - HewHode
B3.2: Thuc hien Bkt
// Tm den da ch cua phan tu cuoi cung trong danh sach lien ket don
B4: CurHode - SLList
B5: lF (CurHode->HextHode - HGLL)
Thuc hien B8
B6: CurHode - CurHode->HextHode // Chuyen qua nut ke tiep
B7: Lap lai B5
B8: CurHode->HextHode - HewHode // Hoi HewHode vao sau CurHode
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them nut co thanh phan du lieu la 25: HewData - 25
NULL
NewNode 25
SLList CurNode
15 10 20 18 40 35 NULL

CurHode->HextHode - HewHode:
NULL
NewNode 25
SLList CurNode
15 10 20 18 40 35

Ket qua sau khi chen:
SLList NULL
15 10 20 18 40 35 25

- Thuat toan them phan tu vao giua danh sach Iien ket on:
Cia su chung ta can them mot phan tu co gia tr thanh phan du lieu la HewData
vao trong danh sach SLList vao ngay sau nut co da ch lnsHode. Trong thuc te
nhieu khi chung ta phai thuc hien thao tac tm kiem de xac dnh da ch lnsHode, o
day gia su chung ta da xac dnh duoc da ch nay.
BT: HewHode - SLL_Create_Hode (HewData)
B2: lF (HewHode - HGLL)
Thuc hien Bkt
B3: lF (lnsHode->HextHode - HGLL)
B3.T: lnsHode->HextHode - HewHode
B3.2: Thuc hien Bkt
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 97
// Hoi cac nut ke sau lnsHode vao sau HewHode
B4: HewHode->HextHode - lnsHode->HextHode
// Chuyen moi lien ket giua lnsHode voi nut ke cua no ve HewHode
B5: lnsHode->HextHode - HewHode
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them nut co thanh phan du lieu la 25 vao sau nut co da ch
lnsHode nhu sau: HewData - 25
NewNode 25 NULL
SLList InsNode
15 10 20 18 40 35 NULL

HewHode->HextHode - lnsHode->HextHode:
NewNode 25
SLList InsNode
15 10 20 18 40 35 NULL

lnsHode->HextHode - HewHode:
NewNode 25
SLList
15 10 20 18 40 35 NULL
InsNode
Ket qua sau khi chen:
SLList NULL
15 10 20 25 18 40 35

- Cai at thuat toan:
Cac ham them phan tu tuong ung voi cac truong hop co prototype nhu sau:
SLL_Type SLL_Add_First(SLL_Type &SList, T HewData);
SLL_Type SLL_Add_Last(SLL_Type &SList, T HewData);
SLL_Type SLL_Add_Mid(SLL_Type &SList, T HewData, SLL_Type &lnsHode);
Ham thuc hien viec chen phan tu co gia tr thanh phan du lieu HewData vao trong
danh sach lien ket don quan ly boi con tro dau danh sach SList tuong ung voi 3
truong hop: Them dau, them cuoi, them giua. Cac ham tra ve gia tr la da ch cua
nut dau tien neu viec them thanh cong. Trong truong hop nguoc lai, cac ham tra
ve con tro HGLL.
Pieng doi voi truong hop them giua, ham SLL_Add_Mid thuc hien viec them vao
ngay sau nut co da ch lnsHode. Hoi dung cua cac ham nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 98
SLL_Type SLL_Add_First(SLL_Type &SList, T HewData)
{ SLL_Type HewHode - SLL_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HGLL);
HewHode->HextHode - SList;
SList - HewHode;
return (SList);
}
//-----------------------------------------------------------------
SLL_Type SLL_Add_Last(SLL_Type &SList, T HewData)
{ SLL_Type HewHode - SLL_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HGLL);
if (SList -- HGLL)
{ SList - HewHode;
return (SList);
}
SLL_Type CurHode - SList;
while (CurHode->HextHode !- HGLL)
CurHode - CurHode->HextHode;
CurHode->HextHode - HewHode;
return (SList);
}
//-----------------------------------------------------------------
SLL_Type SLL_Add_Mid(SLL_Type &SList, T HewData, SLL_Type &lnsHode)
{ SLL_Type HewHode - SLL_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HGLL);
if (lnsHode->HextHode -- HGLL)
{ lnsHode->HextHode - HewHode;
return (SList);
}
HewHode->HextHode - lnsHode->HextHode;
lnsHode->HextHode - HewHode;
return (SList);
}
d. Duyet qua cac nut trong danh sach:
ay la mot thao tac thuong xuyen xay ra tren danh sach lien ket don noi chung va
cac danh sach khac noi rieng de thuc hien thao tac xu ly cac nut hoac xu ly du lieu
tai cac nut. Co nhieu thao tac xu ly tuy tung truong hop va yeu cau song o day don
gian chung ta ch duyet de xem noi dung thanh phan du lieu trong danh sach.
- Thuat toan:
BT: CurHode - SLList
B2: lF (CurHode - HGLL)
Thuc hien Bkt
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 99
B3: OutputData(CurHode->Key) // Xuat gia tr thanh phan du lieu trong T nut
B4: CurHode - CurHode->HextHode
B5: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham SLL_Travelling co prototype:
void SLL_Travelling(SLL_Type SList);
Ham duyet qua cac nut trong danh sach lien ket don quan ly boi da ch nut dau
tien thong qua SList de xem noi dung thanh phan du lieu cua moi nut.
Hoi dung cua ham nhu sau:
void SLL_Travelling (SLL_Type SList)
{ SLL_Type CurHode - SList;
while (CurHode !- HGLL)
{ OutputData(CurHode->Key);
CurHode - CurHode->HextHode;
}
return;
}
Luu y:
Ham OutputData thuc hien viec xuat noi dung cua mot bien co kieu du lieu T. Tuy
vao tung truong hop cu the ma chung ta viet ham OutputData cho phu hop.
e. Tm kiem mot phan t trong danh sach:
Cia su chung ta can tm kiem xem trong danh sach lien ket don co ton tai nut co
thanh phan du lieu la SearchData hay khong. Thao tac nay chung ta van dung thuat
toan tm tuyen tinh de tm kiem.
- Thuat toan:
BT: CurHode - SLList
B2: lF (CurHode - HGLL OP CurHode->Key - SearchData)
Thuc hien Bkt
B3: CurHode - CurHode->HextHode
B4: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham SLL_Searching co prototype:
SLL_Type SLL_Searching(SLL_Type SList, T SearchData);
Ham thuc hien viec tm kiem nut co thanh phan du lieu la SearchData tren danh
sach lien ket don quan ly boi da ch nut dau tien thong qua SList. Ham tra ve da
ch cua nut dau tien trong danh sach khi tm thay, nguoc lai ham tra ve con tro
HGLL.
Hoi dung cua ham nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 100
SLL_Type SLL_Searching(SLL_Type SList, T SearchData)
{ SLL_Type CurHode - SList;
while (CurHode !- HGLL)
{ if (CurHode->Key -- SearchData)
break;
CurHode - CurHode->HextHode;
}
return (CurHode);
}
f. Loai bo bt mot phan t ra khoi danh sach:
Cia su chung ta can loai bo phan tu co gia tr thanh phan du lieu la DelData trong
danh sach lien ket don. e thuc hien dieu nay truoc tien chung ta phai thuc hien
thao tac tm kiem da ch cua nut co thanh phan du lieu la DelData, sau do moi thuc
hien thao tac loai bo neu tm thay. Tuy nhien trong qua trnh tm kiem, neu tm thay
chung ta phai ghi nhan da ch cua nut dung ngay truoc nut tm thay la PreDelHode.
- Thuat toan:
// Tm kiem nut co Key la DelData trong danh sach
BT: DelHode - SLList
B2: PreDelHode - HGLL
B3: lF (DelHode - HGLL)
Thuc hien Bkt
B4: lF (DelHode->Key-DelData)
Thuc hien B8
B5: PreDelHode - DelHode
B6: DelHode - DelHode->HextHode
B7: Lap lai B3
// Loai bo nut tai da ch DelHode ra khoi danh sach
B8: lF (PreDelHode - HGLL) // Loai bo nut dau tien trong danh sach
B8.T: SLList - SLList->HextHode
B8.2: Thuc hien BT0
// Lien ket cac not sau DelHode ve nut PreDelHode
B9: PreDelHode->HextHode - DelHode->HextHode
// Cat moi lien ket giua DelHode voi cac nut con lai trong danh sach
// va huy DelHode
BT0: DelHode->HextHode - HGLL
BTT: delete DelHode
Bkt: Ket thuc
- Cai at thuat toan:
Ham SLL_Delete_Hode co prototype:
int SLL_Delete_Hode (SLL_Type &SList, T DelData);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 101
Ham thuc hien viec xoa phan tu co thanh phan du lieu la DelData trong danh sach
lien ket quan ly boi con tro dau SList. Ham tra ve gia tr T neu viec xoa thanh
cong va nguoc lai, ham tra ve gia tr -T. Hoi dung cua ham nhu sau:
int SLL_Delete_Hode (SLL_Type &SList, T DelData)
{ SLL_Type DelHode - SList;
SLL_Type PreDelHode - HGLL;
while (DelHode !- HGLL)
{ if (DelHode->Key -- DelData)
break;
PreDelHode - DelHode;
DelHode - DelHode->HextHode;
}
if (DelHode -- HGLL)
return (-T);
if (PreDelHode -- HGLL)
SList - SList->HextHode;
else
PreDelHode->HextHode - DelHode->HextHode;
DelHode->HextHode - HGLL;
delete DelHode;
return (T);
}
- Minh hoa thuat toan:
+ Cia su chung ta can huy nut co thanh phan du lieu la 25: DelData - 25
SLList NULL
25 10 20 18 40 35 30
DeINode
SLList - SLList->HextHode
DeINode SLList NULL
25 10 20 18 40 35 30

DelHode->HextHode - HGLL
DeINode SLList NULL
25 10 20 18 40 35 30
HGLL
Ket qua sau khi huy:
SLList
10 20 18 40 35 30 NULL

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 102
+ Bay gio gia su chung ta can huy nut co thanh phan du lieu la 20: DelData - 20
SLList DeINode NULL
25 10 20 18 40 35 30
PreDeINode
PreDelHode->HextHode - DelHode->Hext
SLList DeINode NULL
25 10 20 18 40 35 30
PreDeINode
DelHode->Hext - HGLL
SLList DeINode NULL NULL
25 10 20 18 40 35 30
PreDeINode
Ket qua sau khi huy:
SLList
25 10 18 40 35 30 NULL

g. Huy danh sach:
Thao tac nay thuc chat la thuc hien nhieu lan thao tac huy mot nut.
- Thuat toan:
BT: lF (SLList - HGLL)
Thuc hien Bkt
B2: TempHode - SLList
B3: SLList - SLList->HextHode
B4: TempHode->HextHode - HGLL
B5: delete TempHode
B6: Lap lai BT
Bkt: Ket thuc
- Cai at:
Ham SLL_Delete co prototype:
void SLL_Delete (SLL_Type &SList);
Ham thuc hien viec huy toan bo danh sach SList.
Hoi dung cua ham nhu sau:
void SLL_Delete (SLL_Type &SList)
{ SLL_Type TempHode - SList;
while (SList !- HGLL)
{ SList - SList->HextHode;
TempHode->HextHode - HGLL;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 103
delete TempHode;
TempHode - SList;
}
return ;
}
h. Tao mi danh sach/ Nhap danh sach:
Viec tao moi mot danh sach lien ket don thuc chat la chung ta lien tuc thuc hien thao
tac them mot phan tu vao danh sach ma ban dau danh sach nay la mot danh sach
rong. Co the su dung mot trong ba ham them phan tu de them phan tu, o day chung
ta su dung ham SLL_Add_First.
Cia su chung ta can tao danh sach lien ket don co H phan tu.
- Thuat toan:
BT: SLL_lnitialize(SLList)
B2: i - T
B3: lF (i > H)
Thuc hien Bkt
B4: HewData - lnputHewData() // Hhap gia tr cho bien HewData
B5: SLL_Add_First(SLList, HewData)
B6: i++
B7: Lap lai B3
Bkt: Ket thuc
- Cai at thuat toan:
Ham SLL_Create co prototype:
SLL_Type SLL_Create(SLL_Type &SList, int H);
Ham tao danh sach lien ket don co H nut quan ly boi da ch nut dau tien thong
qua SList. Ham tra ve da ch cua nut dau tien trong danh sach neu viec tao thanh
cong, nguoc lai ham tra ve con tro HGLL.
Hoi dung cua ham nhu sau:
SLL_Type SLL_Create(SLL_Type &SList, int H)
{ SLL_lnitialize(SList);
T HewData;
for (int i - 0; i < H; i++)
{ HewData - lnputHewData();
if (SLL_Add_First(SList, HewData) -- HGLL)
{ SLL_Delete (SList);
break;
}
}
return (SList);
}
Luu y:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 104
Ham lnputHewData thuc hien viec nhap vao noi dung cua mot bien co kieu du lieu
T va tra ve gia tr moi nhap vao. Tuy vao tung truong hop cu the ma chung ta viet
ham lnputHewData cho phu hop.
i. Tach mot danh sach thanh nhieu danh sach:
Tuong tu nhu danh sach dac, viec tach mot danh sach lien ket don thanh nhieu danh
sach lien ket don khac nhau cung co nhieu tieu thuc khac nhau ma chung ta se thuc
hien theo cac cach khac nhau. Hgoai ra viec tach cung se khac nhau trong truong
hop co hay khong giu lai danh sach ban dau. O day chung ta thuc hien viec tach cac
nut trong danh sach lien ket don SLList thanh hai danh sach lien ket don con SLList
va SLListT luan phien theo cac duong chay tu nhien va khong giu lai danh sach lien
ket ban dau. Cac truong hop khac sinh vien tu van dung de thao tac.
- Thuat toan:
BT: CurHode - SLList
B2: SLListT - SLList
B3: LastHodeT - HGLL, LastHode2 - HGLL
// Cat cac nut tu sau duong chay tu nhien thu nhat ve SLListT
B4: lF (CurHode - HGLL OP CurHode->HextHode - HGLL)
Thuc hien Bkt
B5: lF (CurHode->Key > CurHode->HextHode->Key)
B5.T: LastHodeT - CurHode
B5.2: SLListT - SLListT->HextHode
B5.3: CurHode - CurHode->HextHode
B5.4: LastHodeT->HextHode - HGLL
B5.5: Thuc hien B8
B6: CurHode - CurHode->HextHode, SLListT - SLListT->HextHode
B7: Lap lai B4
// Cat cac nut tu sau duong chay tu nhien thu hai ve SLList
B8: lF (CurHode - HGLL OP CurHode->HextHode - HGLL)
Thuc hien Bkt
B9: lF (CurHode->Key > CurHode->HextHode->Key)
B9.T: LastHode2 - CurHode
B9.2: CurHode - CurHode->HextHode
B9.3: LastHode2->HextHode - HGLL
B9.4: Thuc hien BT2
BT0: CurHode - CurHode->HextHode
BTT: Lap lai B8
// Phan phoi (giu lai) duong chay ke tiep trong SLList
BT2: LastHodeT->HextHode - CurHode
BT3: lF (CurHode - HGLL OP CurHode->HextHode - HGLL)
Thuc hien Bkt
BT4: lF (CurHode->Key > CurHode->HextHode->Key)
BT4.T: LastHodeT - CurHode
BT4.2: CurHode - CurHode->HextHode
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 105
BT4.3: LastHodeT->HextHode - HGLL
BT4.4: Thuc hien BT7
BT5: CurHode - CurHode->HextHode
BT6: Lap lai BT3
// Phan phoi (giu lai) duong chay ke tiep trong SLListT
BT7: LastHode2->HextHode - CurHode
BT8: lF (CurHode - HGLL OP CurHode->HextHode - HGLL)
Thuc hien Bkt
BT9: lF (CurHode->Key > CurHode->HextHode->Key)
BT9.T: LastHode2 - CurHode
BT9.2: CurHode - CurHode->HextHode
BT9.3: LastHode2->HextHode - HGLL
BT9.4: Lap lai BT2
B20: CurHode - CurHode->HextHode
B2T: Lap lai BT8
Bkt: Ket thuc
- Cai at thuat toan:
Ham SLL_Split co prototype:
SLL_Type SLL_Split(SLL_Type &SList, SLL_Type &SListT);
Ham thuc hien viec phan phoi bot cac duong chay tu nhien trong SList sang
SListT. Ham tra ve con tro tro toi da ch phan tu dau tien trong SListT.
Hoi dung cua ham nhu sau:
SLL_Type SLL_Split(SLL_Type &SList, SLL_Type &SListT)
{ SListT - SList;
if (SListT -- HGLL)
return (HGLL);
SLL_Type LastT;
SLL_Type Last2;
while (SListT->HextHode !- HGLL)
{ if (SListT->Key > SListT->HextHode->Key)
break;
SListT - SListT->HextHode;
}
if (SListT->HextHode !- HGLL)
LastT - SListT;
SListT - SListT->HextHode;
LastT->HextHode - HGLL;
SLL_Type CurHode - SListT;
if (CurHode -- HGLL)
return (HGLL);
while (CurHode->HextHode !- HGLL)
{ if (CurHode->Key > CurHode->HextHode->Key)
break;
CurHode - CurHode->HextHode;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 106
}
if (CurHode->HextHode -- HGLL)
return (SListT);
Last2 - CurHode;
CurHode - CurHode->HextHode;
Last2->HextHode - HGLL;
while (CurHode !- HGLL)
{ LastT->HextHode - CurHode;
if (CurHode->HextHode -- HGLL)
break;
while (CurHode->HextHode !- HGLL)
{ if (CurHode->Key > CurHode->HextHode->Key)
break;
Cur Hode - CurHode->HextHode;
}
if (CurHode->HextHode -- HGLL)
break;
LastT - CurHode;
CurHode - CurHode->HextHode;
LastT->HextHode - HGLL;
Last2->HextHode - CurHode;
if (CurHode->HextHode -- HGLL)
break;
while (CurHode->HextHode !- HGLL)
{ if (CurHode->Key > CurHode->HextHode->Key)
break;
Cur Hode - CurHode->HextHode;
}
if (CurHode->HextHode -- HGLL)
break;
Last2 - CurHode;
CurHode - CurHode->HextHode;
Last2->HextHode - HGLL;
}
return (SListT);
}
j. Nhap nhieu danh sach thanh mot danh sach:
Tuong tu, viec nhap nhieu danh sach thanh mot danh sach chung ta thuc hien theo
hai truong hop khac nhau:
+ Chep noi duoi cac danh sach lai voi nhau;
+ Tron xen lan cac phan tu trong danh sach con vao thanh mot danh sach lon
theo mot trat tu nhat dnh.
Hgoai ra viec nhap co the giu lai cac danh sach con ban dau hoac khong giu lai cac
danh sach con ban dau. O day chung ta trnh bay theo cach khong giu lai cac danh
sach con ban dau va trnh bay theo hai truong hop:
+ Chep noi duoi hai danh sach lai voi nhau;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 107
+ Tron hai danh sach lai voi nhau theo cac duong chay tu nhien thanh mot danh
sach co chieu dai lon hon.
Cia su chung ta can nhap hai danh sach SLListT, SLList2 lai voi nhau.
- Thuat toan ghep danh sach SLList2 vao sau SLList1:
BT: lF (SLListT - HGLL)
BT.T: SLListT - SLList2
BT.2: Thuc hien Bkt
B2: lF (SLList2 - HGLL)
Thuc hien Bkt
// Lay da ch nut cuoi cung trong SLListT
B3: LastHode - SLListT
B4: lF (LastHode->HextHode - HGLL)
Thuc hien B7
B5: LastHode - LastHode->HextHode
B6: Lap lai B4
// Chep SLList2 vao sau LastHode
B7: LastHode->HextHode - SLList2
Bkt: Ket thuc
- Thuat toan tron danh sach SLList2 va SLList1 thanh SLList theo cac uong chay
tu nhien:
BT: lF (SLListT - HGLL)
BT.T: SLList - SLList2
BT.2: Thuc hien Bkt
B2: lF (SLList2 - HGLL)
B2.T: SLList - SLListT
B2.2: Thuc hien Bkt
// Lay nut co du lieu nho hon trong 2 nut dau cua 2 danh sach dua ve SLList
B3: lF (SLListT->Key SLList2->Key)
B3.T: TempHode - SLListT
B3.2: SLListT - SLListT->HextHode
B4: ELSE
B4.T: TempHode - SLList2
B4.2: SLList2 - SLList2->HextHode
B5: TempHode->HextHode - HGLL
B6: lF (SLListT - HGLL)
B6.T: TempHode->HextHode - SLList2
B6.2: Thuc hien Bkt
B7: lF (SLList2 - HGLL)
B7.T: TempHode->HextHode - SLListT
B7.2: Thuc hien Bkt
B8: lF (SLListT->Key SLList2->Key) AHD (TempHode->Key SLListT->Key)
B8.T: MinHode - SLListT
B8.2: SLListT - SLListT->HextHode
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 108
B9: ELSE
B9.T: MinHode - SLList2
B9.2: SLList2 - SLList2->HextHode
BT0: TempHode->HextHode - MinHode
BTT: MinHode->HextHode - HGLL
BT2: TempHode - MinHode
BT3: Lap lai B6
Bkt: Ket thuc
- Cai at:
Cac ham nhap danh sach co prototype:
SLL_Type SLL_Concat (SLL_Type &SListT, SLL_Type &SList2);
SLL_Type SLL_Merge(SLL_Type &SListT, SLL_Type &SList2, SLL_Type &SList);
Ham thuc hien viec nhap cac nut trong hai danh sach SListT, SList2 thanh mot
danh sach theo thu tu nhu hai thuat toan vua trnh bay. Ham tra ve da ch cua nut
dau cua danh sach sau khi ghep.
Hoi dung cua cac ham nhu sau:
SLL_Type SLL_Concat (SLL_Type &SListT, SLL_Type &SList2)
{ if (SListT -- HGLL)
{ SListT - SList2;
return (SListT);
}
if (SList2 -- HGLL)
return (SListT);
SLL_Type LastHode - SListT;
while (LastHode->HextHode !- HGLL)
LastHode - LastHode->HextHode;
LastHode->HextHode - SList2;
return (SListT);
}
//----------------------------------------------------------------
SLL_Type SLL_Merge (SLL_Type &SListT, SLL_Type &SList2, SLL_Type &SList)
{ if (SListT -- HGLL)
{ SList - SList2;
return (SList);
}
if (SList2 -- HGLL)
{ SList - SListT;
return (SList);
}
SLL_Type LastHode - HGLL;
SLL_Type TempHode;
while (SListT !- HGLL && SList2 !- HGLL)
{ if (SListT->Key <- SList2->Key)
{ TempHode - SListT;
SListT - SListT->HextHode;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 109
TempHode->HextHode - HGLL;
if (LastHode -- HGLL)
SList - LastHode - TempHode;
else
{ LastHode->HextHode - TempHode;
LastHode - TempHode;
}
if (SListT -- HGLL)
break;
if (SListT->Key < LastHode->Key)
while (SList2 !- HGLL)
{ LastHode->Hext - SList2;
LastHode - LastHode->HextHode;
SList2 - SList2->HextHode;
LastHode->HextHode - HGLL;
if (SList2 -- HGLL ll SList2->Key < LastHode->Key)
break;
}
}
else
{ TempHode - SList2;
SList2 - SList2->HextHode;
TempHode->HextHode - HGLL;
if (LastHode -- HGLL)
SList - LastHode - TempHode;
else
{ LastHode->HextHode - TempHode;
LastHode - TempHode;
}
if (SList2 -- HGLL)
break;
if (SList2->Key < LastHode->Key)
while (SListT !- HGLL)
{ LastHode->Hext - SListT;
LastHode - LastHode->HextHode;
SListT - SListT->HextHode;
LastHode->HextHode - HGLL;
if (SListT -- HGLL ll SListT->Key < LastHode->Key)
break;
}
}
}
if (SListT -- HGLL)
LastHode->HextHode - SList2;
else
LastHode->HextHode - SListT;
return (SList);
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 110
k. Sap xep th t cac phan t trong danh sach:
Thao tac nay chung ta co the van dung cac thuat toan sap xep da trnh bay trong
Chuong 3 de sap xep du lieu trong danh sach lien ket don. O day chung ta ch trnh
bay su van dung thuat toan tron tu nhien de sap xep.
Cung can luu y rang doi voi thao tac hoan v hai phan tu th chung ta co the hoan v
hoan toan hai nut hoac ch hoan v phan du lieu. Tuy nhien viec hoan v hoan toan
hai nut se phuc tap hon.
- Thuat toan sap xep tron tu nhien:
BT: lF (SLL_Split(SLList, TempList) - HGLL)
Thuc hien Bkt
B2: SLL_Merge(SLList, TempList, SLList)
B3: Lap lai BT
Bkt: Ket thuc
- Cai at:
Ham SLL_Hatural_Merge_Sort co prototype:
void SLL_Hatural_Merge_Sort (SLL_Type &SList);
Ham thuc hien viec sap xep thanh phan du lieu cua cac nut trong danh sach SList
theo thu tu tang dua tren thuat toan tron tu nhien vua trnh bay.
Hoi dung cua ham nhu sau:
void SLL_Hatural_Merge_Sort (SLL_Type &SList)
{ SLL_Type TempList - HGLL, List - HGLL;
while (SLL_Split(SList, TempList) !- HGLL)
{ SLL_Merge(SList, TempList, List);
SList - List;
}
return ;
}
h. Sao chep mot danh sach:
Thuc chat thao tac nay la chung ta tao moi danh sach HewList bang cach duyet qua
cac nut cua SLList de lay thanh phan du lieu roi tao thanh mot nut moi va bo sung
nut moi nay vao cuoi danh sach HewList.
- Thuat toan:
BT: HewList - HGLL
B2: CurHode - SLList
B3: lF (CurHode - HGLL)
Thuc hien Bkt
B4: SLL_Add_Last(HewList, CurHode->Key)
B5: CurHode - CurHode->HextHode
B6: Lap lai B3
Bkt: Ket thuc
- Cai at thuat toan:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 111
Ham SLL_Copy co prototype:
SLL_Type SLL_Copy (SLL_Type SList, SLL_Type &HewList);
Ham thuc hien viec sao chep noi dung danh sach SList thanh danh sach HewList
co cung noi dung thanh phan du lieu theo thu tu cua cac nut trong SList. Ham tra
ve da ch nut dau trong danh sach moi neu viec sao chep thanh cong, nguoc lai
ham tra ve con tro HGLL.
Hoi dung cua ham nhu sau:
SLL_Type SLL_Copy (SLL_Type SList, SLL_Type &HewList)
{ HewList - HGLL;
SLL_Type CurHode - SList;
while (CurHode !- HGLL)
{ SLL_Type HewHode - SLL_Add_Last(HewList, CurHode->Key);
if (HewHode -- HGLL)
{ SLL_Delelte(HewList);
break;
}
CurHode - CurHode->HextHode;
}
return (HewList);
}
4.4.. DaDD acD J1eD Ret Rep (DouLJy L1DRe L1t,
A. Cau truc du Iieu:
Heu nhu vung lien ket cua danh sach lien ket don co 0T moi lien ket voi 0T phan tu
khac trong danh sach th vung lien ket trong danh sach lien doi co 02 moi lien ket
voi 02 phan tu khac trong danh sach, cau truc du lieu cua moi nut trong danh sach
lien ket doi nhu sau:
typedef struct DLL_Hode
{ T Key;
lnfoType lnfo;
DLL_Hode * HextHode; // Vung lien ket quan ly da ch phan tu ke tiep no
DLL_Hode * PreHode; // Vung lien ket quan ly da ch phan tu truoc no
} DLL_OneHode;
O day chung ta cung gia thiet rang vung du lieu cua moi phan tu trong danh sach
lien ket doi ch bao gom mot thanh phan khoa nhan dien (Key) cho phan tu do. Do
vay, cau truc du lieu tren co the viet lai don gian nhu sau:
typedef struct DLL_Hode
{ T Key;
DLL_Hode * HextHode; // Vung lien ket quan ly da ch phan tu ke tiep no
DLL_Hode * PreHode; // Vung lien ket quan ly da ch phan tu truoc no
} DLL_OneHode;
typedef DLL_OneHode * DLL_Type;
Co nhieu phuong phap khac nhau de quan ly cac danh sach lien ket doi va tuong
ung voi cac phuong phap nay se co cac cau truc du lieu khac nhau, cu the:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 112
- Quan Iy |a ch phan tu au danh sach:
Cach nay hoan toan tuong tu nhu doi voi danh sach lien ket don.
DLL_Type DLL_ListT;
Hnh anh minh hoa:
DLL_List1 NULL
15 10 20 18 40 30
NULL
- Quan Iy |a ch phan tu au va cuoi danh sach:
typedef struct DLL_PairHode
{ DLL_Type DLL_First;
DLL_Type DLL_Last;
} DLLP_Type;
DLLP_Type DLL_List2;
Hnh anh minh hoa:
DLL_List2
DLL_First DLL_Last
NULL
15 10 20 18 40 30
NULL
- Quan Iy |a ch phan tu au, |a ch phan tu cuoi va so phan tu trong danh sach:
typedef struct DLL_PairHHode
{ DLL_Type DLL_First;
DLL_Type DLL_Last;
unsigned HumHode;
} DLLPH_Type;
DLLPH_Type DLL_List3;
Hnh anh minh hoa:
DLL_List3
DLL_First NumNode=6 DLL_Last
NULL
15 10 20 18 40 30
NULL
B. Cac thao tac tren danh sach Iien ket oi:
Cung nhu trong phan danh sach lien ket don, cac thao tac tuong ung voi moi cach
quan ly khac nhau cua danh sach lien ket do i co su khac nhau ve mat chi tiet song
noi dung co ban it co su khac nhau. Do vay, o day chung ta ch trnh bay cac thao
tac theo cach quan ly thu hai (quan ly cac da ch cua hai nut dau va cuoi danh sach
lien ket doi), cac thao tac nay tren cac cach quan ly khac sinh vien tu van dung de
dieu chnh cho thich hop.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 113
a. Khi tao danh sach (Initialize):
Trong thao tac nay ch don gian la chung ta cho gia tr cac con tro quan ly da ch
hai nut dau va cuoi danh sach lien ket doi ve con tro HGLL. Ham khoi tao danh sach
lien ket doi nhu sau:
DLLP_Type DLL_lnitialize(DLLP_Type &DList)
{ DList.DLL_First - HGLL;
DList.DLL_Last - HGLL;
return (DList);
}
Hnh anh minh hoa:
DList
NULL DLL_First DLL_Last NULL
b. Tao mi mot phan t / nut:
Cia su chung ta can tao moi mot phan tu co thanh phan du lieu la HewData.
- Thuat toan:
BT: DHode - new DLL_OneHode
B2: lF (DHode - HGLL)
Thuc hien Bkt
B3: DHode->HextHode - HGLL
B4: DHode->PreHode - HGLL
B5: DHode->Key - HewData
Bkt: Ket thuc
- Cai at thuat toan:
Ham DLL_Create_Hode co prototype: DLL_Type DLL_Create_Hode(T HewData);
Ham tao moi mot nut co thanh phan du lieu la HewData, ham tra ve con tro tro
toi da ch cua nut moi tao. Heu khong du bo nho de tao, ham tra ve con tro
HGLL.
DLL_Type DLL_Create_Hode(T HewData)
{ DLL_Type Pnode - new DLL_OneHode;
if (Pnode !- HGLL)
{ Pnode->HextHode - HGLL;
Pnode->PreHode - HGLL;
Pnode->Key - HewData;
}
return (Pnode);
}
- Minh hoa thuat toan:
Cia su chung ta can tao nut co thanh phan du lieu la 20: HewData - 20
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 114
Pnode - new DLL_OneHode
Pnode


Pnode->HextHode - HGLL
Pnode->PreHode - HGLL
Pnode->Key - HewData
Pnode NULL
20
NULL
c. Them mot phan t vao trong danh sach:
Cia su chung ta can them mot phan tu co gia tr thanh phan du lieu la HewData vao
trong danh sach. Viec them co the dien ra o dau, cuoi hay o giua danh sach lien ket.
Do vay, o day chung ta trnh bay 3 thao tac them rieng biet nhau:
- Thuat toan them phan tu vao au danh sach Iien ket oi:
BT: HewHode - DLL_Create_Hode (HewData)
B2: lF (HewHode - HGLL)
Thuc hien Bkt
B3: lF (DLL_List.DLL_First - HGLL) // Danh sach rong
B3.T: DLL_List.DLL_First - HewHode
B3.2: DLL_List.DLL_Last - HewHode
B3.3: Thuc hien Bkt
B4: HewHode->HextHode - DLL_List.DLL_First // Hoi DLL_First vao
B5: DLL_List.DLL_First->PreHode - HewHode // sau HewHode
// Chuyen vai tro dung dau cua HewHode cho DLL_First
B6: DLL_List.DLL_First - HewHode
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them nut co thanh phan du lieu la 27: HewData - 27
NewNode NULL
2T
NULL
DLL_List
DLL_First DLL_Last
NULL
16 20 18 40 30
NULL

HewHode->HextHode - DLL_List.DLL_First:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 115
NewNode
2T
NULL
DLL_List
DLL_First DLL_Last
NULL
16 20 18 40 30
NULL

DLL_List.DLL_First->PreHode - HewHode:
NewNode
2T
NULL
DLL_List
DLL_First DLL_Last
NULL
16 20 18 40 30
DLL_List.DLL_First - HewHode:
NewNode
2T
NULL
DLL_List
DLL_First DLL_Last
NULL
16 20 18 40 30


Ket qua sau khi chen:
DLL_List
DLL_First DLL_Last
NULL
2T 16 20 18 40 30
NULL

- Thuat toan them phan tu vao cuoi danh sach Iien ket oi:
BT: HewHode - DLL_Create_Hode (HewData)
B2: lF (HewHode - HGLL)
Thuc hien Bkt
B3: lF (DLL_List.DLL_First - HGLL) // Danh sach rong
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 116
B3.T: DLL_List.DLL_First - HewHode
B3.2: DLL_List.DLL_Last - HewHode
B3.3: Thuc hien Bkt
B4: DLL_List.DLL_Last->HextHode - HewHode // Hoi HewHode vao
B5: HewHode->PreHode - DLL_List.DLL_Last // sau DLL_Last
// Chuyen vai tro dung cuoi cua HewHode cho DLL_Last
B6: DLL_List.DLL_Last - HewHode
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them nut co thanh phan du lieu la 25: HewData - 25
NewNode NULL
25
NULL
DLL_List
DLL_First DLL_Last
NULL
16 20 18 40 30
NULL
DLL_List.DLL_Last->HextHode - HewHode:
NewNode NULL
25
NULL
DLL_List
DLL_First DLL_Last

16 20 18 40 30
NULL
HewHode->PreHode - DLL_List.DLL_Last
NewNode NULL
25

DLL_List
DLL_First DLL_Last

16 20 18 40 30
NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 117
DLL_List.DLL_Last - HewHode:
NewNode NULL
25

DLL_List
DLL_First DLL_Last

16 20 18 40 30
NULL
Ket qua sau khi chen:
DLL_List
DLL_First DLL_Last
NULL
16 20 18 40 30 25
NULL
- Thuat toan them phan tu vao giua danh sach Iien ket oi:
Cia su chung ta can them mot phan tu co gia tr thanh phan du lieu la HewData
vao trong danh sach DLL_List vao ngay sau nut co da ch lnsHode. Trong thuc te
nhieu khi chung ta phai thuc hien thao tac tm kiem de xac dnh da ch lnsHode, o
day gia su chung ta da xac dnh duoc da ch nay.
BT: lF (lnsHode->HextHode - HGLL) // Them vao cuoi DSLK
BT.T: DLL_Add_Last (DLL_List, HewData)
BT.2: Thuc hien Bkt
B2: HewHode - DLL_Create_Hode (HewData)
B3: lF (HewHode - HGLL)
Thuc hien Bkt
// Hoi cac nut ke sau lnsHode vao sau HewHode
B4: HewHode->HextHode - lnsHode->HextHode
B5: lnsHode->HextHode->PreHode - HewHode
// Chuyen moi lien ket giua lnsHode voi nut ke cua no ve HewHode
B6: lnsHode->HextHode - HewHode
B7: HewHode->PreHode - lnsHode
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them nut co thanh phan du lieu la 25 vao sau nut co da ch
lnsHode nhu sau: HewData - 25
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 118
DLL_List
DLL_First DLL_Last
InsNode NULL
16 20 18 40 30
NULL
NewNode NULL
25
NULL
HewHode->HextHode - lnsHode->HextHode:
DLL_List
DLL_First DLL_Last
InsNode NULL
16 20 18 40 30
NULL
NewNode
25
NULL
lnsHode->HextHode->PreHode - HewHode:
DLL_List
DLL_First DLL_Last
InsNode NULL
16 20 18 40 30
NULL
NewNode
25
NULL
lnsHode->HextHode - HewHode:
DLL_List
DLL_First DLL_Last
InsNode NULL
16 20 18 40 30
NULL
NewNode
25
NULL
HewHode->PreHode - lnsHode
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 119
DLL_List
DLL_First DLL_Last
InsNode NULL
16 20 18 40 30
NULL
NewNode
25
Ket qua sau khi chen:
DLL_List
DLL_First DLL_Last
NULL
16 20 18 25 40 30
NULL
- Cai at thuat toan:
Cac ham them phan tu tuong ung voi cac truong hop co prototype nhu sau:
DLL_Type DLL_Add_First(DLLP_Type &DList, T HewData);
DLL_Type DLL_Add_Last(DLLP_Type &DList, T HewData);
DLL_Type DLL_Add_Mid(DLLP_Type &DList, T HewData, DLL_Type &lnsHode);
Ham thuc hien viec chen phan tu co gia tr thanh phan du lieu HewData vao trong
danh sach lien ket doi quan ly boi hai con tro dau va cuoi danh sach trong DList
tuong ung voi 3 truong hop: Them dau, them cuoi, them giua. Cac ham tra ve gia
tr la mot da ch cua nut vua moi them neu viec them thanh cong. Trong truong
hop nguoc lai, cac ham tra ve con tro HGLL.
Pieng doi voi truong hop them giua, ham DLL_Add_Mid thuc hien viec them vao
ngay sau nut co da ch lnsHode. Hoi dung cua cac ham nhu sau:
DLL_Type DLL_Add_First(DLLP_Type &DList, T HewData)
{ DLL_Type HewHode - DLL_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HGLL);
if (DList.DLL_First -- HGLL)
DList.DLL_First - DList.DLL_Last - HewHode;
else
{ HewHode->HextHode - DList.DLL_First;
DList.DLL_First->PreHode - HewHode;
DList.DLL_First - HewHode;
}
return (HewHode);
}
//-----------------------------------------------------------------
DLL_Type DLL_Add_Last(DLLP_Type &DList, T HewData)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 120
{ DLL_Type HewHode - DLL_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HGLL);
if (DList.DLL_Last -- HGLL)
DList.DLL_First - DList.DLL_Last - HewHode;
else
{ DList.DLL_Last->HextHode - HewHode;
HewHode->PreHode - DList.DLL_Last;
DList.DLL_Last - HewHode;
}
return (HewHode);
}
//-----------------------------------------------------------------
DLL_Type DLL_Add_Mid(DLLP_Type &DList, T HewData, DLL_Type &lnsHode)
{ DLL_Type HewHode - DLL_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HGLL);
if (lnsHode->HextHode -- HGLL)
{ lnsHode->HextHode - HewHode;
HewHode->PreHode - lnsHode;
DList.DLL_Last - HewHode;
}
else
{ HewHode->HextHode - lnsHode->HextHode;
lnsHode->HextHode->PreHode - HewHode;
lnsHode->HextHode - HewHode;
HewHode->PreHode - lnsHode;
}
return (HewHode);
}
d. Duyet qua cac nut trong danh sach:
Thao tac nay nham nhieu muc dich, o day don gian chung ta ch duyet de xem noi
dung thanh phan du lieu trong danh sach. Thuat toan nay hoan toan tuong tu nhu
trong danh sach lien ket don.
- Thuat toan:
BT: CurHode - DLL_List.First
B2: lF (CurHode - HGLL)
Thuc hien Bkt
B3: OutputData(CurHode->Key) // Xuat gia tr thanh phan du lieu trong T nut
B4: CurHode - CurHode->HextHode
B5: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham DLL_Travelling co prototype:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 121
void DLL_Travelling(DLLP_Type DList);
Ham duyet qua cac nut trong danh sach lien ket doi quan ly boi hai da ch nut
dau tien va nut cuoi cung thong qua DList de xem noi dung thanh phan du lieu
cua moi nut.
Hoi dung cua ham nhu sau:
void DLL_Travelling (DLLP_Type DList)
{ DLL_Type CurHode - DList.DLL_First;
while (CurHode !- HGLL)
{ OutputData(CurHode->Key);
CurHode - CurHode->HextHode;
}
return;
}
Luu y:
Ham OutputData thuc hien viec xuat noi dung cua mot bien co kieu du lieu T. Tuy
vao tung truong hop cu the ma chung ta viet ham OutputData cho phu hop.
e. Tm kiem mot phan t trong danh sach:
Cia su chung ta can tm kiem xem trong danh sach lien ket doi co ton tai nut co
thanh phan du lieu la SearchData hay khong. Thao tac nay chung ta van dung thuat
toan tm tuyen tinh de tm kiem.
- Thuat toan:
BT: CurHode - DLL_List.DLL_First
B2: lF (CurHode - HGLL OP CurHode->Key - SearchData)
Thuc hien Bkt
B3: CurHode - CurHode->HextHode
B4: Lap lai B2
Bkt: Ket thuc
- Cai at thuat toan:
Ham DLL_Searching co prototype:
DLL_Type DLL_Searching(DLLP_Type DList, T SearchData);
Ham thuc hien viec tm kiem nut co thanh phan du lieu la SearchData tren danh
sach lien ket doi quan ly boi hai da ch nut dau tien va nut cuoi cung thong qua
DList. Ham tra ve da ch cua nut dau tien trong danh sach duoc tm thay, nguoc
lai ham tra ve con tro HGLL.
Hoi dung cua ham nhu sau:
DLL_Type DLL_Searching(DLLP_Type DList, T SearchData)
{ DLL_Type CurHode - DList.DLL_First;
while (CurHode !- HGLL)
{ if (CurHode->Key -- SearchData)
break;
CurHode - CurHode->HextHode;
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 122
return (CurHode);
}
f. Loai bo bt mot phan t ra khoi danh sach:
Cia su chung ta can loai bo phan tu co gia tr thanh phan du lieu la DelData trong
danh sach lien ket doi, e thuc hien dieu nay truoc tien chung ta phai thuc hien thao
tac tm kiem da ch cua nut co thanh phan du lieu la DelData, sau do moi thuc hien
thao tac loai bo neu tm thay.
- Thuat toan:
// Tm kiem nut co Key la DelData trong danh sach
BT: DelHode - DLL_Searching(DLL_List, DelData)
B2: lF (DelHode - HGLL)
Thuc hien Bkt
// Loai bo nut tai da ch DelHode ra khoi danh sach
B3: lF (DelHode->PreHode - HGLL AHD DelHode->HextHode - HGLL)
B3.T: DLL_List.DLL_First - DLL_List.DLL_Last - HGLL
B3.2: Thuc hien B8
B4: lF (DelHode->PreHode - HGLL) // Loai bo nut dau tien trong danh sach
B4.T: DLL_List.DLL_First - DLL_List.DLL_First->HextHode
B4.2: DLL_List.DLL_First->PreHode - HGLL
B4.3: Thuc hien B8
B5: lF (DelHode->HextHode - HGLL) // Loai bo nut cuoi cung trong danh sach
B5.T: DLL_List.DLL_Last - DLL_List.DLL_Last->PreHode
B5.2: DLL_List.DLL_Last->HextHode - HGLL
B5.3: Thuc hien B8
// Lien ket cac not truoc va sau DelHode voi nhau
B6: DelHode->PreHode->HextHode - DelHode->HextHode
B7: DelHode->HextHode->PreHode - DelHode->PreHode
//Bo moi lien ket giua DelHode voi hai nut truoc va sau no, va huy DelHode
B8: DelHode->HextHode - DelHode->PreHode - HGLL
B9: delete DelHode
Bkt: Ket thuc
- Cai at thuat toan:
Ham DLL_Delete_Hode co prototype:
int DLL_Delete_Hode (DLLP_Type &DList, T DelData);
Ham thuc hien viec xoa phan tu co thanh phan du lieu la DelData trong danh sach
lien ket doi quan ly boi hai con tro dau va cuoi ghi nhan trong DList. Ham tra ve
gia tr T neu viec xoa thanh cong va nguoc lai, ham tra ve gia tr -T. Hoi dung cua
ham nhu sau:
int DLL_Delete_Hode (DLLP_Type &DList, T DelData)
{ DLL_Type DelHode - DLL_Searching(DList, DelData);
if (DelHode -- HGLL)
return (-T);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 123
if (DelHode->HextHode -- HGLL && DelHode->PreHode -- HGLL)
DList.DLL_First - DList.DLL_Last - HGLL;
else
if (DelHode->PreHode -- HGLL)
{ DList.DLL_First - DList.DLL_First->HextHode;
DList.DLL_First->PreHode - HGLL;
}
else
if (DelHode->HextHode -- HGLL)
{ DList.DLL_Last - DList.DLL_Last->PreHode;
DList.DLL_Last->HextHode - HGLL;
}
else
{ DelHode->PreHode->HextHode - DelHode->HextHode;
DelHode->HextHode->PreHode - DelHode->PreHode;
}
DelHode->HextHode - DelHode->PreHode - HGLL;
delete DelHode;
return (T);
}
- Minh hoa thuat toan:
+ Huy nut dau: DelData - T6
DLL_List
DLL_First DLL_Last
DeINode NULL
16 20 18 25 40 30
NULL
DLL_List.DLL_First - DLL_List.DLL_First->HextHode
DLL_List
DLL_First DLL_Last
DeINode NULL
16 20 18 25 40 30
NULL
DLL_List.DLL_First->PreHode - HGLL
DLL_List
DLL_First DLL_Last
DeINode NULL
16 20 18 25 40 30
NULL NULL
DelHode->HextHode - DelHode->PreHode - HGLL;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 124
DLL_List
DLL_First DLL_Last
DeINode NULL NULL
16 20 18 25 40 30
NULL NULL
Ket qua sau khi huy:
DLL_List
DLL_First DLL_Last
NULL
20 18 25 40 30
NULL
+ Huy nut cuoi: DelData - 30
DLL_List
DLL_First DLL_Last
DeINode NULL
16 20 18 25 40 30
NULL

DLL_List.DLL_Last - DLL_List.DLL_Last->PreHode
DLL_List
DLL_First DLL_Last
DeINode NULL
16 20 18 25 40 30
NULL

DLL_List.DLL_Last->HextHode - HGLL
DLL_List
DLL_First DLL_Last NULL
DeINode NULL
16 20 18 25 40 30
NULL
DelHode->HextHode - DelHode->PreHode - HGLL
DLL_List
DLL_First DLL_Last NULL
DeINode NULL
16 20 18 25 40 30
NULL NULL
Ket qua sau khi huy:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 125
DLL_List
DLL_First DLL_Last
NULL
16 20 18 25 40
NULL
+ Huy nut giua: Cia su chung ta can huy nut co thanh phan du lieu la T8 (DelData - T8)
DLL_List
DLL_First DLL_Last
DeINode NULL
16 20 18 25 40 30
NULL
DelHode->PreHode->HextHode - DelHode->HextHode
DLL_List
DLL_First DLL_Last
NULL
16 20 18 25 40 30
NULL DeINode
DelHode->HextHode->PreHode - DelHode->PreHode
DLL_List
DLL_First DLL_Last
NULL
16 20 18 25 40 30
NULL DeINode

DelHode->HextHode - DelHode->PreHode - HGLL
DLL_List
DLL_First DLL_Last

NULL NULL NULL
16 20 18 25 40 30
NULL DeINode

Ket qua sau khi huy:
DLL_List
DLL_First DLL_Last
NULL
16 20 25 40 30
NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 126
g. Huy toan bo danh sach:
O day, chung ta thuc hien nhieu lan thao tac huy mot nut.
- Thuat toan:
BT: lF (DLL_List.DLL_First - HGLL)
Thuc hien Bkt
B2: TempHode - DLL_List.DLL_First
B3: DLL_List.DLL_First - DLL_List.DLL_First->HextHode
B4: lF (DLL_List.DLL_First - HGLL)
B4.T: DLL_List.DLL_Last - HGLL
B4.2: Thuc hien B7
B5: DLL_List.DLL_First->PreHode - HGLL
B6: TempHode->HextHode - HGLL
B7: delete TempHode
B8: Lap lai BT
Bkt: Ket thuc
- Cai at thuat toan:
Ham DLL_Delete co prototype:
void DLL_Delete (DLLP_Type &DList);
Ham thuc hien viec huy toan bo danh sach lien ket doi DList.
Hoi dung cua ham nhu sau:
void DLL_Delete (DLLP_Type &DList)
{ DLL_Type TempHode - DList.DLL_First;
while (TempHode !- HGLL)
{ DList.DLL_First - DList.DLL_First->HextHode;
TempHode->HextHode - HGLL;
if (DList.DLL_First !- HGLL)
DList.DLL_First->PreHode - HGLL;
delete TempHode;
TempHode - DList.DLL_First;
}
return ;
}
Luu y:
Chung ta cung co the van dung ham DLL_Delete_Hode de thuc hien thao tac nay,
luc do ham DLL_Delete co the viet lai nhu sau:
void DLL_Delete (DLLP_Type &DList)
{ DLL_Type TempHode - DList.DLL_First;
while (TempHode !- HGLL)
{ DLL_Delete_Hode(DList, TempHode->Key);
TempHode - DList.DLL_First;
}
return ;
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 127
h. Tao mi danh sach/ Nhap danh sach:
Cung tuong tu nhu trong danh sach lien ket don trong thao tac nay, chung ta lien tuc
thuc hien thao tac them mot phan tu vao danh sach ma ban dau danh sach nay la
mot danh sach rong (Com hai con tro HGLL). Chung ta cung co the su dung mot
trong ba ham them phan tu de them phan tu, o day su dung ham SLL_Add_Last.
Cia su chung ta can tao danh sach lien ket doi co H phan tu.
- Thuat toan:
BT: DLL_lnitialize(DLL_List)
B2: i - T
B3: lF (i > H)
Thuc hien Bkt
B4: HewData - lnputHewData() // Hhap gia tr cho bien HewData
B5: DLL_Add_Last(DLL_List, HewData)
B6: i++
B7: Lap lai B3
Bkt: Ket thuc
- Cai at thuat toan:
Ham DLL_Create co prototype:
DLLP_Type DLL_Create (DLLP_Type &DList, int H);
Ham tao danh sach lien ket doi co H nut quan ly boi hai da ch nut dau tien va
nut cuoi cung thong qua DList. Ham tra ve gia tr ghi nhan hai da ch cua nut dau
tien va nut cuoi cung trong danh sach neu viec tao thanh cong, nguoc lai ham tra
ve danh sach rong (ca hai da ch deu la gia tr HGLL).
Hoi dung cua ham nhu sau:
DLLP_Type DLL_Create(DLLP_Type &DList, int H)
{ DLL_lnitialize(DList);
T HewData;
for (int i - 0; i < H; i++)
{ HewData - lnputHewData();
if (DLL_Add_Last(DList, HewData) -- HGLL)
{ DLL_Delete(DList);
break;
}
}
return (DList);
}
Luu y:
Ham lnputHewData thuc hien nhap vao noi dung cua mot bien co kieu du lieu T
va tra ve gia tr moi nhap vao. Tuy vao tung truong hop cu the ma chung ta viet
ham lnputHewData cho phu hop.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 128
i. Tach mot danh sach thanh nhieu danh sach:
Cia su chung ta can thuc hien viec tach cac nut trong danh sach lien ket doi
DLL_List thanh hai danh sach lien ket doi con DLL_ListT va DLL_List2 luan phien
theo cac duong chay tu nhien va can gi lai danh sach lien ket ban au.
- Thuat toan:
BT: DLL_lnitialize(DLL_ListT)
B2: DLL_lnitialize(DLL_List2)
B3: CurHode - DLL_List.DLL_First
// Cat cac nut tu T duong chay tu nhien ve DLL_ListT
B4: lF (CurHode - HGLL)
Thuc hien Bkt
B5: DLL_Add_Last(DLL_ListT, CurHode->Key)
B6: CurHode - CurHode->HextHode
B7: lF (CurHode - HGLL)
Thuc hien Bkt
B8: lF (CurHode->PreHode->Key > CurHode->Key)
Thuc hien BT0
B9: Lap lai B4
// Cat cac nut tu T duong chay tu nhien ve DLL_List2
BT0: lF (CurHode - HGLL)
Thuc hien Bkt
BTT: DLL_Add_Last(DLL_List2, CurHode->Key)
BT2: CurHode - CurHode->HextHode
BT3: lF (CurHode - HGLL)
Thuc hien Bkt
BT4: lF (CurHode->PreHode->Key > CurHode->Key)
Thuc hien B4
BT5: Lap lai BT0
Bkt: Ket thuc
- Cai at thuat toan:
Ham DLL_Split co prototype:
void DLL_Split(DLLP_Type &DList, DLLP_Type &DListT, DLLP_Type &DList2);
Ham thuc hien viec phan phoi cac duong chay tu nhien trong DList thanh ve hai
danh sach moi DListT va DList2 (Danh sach cu DList van duoc giu nguyen).
Hoi dung cua ham nhu sau:
void DLL_Split(DLLP_Type &DList, DLLP_Type &DListT, DLLP_Type &DList2)
{ DLL_lnitialize(DListT);
DLL_lnitialize(DList2);
DLL_Type CurHode - DList.DLL_First;
while (CurHode !- HGLL)
{ do { if (DLL_Add_Last(DListT, CurHode->Key) -- HGLL)
{ DLL_Delete (DListT);
DLL_Delete (DList2);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 129
break;
}
CurHode - CurHode->HextHode;
if (CurHode -- HGLL)
break;
if (CurHode->Key < CurHode->PreHode->Key)
break;
}
while (T);
if (CurHode -- HGLL)
break;
do { if (DLL_Add_Last(DList2, CurHode->Key) -- HGLL)
{ DLL_Delete (DListT);
DLL_Delete (DList2);
break;
}
CurHode - CurHode->HextHode;
if (CurHode -- HGLL)
break;
if (CurHode->Key < CurHode->PreHode->Key)
break;
}
while (T);
}
return ;
}
j. Nhap nhieu danh sach thanh mot danh sach:
Chung ta thuc hien thao tac nay trong hai truong hop:
+ Chep noi duoi cac danh sach lai voi nhau;
+ Tron xen lan cac phan tu trong cac danh sach vao thanh mot danh sach theo
mot trat tu nhat dnh
va sau khi nhap xong van gi lai cac danh sach ban au.
Cia su chung ta can nhap hai danh sach DLL_ListT va DLL_List2 lai voi nhau thanh
mot danh sach DLL_List.
- Thuat toan ghep noi hai danh sach thanh mot danh sach moi:
BT: DLL_lnitialize (DLL_List)
// ua DLL_ListT vao dau DLL_List
B2: CurHode - DLL_ListT.DLL_First
B3: lF (CurHode - HGLL)
Thuc hien B7
B4: lF (DLL_Add_Last(DLL_List, CurHode->Key) - HGLL)
B4.T: DLL_Delete (DLL_List)
B4.2: Thuc hien Bkt
B5: CurHode - CurHode->HextHode
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 130
B6: Lap lai B3
// ua DLL_List2 vao sau DLL_List
B7: CurHode - DLL_List2.DLL_First
B8: lF (CurHode - HGLL)
Thuc hien Bkt
B9: lF (DLL_Add_Last(DLL_List, CurHode->Key) - HGLL)
B4.T: DLL_Delete (DLL_List)
B4.2: Thuc hien Bkt
BT0: CurHode - CurHode->HextHode
BTT: Lap lai B8
Bkt: Ket thuc
- Thuat toan tron 2 danh sach thanh 1 danh sach moi theo cac uong chay tu nhien:
BT: CurHodeT - DLL_ListT.DLL_First
B2: CurHode2 - DLL_List2.DLL_First
B3: lF (CurHodeT - HGLL OP CurHode2 - HGLL)
Thuc hien B6
B4: lF (CurHodeT->Key CurHode2->Key)
B4.T: lf (DLL_Add_Last (DLL_List, CurHodeT->Key) - HGLL)
B4.T.T: DLL_Delete(DLL_List)
B4.T.2: Thuc hien Bkt
B4.2: CurHodeT - CurHodeT->HextHode
B4.3: lf (CurHodeT - HGLL)
Thuc hien BT0
B4.4: lf (CurHodeT->PreHode->Key > CurHodeT->Key)
B4.4.T: if (DLL_Add_Last (DLL_List, CurHode2->Key) - HGLL)
B4.4.T.T: DLL_Delete(DLL_List)
B4.4.T.2: Thuc hien Bkt
B4.4.2: CurHode2 - CurHode2->HextHode
B4.4.3: if (CurHode2 - HGLL)
Thuc hien B6
B4.4.4: if (CurHode2->PreHode->Key > CurHode2->Key)
Thuc hien B3
B4.4.5: Lap lai B4.4.T
B4.5: Lap lai B4
B5: ELSE
B5.T: lf (DLL_Add_Last (DLL_List, CurHode2->Key) - HGLL)
B5.T.T: DLL_Delete(DLL_List)
B5.T.2: Thuc hien Bkt
B5.2: CurHode2 - CurHode2->HextHode
B5.3: lf (CurHode2 - HGLL)
Thuc hien B6
B5.4: lf (CurHode2->PreHode->Key > CurHode2->Key)
B5.4.T: if (DLL_Add_Last (DLL_List, CurHodeT->Key) - HGLL)
B5.4.T.T: DLL_Delete(DLL_List)
B5.4.T.2: Thuc hien Bkt
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 131
B5.4.2: CurHodeT - CurHodeT->HextHode
B5.4.3: if (CurHodeT - HGLL)
Thuc hien BT0
B5.4.4: if (CurHodeT->PreHode->Key > CurHodeT->Key)
Thuc hien B3
B5.4.5: Lap lai B5.4.T
B5.5: Lap lai B4
// ua phan con lai trong DLL_ListT ve DLL_List
B6: lF (CurHodeT - HGLL)
Thuc hien Bkt
B7: lF (DLL_Add_Last(DLL_List, CurHodeT->Key) - HGLL)
B7.T: DLL_Delete (DLL_List)
B7.2: Thuc hien Bkt
B8: CurHodeT - CurHodeT->HextHode
B9: Lap lai B6
// ua phan con lai trong DLL_List2 ve DLL_List
BT0: lF (CurHode2 - HGLL)
Thuc hien Bkt
BTT: lF (DLL_Add_Last(DLL_List, CurHode2->Key) - HGLL)
BTT.T: DLL_Delete (DLL_List)
BTT.2: Thuc hien Bkt
BT2: CurHode2 - CurHode2->HextHode
BT3: Lap lai BT0
Bkt: Ket thuc
- Cai at:
Cac ham nhap danh sach co prototype:
DLLP_Type DLL_Concat (DLLP_Type &DListT, DLLP_Type &DList2,
DLLP_Type &DList);
DLLP_Type DLL_Merge (DLLP_Type &DListT, DLLP_Type &DList2,
DLLP_Type &DList);
Ham thuc hien viec nhap cac nut trong hai danh sach DListT, DList2 thanh mot
danh sach theo hai truong hop da trnh bay trong hai thuat toan tren day. Ham tra
ve gia tr cua danh sach sau khi ghep.
Hoi dung cua cac ham nhu sau:
DLLP_Type DLL_Concat (DLLP_Type &DListT, DLLP_Type &DList2,
DLLP_Type &DList)
{ DLL_lnitialize (DList);
DLL_Type CurHode - DListT.DLL_First;
while (CurHode !- HGLL)
{ if (DLL_Add_Last (DList, CurHode->Key) -- HGLL)
{ DLL_Delete(DList);
return (DList);
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 132
CurHode - CurHode->HextHode;
}
CurHode - DList2.DLL_First;
while (CurHode !- HGLL)
{ if (DLL_Add_Last (DList, CurHode->Key) -- HGLL)
{ DLL_Delete(DList);
return (DList);
}
CurHode - CurHode->HextHode;
}
return (DList);
}
//----------------------------------------------------------------
DLLP_Type DLL_Merge (DLLP_Type &DListT, DLLP_Type &DList2,
DLLP_Type &DList)
{ DLL_Type CurHodeT - DListT.DLL_First;
DLL_Type CurHode2 - DList2.DLL_First;
while (CurHodeT !- HGLL && CurHode2 !- HGLL)
{ if (CurHodeT->Key <- CurHode2->Key)
{ if (DLL_Add_Last (DList, CurHodeT->Key) -- HGLL)
{ DLL_Delete (DList);
return (DList);
}
CurHodeT - CurHodeT->HextHode;
if (CurHodeT -- HGLL)
break;
if (CurHodeT->PreHode->Key > CurHodeT->Key)
do { if (DLL_Add_Last (DList, CurHode2->Key) -- HGLL)
{ DLL_Delete (DList);
return (DList);
}
CurHode2 - CurHode2->HextHode;
}
while (CurHode2 !- HGLL &&
CurHode2->PreHode->Key <- CurHode2->Key);
}
else
{ if (DLL_Add_Last (DList, CurHode2->Key) -- HGLL)
{ DLL_Delete (DList);
return (DList);
}
CurHode2 - CurHode2->HextHode;
if (CurHode2 -- HGLL)
break;
if (CurHode2->PreHode->Key > CurHode2->Key)
do { if (DLL_Add_Last (DList, CurHodeT->Key) -- HGLL)
{ DLL_Delete (DList);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 133
return (DList);
}
CurHodeT - CurHodeT->HextHode;
}
while (CurHodeT !- HGLL &&
CurHodeT->PreHode->Key <- CurHodeT->Key);
}
}
while (CurHodeT !- HGLL)
{ if (DLL_Add_Last (DList, CurHodeT->Key) -- HGLL)
{ DLL_Delete (DList);
break;
}
CurHodeT - CurHodeT->HextHode;
}
while (CurHode2 !- HGLL)
{ if (DLL_Add_Last (DList, CurHode2->Key) -- HGLL)
{ DLL_Delete (DList);
break;
}
CurHode2 - CurHode2->HextHode;
}
return (DList);
}
k. Sap xep th t thanh phan d lieu cac nut trong danh sach:
Thao tac nay rat thuan tien trong viec ap dung thuat toan sap xep tron de sap xep,
sinh vien co the tu thuc hien. O day, chung ta van dung thuat toan sap xep noi bot
de sap xep du lieu.
- Thuat toan sap xep van dung thuat toan noi bot:
BT: lnode - DLL_List.DLL_First
B2: lF (lnode - HGLL)
Thuc hien Bkt
B3: lF (lnode - DLL_List.DLL_Last)
Thuc hien Bkt
B4: Jnode - DLL_List.DLL_Last
B5: lF (Jnode - lnode)
Thuc hien B7
B6: ELSE
B6.T: lf (Jnode->Key < Jnode->PreHode->Key)
Swap (Jnode->Key, Jnode->PreHode->Key)
B6.2: Jnode - Jnode->PreHode
B6.3: Lap lai B5
B7: lnode - lnode->HextHode
B8: Lap lai B3
Bkt: Ket thuc
- Cai at thuat toan:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 134
Ham DLL_Bubble_Sort co prototype:
void DLL_Bubble_Sort (DLLP_Type &DList);
Ham thuc hien viec sap xep thanh phan du lieu cua cac nut trong danh sach lien
ket doi DList theo thu tu tang dua tren thuat toan sap xep noi bot.
Hoi dung cua ham nhu sau:
void DLL_Bubble_Sort (DLLP_Type &DList)
{ DLL_Type lnode - DList.DLL_First;
if (lnode -- HGLL)
return;
while (lnode !- DList.DLL_Last)
{ DLL_Type Jnode - DList.DLL_Last;
while (Jnode !- lnode)
{ if (Jnode->Key < Jnode->PreHode->Key)
Swap (Jnode->Key, Jnode->PreHode->Key);
Jnode - Jnode->PreHode;
}
lnode - lnode->HextHode;
}
return ;
}
l. Sao chep mot danh sach thanh mot danh sach mi:
Thao tac nay hoan toan tuong tu nhu trong danh sach lien ket don.
- Thuat toan:
BT: DLL_lnitialize(HewList)
B2: CurHode - DLL_List.DLL_First
B3: lF (CurHode - HGLL)
Thuc hien Bkt
B4: DLL_Add_Last(HewList, CurHode->Key)
B5: CurHode - CurHode->HextHode
B6: Lap lai B3
Bkt: Ket thuc
- Cai at thuat toan:
Ham DLL_Copy co prototype:
DLLP_Type DLL_Copy (DLLP_Type &DList, DLLP_Type &HewList);
Ham thuc hien viec sao chep noi dung danh sach DList thanh danh sach HewList
co cung noi dung thanh phan du lieu theo thu tu cua cac nut tren DList. Ham tra
ve gia tr cua danh sach moi neu viec sao chep thanh cong, nguoc lai ham tra ve
gia tr khoi tao cua danh sach.
Hoi dung cua ham nhu sau:
DLLP_Type DLL_Copy (DLLP_Type &DList, DLLP_Type &HewList)
{ DLL_lnitialize(HewList);
DLL_Type CurHode - DList.DLL_First;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 135
while (CurHode !- HGLL)
{ if (DLL_Add_Last (HewList, CurHode->Key) -- HGLL)
{ DLL_Detete (HewList);
break;
}
CurHode - CurHode->HextHode;
}
return (HewList);
}
4.4.4. Uu DDuoc d1em cua aDD acD J1eD Ret
Do cac phan tu (nut) duoc luu tru khong lien tiep nhau trong bo nho, do vay danh
sach lien ket co cac uu nhuoc diem sau day:
- Mat do su dung bo nho cua danh sach lien ket khong toi uu tuyet doi (<T00);
- Viec truy xuat va tm kiem cac phan tu cua danh sach lien ket mat nhieu thoi gian
boi luon luon phai duyet tuan tu qua cac phan tu trong danh sach;
- Tan dung duoc nhung khong gian bo nho nho de luu tru tung nut, tuy nhien bo nho
luu tru thong tin moi nut lai ton nhieu hon do con phai luu them thong tin ve vung
lien ket. Hhu vay neu vung du lieu cua moi nut la lon hon th ty le muc tieu ton bo
nho nay la khong dang ke, nguoc lai th no lai gay lang phi bo nho.
- Viec them, bot cac phan tu trong danh sach, tach nhap cac danh sach kha de dang
do chung ta ch can thay doi moi lien ket giua cac phan tu voi nhau.
4.5. Danh sach han che
Trong cac thao tac tren danh sach khong phai luc nao cung co the thuc hien duoc
tat ca ma nhieu khi cac thao tac nay b han che trong mot so loai danh sach, do la
danh sach han che.
Hhu vay, danh sach han che la danh sach ma cac thao tac tren do b han che trong
mot chung muc nao do tuy thuoc vao danh sach. Trong phan nay chung ta xem xet
hai loai danh sach han che chu yeu do la:
- Hang doi (ueue);
- Hgan xep (Stack).
4.5.J. HaDQ do1 (Queue,
A. Khai niem - Cau truc du Iieu:
Hang doi la mot danh sach ma trong do thao tac them mot phan tu vao trong danh
sach duoc thuc hien o mot dau nay va thao tac lay ra mot phan tu tu trong danh
sach lai duoc thuc hien o dau kia.
Hhu vay, cac phan tu duoc dua vao trong hang doi truoc se duoc lay ra truoc, phan
tu dua vao trong hang doi sau se duoc lay ra sau. Do do ma hang doi con duoc goi
la danh sach vao truoc ra truoc (FlFO List) va cau truc du lieu nay con duoc goi la
cau truc FlFO (First ln First Out).
Co nhieu cach de bieu dien va to chuc cac hang doi:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 136


- Su dung danh sach dac,
- Su dung danh sach lien ket,
Tuy nhien, dieu quan trong va can thiet la chung ta phai quan ly v tri hai dau cua
hang doi thong qua hai bien: Bien truoc (Front) va Bien sau (Pear). Hai bien nay co
the cung chieu hoac nguoc chieu voi thu tu cac phan tu trong mang va trong danh
sach lien ket. ieu nay co nghia la dau hang doi co the la dau mang, dau danh sach
lien ket ma cung co the la cuoi mang, cuoi danh sach lien ket. e thuan tien, o day
chung ta gia su dau hang doi cung la dau mang, dau danh sach lien ket. Truong hop
nguoc lai, sinh vien tu ap dung tuong tu.
O day chung ta se bieu dien va to chuc hang doi bang danh sach dac va bang danh
sach lien ket don duoc quan ly boi hai con tro dau va cuoi danh sach. Do vay cau
truc du lieu cua hang doi cung nhu cac thao tac tren hang doi se duoc trnh bay
thanh hai truong hop khac nhau.
- Bieu dien va to chuc bang danh sach dac:
typedef struct _C
{ int Len; // Chieu dai hang doi
int Front, Pear;
T * List; // Hoi dung hang doi
} C_GEGE;
C_GEGE C_List;
Hnh anh minh hoa:
CQ_List Front Rear

T 15 10 20 18 40 35 30
Len = 14
- Bieu dien va to chuc bang danh sach lien ket don;
typedef struct _Element
{ T Key;
_Element * Hext; // Vung lien ket quan ly da ch phan tu ke tiep
} _OneElement;
typedef _OneElement * _Type;
typedef struct P_Element
{ _Type Front;
_Type Pear;
} S_GEGE;
S_GEGE S_List;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 137
Hnh anh minh hoa:
SQ_List
Front Rear NULL
15 10 20 18 40 35 30

B. Cac thao tac tren hang oi to chuc bang danh sach ac:
Do han che cua danh sach dac cho nen moi hang doi deu co mot chieu dai co dnh.
Do vay, trong qua trnh thao tac tren hang do i co the xay ra hien tuong hang doi b
day hoac hang doi b tran.
- Khi hang doi b day: so phan tu cua hang doi bang chieu dai cho phep cua hang
doi. Luc nay chung ta khong the them bat ky mot phan tu nao vao hang doi.
- Khi hang doi b tran: so phan tu cua hang doi nho hon chieu dai cho phep cua
hang doi nhung Pear - Len. Luc nay chung ta phai khac phuc tnh trang tran
hang doi bang cach dch tat ca cac phan tu cua hang doi ra phia truoc Front-T
v tri hoac xoay vong de Pear chuyen len v tri dau danh sach dac. Trong phan
nay chung ta su dung phuong phap xoay vong. Hhu vay theo phuong phap nay,
hang doi b day trong cac truong hop sau:
+ Front - T va Pear - Len, khi: Front < Pear
+ Pear + T - Front, khi: Pear < Front
Ghi chu:
Heu chung ta khac phuc hang doi b tran bang phuong phap dch tat ca cac phan tu
cua hang doi ra phia truoc Front-T v tri th hang doi b day khi thoa man dieu kien:
Front - T va Pear - Len (O day ta luon luon co: Front Pear).
a. Khi tao hang i (Initialize):
Trong thao tac nay chung ta thuc hien viec xac dnh kich thuoc hang doi, cap phat
bo nho de luu tru phan du lieu cho hang do i, dong thoi cho gia tr cac thanh phan
Front, Pear ve gia tr 0 (trong C chung ta khoi tao ve gia tr T).
- Thuat toan:
BT: C_List.Len - Length
B2: C_List.List - new T|Length]
B3: lF (C_List.List - HGLL)
Thuc hien Bkt
B4: C_List.Front - C_List.Pear - 0
Bkt: Ket thuc
- Cai at thuat toan:
Ham C_lnitialize co prototype:
T * C_lnitialize (C_GEGE &List, int Length);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 138
Ham thuc hien viec khoi tao gia tr ban dau cho hang doi quan ly boi List co
kich thuoc Length. Ham tra ve con tro tro toi da ch dau khoi du lieu cua hang
doi neu viec khoi tao thanh cong, nguoc lai ham tra ve con tro HGLL.
Hoi dung cua ham nhu sau:
T * C_lnitialize (C_GEGE &List, int Length)
{ List.Len - Length;
List.List - new T|Length];
if (List.List -- HGLL)
return (HGLL);
List.Front - List.Pear - -T;
return (List.List);
}
b. Them (a) mot phan t vao hang i (Add):
Trong hang doi chung ta luon luon dua phan tu moi vao cuoi hang doi, ngay sau v
tri Pear (neu hang doi chua b day). Cia su chung ta can dua phan tu co gia tr
HewData vao trong hang doi:
- Thuat toan:
// BT+B2: Heu hang doi b day
BT: lF (C_List.Front - T AHD C_List.Pear - C_List.Len)
Thuc hien Bkt
B2: lF (C_List.Pear+T - C_List.Front)
Thuc hien Bkt
B3: lF (C_List.Front - 0) // Heu hang doi rong
C_List.Front - T
B4: lF (C_List.Pear - C_List.Len) //Heu hang b tran
C_List.Pear - T
B5: ELSE
C_List.Pear++
B6: C_List.List|C_List.Pear] - HewData
Bkt: Ket thuc
- Cai at thuat toan:
Ham C_Add co prototype:
int C_Add (C_GEGE &List, T HewData);
Ham thuc hien viec them phan tu co noi dung HewData vao trong hang doi quan
ly boi List. Ham tra ve v tri cua phan tu vua moi them neu viec them thanh
cong, nguoc lai khi hang doi b day ham tra ve gia tr -T.
Hoi dung cua ham nhu sau:
int C_Add (C_GEGE &List, T HewData)
{ if (List.Front -- 0 && List.Pear -- List.Len-T)
return (-T);
if (List.Pear+T -- List.Front)
return (-T);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 139
if (List.Front -- -T)
List.Front - 0;
if (List.Pear -- List.Len)
List.Pear - 0;
else
List.Pear +- T;
List.List|List.Pear] - HewData;
return (List.Pear);
}
c. Lay noi dung mot phan t trong hang i ra e x ly (Get):
Trong hang doi chung ta luon luon lay noi dung phan tu o ngay dau hang doi, tai v
tri Front (neu hang doi khong rong). Cia su ta can lay du lieu ra bien Data:
- Thuat toan:
// Heu hang doi b rong
BT: lF (C_List.Front - 0)
Thuc hien Bkt
B2: Data - C_List.List|C_List.Front]
B3: lF (C_List.Pear - C_List.Front) // Hang doi ch co T phan tu
B3.T: C_List.Pear - C_List.Front - 0
B3.2: Thuc hien Bkt
B4: lF (C_List.Front - C_List.Len)
C_List.Front - T
B5: ELSE
C_List.Front++
Bkt: Ket thuc
- Cai at thuat toan:
Ham C_Cet co prototype:
int C_Cet (C_GEGE &List, T &Data);
Ham thuc hien viec lay noi dung phan tu dau hang doi quan ly boi List va ghi
nhan vao Data neu lay duoc. Ham tra ve gia tr T neu viec lay thanh cong, nguoc
lai khi hang doi b rong ham tra ve gia tr -T.
Hoi dung cua ham nhu sau:
int C_Cet (C_GEGE &List, T &Data)
{ if (List.Front -- -T)
return (-T);
Data - List.List|List.Front];
if (List.Front -- List.Pear)
{ List.Front - List.Pear - -T;
return (T);
}
if (List.Front -- List.Len-T)
List.Front - 0;
else
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 140
List.Front +- T;
return (T);
}
d. Huy hang i:
Trong thao tac nay chung ta thuc hien viec huy bo nho da cap phat cho hang doi.
Ham C_Delete co noi dung nhu sau:
void C_Delete (C_GEGE &List)
{ delete List.List;
return;
}
C. Cac thao tac tren hang oi to chuc bang danh Iien ket on:
Khac voi hang doi bieu dien bang danh sach dac, o day hang doi ch b day khi het
bo nho va khong bao gio b tran.
a. Khi tao hang i (Initialize):
Tuong tu nhu trong danh sach lien ket don, trong thao tac nay chung ta ch don
gian thuc hien viec gan cac con tro Front va Pear ve con tro HGLL. Ham
S_lnitialize co noi dung nhu sau:
S_GEGE S_lnitialize (S_GEGE &List)
{ List.Front - List.Pear - HGLL;
return (List);
}
b. Them (a) mot phan t vao hang i (Add):
O day chung ta them mot phan tu vao sau Pear (Them vao cuoi danh sach lien ket).
Cia su chung ta can dua phan tu co gia tr du lieu la HewData vao trong hang doi:
- Thuat toan:
BT: HewElement - SLL_Create_Hode(HewData)
B2: lF (HewElement - HGLL)
Thuc hien Bkt
B3: lF (S_List.Front - HGLL) // Heu hang doi b rong
B3.T: S_List.Front - S_List.Pear - HewElement
B3.2: Thuc hien Bkt
B4: S_List.Pear->Hext - HewElement
B5: S_List.Pear - HewElement
Bkt: Ket thuc
- Cai at thuat toan:
Ham S_Add co prototype:
_Type S_Add (S_GEGE &List, T HewData);
Ham thuc hien viec them phan tu co noi dung HewData vao trong hang doi quan
ly boi List. Ham tra ve da ch cua phan tu vua moi them neu viec them thanh
cong, nguoc lai ham tra ve con tro HGLL.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 141
Hoi dung cua ham nhu sau:
_Type S_Add (S_GEGE &List, T HewData)
{ _Type HewElement - SLL_Create_Hode(HewData);
if (HewElement -- HGLL)
return (HGLL);
if (List.Front -- HGLL)
List.Front - List.Pear - HewElement;
else
{ List.Pear->Hext - HewElement;
List.Pear - HewElement;
}
return (HewElement);
}
c. Lay noi dung mot phan t trong hang i ra e x ly (Get):
O day chung ta lay noi dung thanh phan du lieu cua phan tu o da ch Front ra bien
Data va tien hanh huy luon phan tu nay.
- Thuat toan:
// Heu hang doi b rong
BT: lF (S_List.Front - HGLL)
Thuc hien Bkt
B2: TempElement - S_List.Front
B3: S_List.Front - S_List.Front->Hext
B4: TempElement->Hext - HGLL
B5: Data - TempElement->Key
B6: lF (S_List.Front - HGLL) // Hang doi ch co T phan tu
S_List.Pear - HGLL
B7: delete TempElement
Bkt: Ket thuc
- Cai at thuat toan:
Ham S_Cet co prototype:
int S_Cet (S_GEGE &List, T &Data);
Ham thuc hien viec lay noi dung thanh phan du lieu cua phan tu dau hang doi
quan ly boi List va ghi nhan vao Data neu lay duoc. Ham tra ve gia tr T neu
viec lay thanh cong, nguoc lai khi hang doi b rong ham tra ve gia tr -T.
Hoi dung cua ham nhu sau:
int S_Cet (S_GEGE &List, T &Data)
{ if (List.Front -- HGLL)
return (-T);
_Type TempElement - List.Front;
List.Front - List.Front->Hext;
TempElement->Hext - HGLL;
Data - TempElement->Key;
if (List.Front -- HGLL)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 142
List.Pear - HGLL;
delete TempElement;
return (T);
}
d. Huy hang i:
Trong thao tac nay chung ta thuc hien viec huy toan bo cac phan tu trong hang doi.
Ham S_Delete co noi dung nhu sau:
void S_Delete (S_GEGE &List)
{ List.Pear - HGLL;
while (List.Front !- HGLL)
{ _Type TempElement - List.Front;
List.Front - List.Front->Hext;
TempElement->Hext - HGLL;
delete TempElement;
}
return;
}
4.5.2. NQaD ep (StacR,
A. Khai niem - Cau truc du Iieu:
Hgan xep la mot danh sach ma trong do thao tac them mot phan tu vao trong danh
va thao tac lay ra mot phan tu tu trong danh sach duoc thuc hien o cung mot dau.
Hhu vay, cac phan tu duoc dua vao trong ngan xep sau cung se duoc lay ra truoc
tien, phan tu dua vao trong hang doi truoc tien se duoc lay ra sau cung. Do do ma
ngan xep con duoc goi la danh sach vao sau ra truoc (LlFO List) va cau truc du lieu
nay con duoc goi la cau truc LlFO (Last ln First Out).
Tuong tu nhu hang doi, co nhieu cach de bieu dien va to chuc cac ngan xep:
- Su dung danh sach dac,
- Su dung danh sach lien ket,
Do o day ca hai thao tac them vao va lay ra deu duoc thuc hien o mot dau nen
chung ta ch can quan ly v tri dau cua danh sach dung lam mat cho ngan xep thong
qua bien ch so be mat SP (Stack Pointer). Ch so nay co the la cung chieu (dau)
hoac nguoc chieu (cuoi) voi thu tu cac phan tu trong mang va trong danh sach lien
ket. ieu nay co nghia la be mat ngan xep co the la dau mang, dau danh sach lien
ket ma cung co the la cuoi mang, cuoi danh sach lien ket. e thuan tien, o day
chung ta gia su be mat cua ngan xep la dau mang, dau danh sach lien ket. Truong
hop nguoc lai, sinh vien tu ap dung tuong tu.
O day chung ta cung se bieu dien va to chuc hang doi bang danh sach dac va bang
danh sach lien ket don duoc quan ly boi con tro dau danh sach. Do vay cau truc du
lieu cua ngan xep va cac thao tac tren do se duoc trnh bay thanh hai truong hop
khac nhau.
- Bieu dien va to chuc bang danh sach dac:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 143


typedef struct S_C
{ int Size; // Kich thuoc ngan xep
int SP;
T * List; // Hoi dung ngan xep
} C_STACK;
C_STACK CS_List;
Hnh anh minh hoa:


CS_List SP

T 5 30 10 39 35 26 25 40
Size = 14
- Bieu dien va to chuc bang danh sach lien ket don;
typedef struct S_Element
{ T Key;
S_Element * Hext; // Vung lien ket quan ly da ch phan tu ke tiep
} S_OneElement;
typedef S_OneElement * S_STACK;
S_STACK S_SP;
Hnh anh minh hoa:
S_SP NULL
15 10 20 18 40 35 30

B. Cac thao tac tren ngan xep to chuc bang danh sach ac:
Do han che cua danh sach dac cho nen moi ngan xep se co mot kich thuoc co dnh.
Do vay, trong qua trnh thao tac tren ngan xep co the xay ra hien tuong ngan xep b
day. Hgan xep b day khi so phan tu cua ngan xep bang kich thuoc cho phep cua
ngan xep (SP - T). Luc nay chung ta khong the them bat ky mot phan tu nao vao
trong ngan xep.
a. Khi tao ngan xep (Initialize):
Trong thao tac nay chung ta thuc hien viec xac dnh kich thuoc ngan xep, cap phat
bo nho de luu tru phan du lieu cho ngan xep va cho gia tr thanh phan SP ve gia tr
Size+T.
- Thuat toan:
BT: CS_List.Size - MaxSize
B2: CS_List.List - new T|MaxSize]
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 144
B3: lF (CS_List.List - HGLL)
Thuc hien Bkt
B4: CS_List.SP - CS_List.Size + T
Bkt: Ket thuc
- Cai at thuat toan:
Ham CS_lnitialize co prototype:
T * CS_lnitialize (C_STACK &SList, int MaxSize);
Ham thuc hien viec khoi tao gia tr ban dau cho ngan xep quan ly boi SList co
kich thuoc MaxSize. Ham tra ve con tro tro toi da ch dau khoi du lieu cua ngan
xep neu viec khoi tao thanh cong, nguoc lai ham tra ve con tro HGLL.
Hoi dung cua ham nhu sau:
T * CS_lnitialize (C_STACK &SList, int MaxSize)
{ SList.Size - MaxSize;
SList.List - new T|MaxSize];
if (SList.List -- HGLL)
return (HGLL);
SList.SP - SList.Size;
return (SList.List);
}
b. Them (ay) mot phan t vao ngan xep (Push):
Trong ngan xep chung ta luon luon dua phan tu moi vao tren cung cua ngan xep,
ngay truoc v tri SP (neu ngan xep chua b day). Cia su chung ta can dua phan tu co
gia tr HewData vao trong ngan xep:
- Thuat toan:
BT: lF (CS_List.SP - T) // Heu ngan xep b day
Thuc hien Bkt
B2: CS_List.SP--
B3: CS_List.List|CS_List.SP] - HewData
Bkt: Ket thuc
- Cai at thuat toan:
Ham CS_Push co prototype:
int CS_Push (C_STACK &SList, T HewData);
Ham thuc hien viec day them phan tu co noi dung HewData vao trong ngan xep
quan ly boi SList. Ham tra ve v tri cua phan tu vua moi them neu viec them thanh
cong, nguoc lai khi ngan xep b day ham tra ve gia tr -T.
Hoi dung cua ham nhu sau:
int CS_Push (C_STACK &SList, T HewData)
{ if (SList.SP -- 0)
return (-T);
SList.SP -- T;
SList.List|SList.SP] - HewData;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 145
return (SList.SP);
}
c. Lay noi dung mot phan t trong ngan xep ra e x ly (Pop):
O day chung ta cung luon luon lay noi dung phan tu o ngay be mat ngan xep, tai v
tri SP (neu ngan xep khong rong). Cia su ta can lay du lieu ra bien Data:
- Thuat toan:
// Heu ngan xep b rong
BT: lF (CS_List.SP - CS_List.Size+T)
Thuc hien Bkt
B2: Data - CS_List.List|CS_List.SP]
B3: CS_List.SP++
Bkt: Ket thuc
- Cai at thuat toan:
Ham CS_Pop co prototype:
int CS_Pop (C_STACK &SList, T &Data);
Ham thuc hien viec lay noi dung phan tu o tren be mat ngan xep quan ly boi SList
va ghi nhan vao Data neu lay duoc. Ham tra ve gia tr T neu viec lay thanh cong,
nguoc lai khi ngan xep b rong ham tra ve gia tr -T.
Hoi dung cua ham nhu sau:
int CS_Pop (C_STACK &SList, T &Data)
{ if (SList.SP -- SList.Size)
return (-T);
Data - SList.List|SList.SP];
SList.SP +- T;
return (T);
}
d. Huy ngan xep:
Trong thao tac nay chung ta thuc hien viec huy bo nho da cap phat cho ngan xep.
Ham CS_Delete co noi dung nhu sau:
void CS_Delete (C_STACK &SList)
{ delete SList.List;
return;
}
C. Cac thao tac tren ngan xep to chuc bang danh Iien ket on:
a. Khi tao ngan xep:
Ham SS_lnitialize co noi dung nhu sau:
S_STACK SS_lnitialize (S_STACK &SList)
{ SList - HGLL;
return (SList);
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 146
b. Them (ay) mot phan t vao ngan xep (Push):
O day chung ta them mot phan tu vao truoc S_SP (Them vao dau danh sach lien
ket). Cia su chung ta can dua phan tu co gia tr du lieu la HewData vao trong ngan
xep:
- Thuat toan:
BT: HewElement - SLL_Create_Hode(HewData)
B2: lF (HewElement - HGLL)
Thuc hien Bkt
B3: lF (S_SP - HGLL) // Heu ngan xep b rong
B3.T: S_SP - HewElement
B3.2: Thuc hien Bkt
B4: HewElement->Hext - S_SP
B5: S_SP - HewElement
Bkt: Ket thuc
- Cai at thuat toan:
Ham SS_Push co prototype:
S_STACK SS_Push (S_STACK &SList, T HewData);
Ham thuc hien viec them phan tu co noi dung HewData vao trong ngan xep quan
ly boi SList. Ham tra ve da ch cua phan tu vua moi them neu viec them thanh
cong, nguoc lai ham tra ve con tro HGLL.
Hoi dung cua ham nhu sau:
S_STACK SS_Push (S_STACK &SList, T HewData)
{ S_STACK HewElement - SLL_Create_Hode(HewData);
if (HewElement -- HGLL)
return (HGLL);
HewElement->Hext - SList;
SList - HewElement;
return (HewElement);
}
c. Lay noi dung mot phan t trong ngan xep ra e x ly (Pop):
O day chung ta lay noi dung thanh phan du lieu cua phan tu o da ch S_SP ra bien
Data va tien hanh huy luon phan tu nay.
- Thuat toan:
// Heu ngan xep b rong
BT: lF (S_SP - HGLL)
Thuc hien Bkt
B2: TempElement - S_SP
B3: S_SP - S_SP->Hext
B4: TempElement->Hext - HGLL
B5: Data - TempElement->Key
B6: delete TempElement
Bkt: Ket thuc
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 147
- Cai at thuat toan:
Ham SS_Pop co prototype:
int SS_Pop (S_STACK &SList, T &Data);
Ham thuc hien viec lay noi dung thanh phan du lieu cua phan tu o be mat ngan
xep quan ly boi SList va ghi nhan vao Data neu lay duoc. Ham tra ve gia tr T neu
viec lay thanh cong, nguoc lai khi ngan xep b rong ham tra ve gia tr -T.
Hoi dung cua ham nhu sau:
int SS_Pop (S_STACK &SList, T &Data)
{ if (SList -- HGLL)
return (-T);
S_STACK TempElement - SList;
SList - SList->Hext;
TempElement->Hext - HGLL;
Data - TempElement->Key;
delete TempElement;
return (T);
}
d. Huy ngan xep:
Trong thao tac nay chung ta thuc hien viec huy toan bo cac phan tu trong ngan xep.
Ham SS_Delete co noi dung nhu sau:
void SS_Delete (S_STACK &SList)
{ while (SList !- HGLL)
{ S_STACK TempElement - SList;
SList - SList->Hext;
TempElement->Hext - HGLL;
delete TempElement;
}
return;
}
4.5.. UDQ uDQ cua aDD acD DaD cDe
Danh sach han che duoc su dung trong nhieu truong hop, vi du:
- Hang doi thuong duoc su dung de luu tru cac luong du lieu can xu ly tuan tu;
- Hgan xep thuong duoc xu ly trong cac luong du lieu truy hoi, dac biet la trong viec
khu de quy cho cac thuat toan.
Cau hoi va Bai tap
1. Trnh bay khai niem cua cac loai danh sach Uu, nhuoc diem va ung dung cua moi
loai danh sach
2. Hay dua ra cac cau truc du lieu de quan ly cac loai danh sach vua ke tren Moi loai
ban hay chon ra mot cau truc du lieu ma theo ban la hay nhat Ciai thich su lua
chon do
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 148
3. Trnh bay thuat toan va cai dat tat ca cac thao tac tren danh sach lien ket don trong
truong hop quan ly bang con tro dau va cuoi trong danh sach
4. Trnh bay thuat toan va cai dat tat ca cac thao tac tren danh sach lien ket doi trong
truong hop ch quan ly bang con tro dau trong danh sach
5. Trnh bay thuat toan va cai dat tat ca cac thao tac tren hang doi, ngan xep bieu die n
boi danh sach lien ket doi trong hai truong hop: Danh sach lien ket cung chieu va
nguoc chieu voi hang doi, ngan xep
6. Van dung cac thuat toan sap xep da hoc, hay cai dat cac ham sap xep tren danh
sach lien ket don, lien ket doi theo hai cach quan ly:
- uan ly da ch nut dau danh sach;
- uan ly da ch nut dau va cuoi danh sach.
Theo ban thuat toan sap xep nao de van dung hon tren danh sach lien ket don, lien
ket doi trong hai truong hop nay
T. Hay trnh bay thuat toan va cai dat thao tac tach mot danh sach lien ket (don/doi) co
thanh phan du lieu la cac so nguyen thanh hai danh sach lien ket co thanh phan du
lieu tuong ung la cac so chan va cac so le, sao cho toi uu bo nho may tinh neu nhu
danh sach ban dau sau khi tach khong con can thiet
8. Hay trnh bay thuat toan va cai dat thao tac tron cac danh sach lien ket (don/doi) co
thu tu thanh mot danh sach lien ket co thu tu sao cho toi uu bo nho may tinh neu
nhu cac danh sach sau khi tron khong con can thiet
9. Van dung danh sach lien ket doi, trnh bay thuat toan va cai dat cac thao tac tao
moi, them, bot cac muc trong mot menu thanh ngang, menu doc
10. Su dung Stack, viet chuong trnh nhap vao mot so nguyen, khong am bat ky, sau
do xuat ra man hnh so dao nguoc thu tu cac chu so cua so nhap vao.
V du: - Hhap vao mot so nguyen: T0245
- So nguyen o dang dao nguoc: 5420T
11. Su dung Stack, viet chuong trnh chuyen doi mot so nguyen H trong he thap phan
(he 10) sang bieu dien o:
a. He nh phan (he 2)
b. He thap luc phan (he 16)
12. Viet chuong trnh mo phong cho bai toan Thap Ha noi va Thap Saigon voi cac
cau truc du lieu nhu sau:
a. Su dung danh sach lien ket de luu tru cac cot thap;
b. Su dung Stack de luu tru cac cot cua thap
Co nhan xet g cho tung truong hop
13. Van dung Stack de go de quy cho thuat toan uickSort
14. Van dung danh sach lien ket vong de giai bai toan Josephus.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 149
Chng 5: CAY (TREE)
5.1. Khai niem Bieu dien cay
5.J.J. (DD DQD1a cay
Cay la mot tap hop cac phan tu (cac nut) duoc to chuc va co cac dac diem sau:
- Hoac la mot tap hop rong (cay rong)
- Hoac la mot tap hop khac rong trong do co mot nut duy nhat duoc lam nut goc
(Poots Hode), cac nut con lai duoc phan thanh cac nhom trong do moi nhom lai la
mot cay goi la cay con (Sub-Tree).
Hhu vay, mot cay con co the la mot tap rong cac nut va cung co the la mot tap hop
khac rong trong do co mot nut lam nut goc cay con.
V du: Cay thu muc tren mot dia cung
\


OS PPOCPAMS APPLlCATlOHS GTlLlTlES


DOS WlHDOWS PASCAL C WOPD EXCEL HC HG


BlH BCl BlH lHCLGDE BCl DOC PlCTGPE SHEET

5.J.2. Hot o RDa1 D1em J1eD QuaD
a. Bac cua mot nut:
Bac cua mot nut (nodes degree) la so cay con cua nut do
V du: Bac cua nut OS trong cay tren bang 2
b. Bac cua mot cay:
Bac cua mot cay (trees degree) la bac lon nhat cua cac nut trong cay.
Cay co bac H goi la cay H-phan (H-Tree)
V du: Bac cua cay tren bang 4 (bang bac cua nut goc) va cay tren goi la cay tu
phan (uartz-Tree)
c. Nut goc:
Hut goc (roots node) la nut khong phai la nut goc cay con cua bat ky mot cay con
nao khac trong cay (nut khong lam nut goc cay con).
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 150
V du: Hut \ cua cay tren la cac nut goc.
d. Nut ket thuc:
Hut ket thuc hay con goi la nut la (leafs node) la nut co bac bang 0 (nut khong co
nut cay con).
V du: Cac nut DOS, WlHDOWS, BlH, lHCLGDE, BCl, DOC, PlCTGPE, SHEET, HC,
HG cua cay tren la cac nut la.
e. Nut trung gian:
Hut trung gian hay con goi la nut giua (interiors node) la nut khong phai la nut goc
va cung khong phai la nut ket thuc (nut co bac khac khong va la nut goc cay con
cua mot cay con nao do trong cay).
V du: Cac nut OS, PPOCPAMS, APPLlCATlOHS, GTlLlTlES, PASCAL, C, WOPD,
EXCEL cua cay tren la cac nut trung gian.
f. Mc cua mot nut:
Muc cua mot nut (nodes level) bang muc cua nut goc cay con chua no cong them
T, trong do muc cua nut goc bang T.
V du: Muc cua cac nut DOS, WlHDOWS, PASCAL, C, WOPD, EXCEL, HC, HG cua
cay tren bang 3; muc cua cac nut BlH, lHCLGDE, BCl, DOC, PlCTGPE,
SHEET, cua cay tren bang 4.
g. Chieu cao hay chieu sau cua mot cay:
Chieu cao cua mot cay (trees height) hay chieu sau cua mot cay (trees depth) la
muc cao nhat cua cac nut trong cay.
V du: Chieu cao cua cay tren bang 4.
h. Nut trc va nut sau cua mot nut:
Hut T duoc goi la nut truoc (ancestors node) cua nut S neu cay con co goc la T
chua cay con co goc la S. Khi do, nut S duo c goi la nut sau (descendants node) cua
nut T.
V du: Hut PPOCPAMS la nut truoc cua cac nut BlH, BCl, lHCLGDE, PASCAL, C va
nguoc lai cac nut BlH, BCl, lHCLGDE, PASCAL, C la nut sau cua nut
PPOCPAMS trong cay tren.
i. Nut cha va nut con cua mot nut:
Hut B duoc goi la nut cha (parents node) cua nut C neu nut B la nut truoc cua nut C
va muc cua nut C lon hon muc cua nut B la T muc. Khi do, nut C duoc goi la nut
con (childs node) cua nut B.
V du: Hut PPOCPAMS la nut cha cua cac nut PASCAL, C va nguoc lai cac nut
PASCAL, C la nut con cua nut PPOCPAMS trong cay tren.
j. Chieu dai ng i cua mot nut:
Chieu dai duong di cua mot nut la so dnh (so nut) tinh tu nut goc de di den nut do.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 151
Hhu vay, chieu dai duong di cua nut goc luon luon bang T, chieu dai duong di toi
mot nut bang chieu dai duong di toi nut cha no cong them T.
V du: Chieu dai duong di toi nut PPOCPAMS trong cay tren la 2.
k. Chieu dai ng i cua mot cay:
Chieu dai duong di cua mot cay (paths length of the tree) la tong tat ca cac chieu
dai duong di cua tat ca cac nut tren cay.
V du: Chieu dai duong cua cay tren la 65.
Ghi chu: ay la chieu dai duong di trong (internal paths length) cua cay. e co duoc
chieu dai duong di ngoai (external paths length) cua cay nguoi ta mo rong tat ca
cac nut cua cay sao cho tat ca cac nut cua cay co cung bac bang cach them vao
cac nut gia sao cho tat ca cac nut co bac bang bac cua cay. Chieu dai duong di
ngoai cua cay bang tong chieu dai cua tat ca cac nut mo rong.
l. Rng:
Pung (forest) la tap hop cac cay.
Hhu vay, mot cay khi mat nut goc se tro thanh mot rung.
5.J.. E1eu 1eD cay
Co nhieu cach e bieu dien cay:
- Su dung do th: Hhu vi du ve cay thu muc o tren.
- Su dung gian do tap hop
- Su dung dang phan cap ch so: Hhu bang muc luc trong cac tai lieu, giao trnh,
-
Bieu dien cay trong bo nho may tnh:
e bieu dien cay trong bo nho may tinh chung ta co the su dung danh sach lien ket.
Hhu vay, de bieu dien cay H-phan chung ta su dung danh sach co H moi lien ket de
quan ly da ch H nut goc cay con. Hhu vay cau truc du lieu cua cay H-phan tuong
tu nhu cau truc du lieu cua danh sach da lien ket:
const int H - T00;
typedef struct HT_Hode
{ T Key;
HT_Hode * SubHode|H]; // Vung lien ket quan ly da ch H nut goc cay con
} HT_OneHode;
typedef HT_OneHode * HT_Type;
e quan ly cac cay chung ta ch can quan ly da ch nut goc cua cay:
HT_Type HTree;
Trong pham vi phan nay chung ta se trnh bay cac thao tac tren cay nh phan
(Binary Tree) la cay pho bien va thong dung nhat.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 152
5.2. Cay nh phan (Binary Tree)
5.2.J. (DD DQD1a
Cay nh phan la cay co bac bang 2 (bac cua moi nut toi da bang 2).
V du: Cay nh phan bieu dien bieu thuc (2 a) + |b : (c T) + d] nhu sau:
ExprTree

+

+

2 a : d

NULL NULL NULL NULL b - NULL NULL

NULL NULL c 1

NULL NULL NULL NULL
5.2.2. E1eu 1eD Va Cac tDao tac
A. Bieu dien cay nh| phan:
e bieu dien cay nh phan trong bo nho may tinh chung ta co the su dung danh sach
co 2 moi lien ket de quan ly da ch cua 2 nut goc cay con (cay con trai va cay con
phai). Hhu vay cau truc du lieu cua cay nh phan tuong tu nhu cau truc du lieu cua
danh sach lien ket doi nhung ve cach thuc lien ket th khac nhau:
typedef struct BinT_Hode
{ T Key;
BinT_Hode * BinT_Left; // Vung lien ket quan ly da ch nut goc cay con trai
BinT_Hode * BinT_Pight; // Vung lien ket quan ly da ch nut goc cay con phai
} BinT_OneHode;
typedef BinT_OneHode * BinT_Type;
e quan ly cac cay nh phan chung ta can quan ly da ch nut goc cua cay:
BinT_Type BinTree;
B. Cac thao tac tren cay nh| phan:
a. Khi tao cay nh phan:
Viec khoi tao cay nh phan ch don gian chung ta cho con tro quan ly da ch nut goc ve
con tro HGLL. Ham khoi tao cay nh phan nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 153
BinT_Type BinT_lnitialize (BinT_Type &BTree)
{ BTree - HGLL;
return (BTree);
}
b. Tao mi mot nut:
Thao tac nay hoan toan tuong tu nhu doi voi thao tac tao moi mot nut trong danh
sach lien ket doi. Cia su chung ta can tao moi mot nut co thanh phan du lieu la
HewData.
- Thuat toan:
BT: BTHode - new BinT_OneHode
B2: lF (BTHode - HGLL)
Thuc hien Bkt
B3: BTHode->BinT_Left - HGLL
B4: BTHode->BinT_Pight - HGLL
B5: BTHode->Key - HewData
Bkt: Ket thuc
- Cai at thuat toan:
Ham BinT_Create_Hode co prototype:
BinT_Type BinT_Create_Hode(T HewData);
Ham tao moi mot nut co thanh phan du lieu la HewData, ham tra ve con tro tro
toi da ch cua nut moi tao. Heu khong du bo nho de tao, ham tra ve con tro
HGLL.
BinT_Type BinT_Create_Hode(T HewData)
{ BinT_Type BTnode - new BinT_OneHode;
if (BTnode !- HGLL)
{ BTnode->BinT_Left - HGLL;
BTnode->BinT_Pight - HGLL;
BTnode->Key - HewData;
}
return (BTnode);
}
- Minh hoa thuat toan:
Cia su chung ta can tao nut co thanh phan du lieu la 30: HewData - 30
BTnode - new BinT_OneHode
BTnode




BTnode->BinT_Left - HGLL
BTnode->BinT_Pight - HGLL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 154
BTnode->Key - HewData
BTnode

30


NULL NULL
c. Them mot nut vao trong cay nh phan:
Cia su chung ta can them mot nut co gia tr thanh phan du lieu la HewData vao
trong cay nh phan. Viec them co the dien ra o cay con trai hoac cay con phai cua
cay nh phan. Do vay, o day chung ta trnh bay 2 thao tac them rieng biet nhau:
- Thuat toan them 1 nut vao ben trai nhat cua cay:
BT: HewHode - BinT_Create_Hode (HewData)
B2: lF (HewHode - HGLL)
Thuc hien Bkt
B3: lF (BinTree - HGLL) // Cay rong
B3.T: BinTree - HewHode
B3.2: Thuc hien Bkt
B4: Lnode - BinTree
B5: lF (Lnode->BinT_Left - HGLL) // Cay con trai rong
B5.T: Lnode->BinT_Left - HewHode
B5.2: Thuc hien Bkt
B6: Lnode - Lnode->BinT_Left // i theo nhanh cay con trai
B7: Lap lai B5
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them nut co thanh phan du lieu la T7 vao ben trai nhat cua
cay nh phan: HewData - T7
NewNode BinTree

1T 20

NULL NULL Lnode 25 45

19 16 NULL NULL

NULL NULL 30 21

NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 155
B5.T: Lnode->BinT_Left - HewHode
NewNode BinTree

1T 20

NULL NULL Lnode 25 45

19 16 NULL NULL

NULL 30 21

NULL NULL NULL NULL
Ket qua sau khi them:
BinTree

20

Lnode 25 45

NewNode 19 16 NULL NULL

1T NULL 30 21

NULL NULL NULL NULL NULL NULL
- Cai at thuat toan:
Ham BinT_Add_Left co prototype:
BinT_Type BinT_Add_Left(BinT_Type &BT_Tree, T HewData);
Ham thuc hien viec them vao ben trai nhat trong cay nh phan BT_Tree mot nut
co thanh phan du lieu la HewData, ham tra ve con tro tro toi da ch cua nut moi
them neu viec them thanh cong, nguoc lai neu khong du bo nho, ham tra ve con
tro HGLL.
BinT_Type BinT_Add_Left(BinT_Type &BT_Tree, T HewData)
{ BinT_Type HewHode - BinT_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HewHode);
if (BT_Tree -- HGLL)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 156
BT_Tree - HewHode;
else
{ BinT_Type Lnode - BT_Tree;
while (Lnode->BinT_Left !- HGLL)
Lnode - Lnode->BinT_Left;
Lnode->BinT_Left - HewHode;
}
return (HewHode);
}
- Thuat toan them 1 nut vao ben phai nhat cua cay nh| phan:
BT: HewHode - BinT_Create_Hode (HewData)
B2: lF (HewHode - HGLL)
Thuc hien Bkt
B3: lF (BinTree - HGLL) // Cay rong
B3.T: BinTree - HewHode
B3.2: Thuc hien Bkt
B4: Pnode - BinTree
B5: lF (Pnode->BinT_Pight - HGLL) // Cay con phai rong
B5.T: Pnode->BinT_Pight - HewHode
B5.2: Thuc hien Bkt
B6: Pnode - Pnode->BinT_Pight // i theo nhanh cay con phai
B7: Lap lai B5
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them nut co thanh phan du lieu la 2T vao ben phai nhat cua
cay nh phan: HewData - 2T
BinTree NewNode

40 Rnode 21

36 55 NULL NULL

12 18 45 NULL

NULL NULL NULL NULL 10 8

NULL NULL 11 5

NULL NULL NULL NULL


Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 157
B5.T: Pnode->BinT_Pight - HewHode
BinTree NewNode

40 Rnode 21

36 55 NULL NULL

12 18 45 NULL

NULL NULL NULL NULL 10 8

NULL NULL 11 5

NULL NULL NULL NULL
Ket qua sau khi them:
BinTree

40 Rnode

36 55 NewNode

12 18 45 21

NULL NULL NULL NULL 10 8 NULL NULL

NULL NULL 11 5

NULL NULL NULL NULL
- Cai at thuat toan:
Ham BinT_Add_Pight co prototype:
BinT_Type BinT_Add_Pight(BinT_Type &BT_Tree, T HewData);
Ham thuc hien viec them vao ben phai nhat trong cay nh phan BT_Tree mot nut
co thanh phan du lieu la HewData, ham tra ve con tro tro toi da ch cua nut moi
them neu viec them thanh cong, nguoc lai neu khong du bo nho, ham tra ve con
tro HGLL.
BinT_Type BinT_Add_Pight(BinT_Type &BT_Tree, T HewData)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 158
{ BinT_Type HewHode - BinT_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HewHode);
if (BT_Tree -- HGLL)
BT_Tree - HewHode;
else
{ BinT_Type Pnode - BT_Tree;
while (Pnode->BinT_Pight !- HGLL)
Pnode - Pnode->BinT_Pight;
Pnode->BinT_Pight - HewHode;
}
return (HewHode);
}
d. Duyet qua cac nut tren cay nh phan:
Trong thao tac nay chung ta tm cach duyet qua (ghe tham) tat ca cac nut trong cay
nh phan de thuc hien mot thao tac xu ly nao do doi voi nut nay (Xem noi dung
thanh phan du lieu chang han). Can cu vao thu tu duyet nut goc so voi 2 nut goc
cay con, thao tac duyet co the thuc hien theo mot trong ba thu tu:
- Duyet theo thu tu nut goc truoc (Preorder):
Theo cach duyet nay th nut goc se duoc duyet truoc sau do moi duyet den hai cay
con. Can cu vao thu tu duyet hai cay con ma chung ta co hai cach duyet theo thu tu
nut goc truoc:
+ Duyet nut goc, duyet cay con trai, duyet cay con phai (Poot Left Pight)
+ Duyet nut goc, duyet cay con phai, duyet cay con trai (Poot Pight - Left)
- Duyet theo thu tu nut goc giua (Inorder):
Theo cach duyet nay th chung ta duyet mot trong hai cay con truoc roi den duyet
nut goc va sau do moi duyet cay con con lai. Can cu vao thu tu duyet hai cay con
chung ta cung se co hai cach duyet theo thu tu nut goc giua:
+ Duyet cay con trai, duyet nut goc, duyet cay con phai (Left Poot - Pight)
+ Duyet cay con phai, duyet nut goc, duyet cay con trai (Pight Poot - Left)
- Duyet theo thu tu nut goc sau (Postorder):
Tuong tu nhu duyet theo nut goc truoc, trong cach duyet nay th nut goc se duoc
duyet sau cung so voi duyet hai nut goc cay con. Do vay, can cu vao thu tu duyet
hai cay con ma chung ta cung co hai cach duyet theo thu tu nut goc sau:
+ Duyet cay con trai, duyet cay con phai, duyet nut goc (Left Pight - Poot)
+ Duyet cay con phai, duyet cay con trai, duyet nut goc (Pight Left - Poot)
Trong phan nay chung ta ch trnh bay mot cach duyet theo mot thu tu cu the do la:
Duyet cay con trai, duyet nut goc va duyet cay con phai (Left Poot Pight) va su
dung thuat toan de quy. Cac cach duyet khac bang thuat toan de quy hay khong de
quy sinh vien tu van dung tuong tu.
- Thuat toan e quy e duyet cay nh| phan theo thu tu Left Root Right (LRootR):
BT: CurHode - BinTree
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 159
B2: lF (CurHode - HGLL)
Thuc hien Bkt
B3: LPootP (BinTree->BinT_Left) // Duyet cay con trai
B4: Process (CurHode->Key) // Xu ly thong tin nut goc
B5: LPootP (BinTree->BinT_Pight) // Duyet cay con phai
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can duyet qua cac nut trong cay nh phan duoi day theo thu tu
Left Poot Pight:
BinTree

40

36 55

12 18 45 21

NULL NULL NULL NULL 10 8 NULL NULL

NULL NULL 11 5

NULL NULL NULL NULL
LRootR(BinTree->BinT_Left)
LRootR(BinTree->BinT_Left->BinT_Left)
LRootR(NULL)
Process(12)
LRootR(NULL)
Process(36)
LRootR(BinTree->BinT_Left->BinT_Right)
LRootR(NULL)
Process(18)
LRootR(NULL)
Process(40)
LRootR(BinTree->BinT_Right)
LRootR(BinTree->BinT_Right->BinT_Left)
LRootR(BinTree->BinT_Right->BinT_Left->BinT_Left)
LPootP(HGLL)
Process(T0)
LPootP(HGLL)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 160
Process(45)
LRootR(BinTree->BinT_Right->BinT_Left->BinT_Right)
LPootP(BinTree->BinT_Pight->BinT_Left->BinT_Pight->BinT_Left)
LRootR(NULL)
Process(11)
LRootR(NULL)
Process(8)
LPootP(BinTree->BinT_Pight->BinT_Left->BinT_Pight->BinT_Pight)
LRootR(NULL)
Process(5)
LRootR(NULL)
Process(55)
LRootR(BinTree->BinT_Right->BinT_Right)
LRootR(NULL)
Process(21)
LRootR(NULL)
Hhu vay thu tu cac thong tin cua cac nut duoc xu ly nhu sau:
T2 -> 36 -> T8 -> 40 -> T0 -> 45 -> TT -> 8 -> 5 -> 55 -> 2T
- Cai at thuat toan:
Ham BinT_LPootP_Travelling co prototype:
void BinT_LPootP_Travelling(BinT_Type BT_Tree);
Ham thuc hien thao tac duyet qua tat ca cac nut trong cay nh phan BT_Tree theo
thu tu duyet Left Poot Pight de xu ly thong tin o moi nut.
void BinT_LPootP_Travelling(BinT_Type BT_Tree)
{ if (BT_Tree -- HGLL)
return;
BinT_LPootP_Travelling (BT_Tree->BinT_Left);
Process (BT_Tree->Key)
BinT_LPootP_Travelling (BT_Tree->BinT_Pight);
return;
}
Luu y:
Ham Process thuc hien viec xu ly thong tin (Key) cua moi nut. Do vay tuy tung
truong hop cu the ma chung ta viet ham cho phu hop. Chang han de xuat thong
tin th ch can cac lenh xuat du lieu de xuat thanh phan Key.
e. Tnh chieu cao cua cay:
e tinh chieu cao cua cay (TH) chung ta phai tinh chieu cao cua cac cay con, khi do
chieu cao cua cay chinh la chieu cao lon nhat cua cac cay con cong them T (chieu
cao nut goc). Hhu vay thao tac tinh chieu cao cua cay la thao tac tinh de quy chieu
cao cua cac cay con (chieu cao cua cay con co goc la nut la bang T).
- Thuat toan:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 161
BT: lF (BinTree - HGLL)
BT.T: TH - 0
BT.2: Thuc hien Bkt
B2: THL - TH(BinTree->BinT_Left)
B3: THP - TH(BinTree->BinT_Pight)
B4: lF (THL > THP)
TH - THL + T
B5: ELSE
TH - THP + T
Bkt: Ket thuc
V du: Chieu cao cua cay nh phan sau bang 4.
BinTree

40

36 55
2 4
12 18 3 45 21
T T 2 T
0 NULL 0 NULL 0 NULL 0 NULL 0 NULL 8 0 NULL 0 NULL
T
0 NULL 0 NULL
- Cai at thuat toan:
Ham BinT_Height co prototype:
int BinT_Height(BinT_Type BTree);
Ham tinh chieu cao cua cay BTree theo thuat toan de quy. Ham tra ve chieu cao
cua cay can tinh.
int BinT_Height(BinT_Type BTree)
{ if (BTree -- HGLL)
return (0);
int HTL - BinT_Height(BTree->BinT_Left);
int HTP - BinT_Height(BTree->BinT_Pight);
if (HTL > HTP)
return (HTL+T);
return (HTP+T);
}
f. Tnh so nut cua cay:
Tuong tu nhu tinh chieu cao cua cay, so nut cua cay (HH) bang tong so nut cua hai
cay con cong them T. Do vay thao tac nay chung ta cung se tinh de quy so nut cua
cac cay con (so nut cua cay con co goc la nut la bang T).
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 162
- Thuat toan:
BT: lF (BinTree - HGLL)
BT.T: HH - 0
BT.2: Thuc hien Bkt
B2: HHL - HH(BinTree->BinT_Left)
B3: HHP - HH(BinTree->BinT_Pight)
B4: HH - HHL + HHP + T
Bkt: Ket thuc
V du: So nut cua cay nh phan sau bang 8.
BinTree

40

36 55

12 18 45 21

NULL NULL NULL NULL NULL 8 NULL NULL
0 0 0 0 0 0 0
1(0+0+1) 1 (0+0+1) NULL NULL 1 (0+0+1)
3 (1+1+1) 0 0
1 (0+0+1)
2 (0+1+1)
4 (2+1+1)
8 (3+4+1)
- Cai at thuat toan:
Ham BinT_Hum_Hode co prototype:
int BinT_Hum_Hode(BinT_Type BTree);
Ham tinh so nut cua cay BTree theo thuat toan de quy. Ham tra ve so nut cua cay
can tinh.
int BinT_Hum_Hode(BinT_Type BTree)
{ if (BTree -- HGLL)
return (0);
int HHL - BinT_Hum_Hode(BTree->BinT_Left);
int HHP - BinT_Hum_Hode(BTree->BinT_Pight);
return (HHL + HHP + T);
}
g. Huy mot nut tren cay nh phan:
Viec huy mot nut trong cay co the lam cho cay tro thanh rung. Do vay trong thao tac
nay neu chung ta tien hanh huy mot nut la th khong co dieu g xay ra, song neu huy
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 163
nut khong phai la nut la th chung ta phai tm cach chuyen cac nut goc cay con la
cac nut con cua nut can huy thanh cac nut goc cay con cua cac nut khac roi moi
tien hanh huy nut nay.
- Truong hop neu nut can huy ch co 0T nut goc cay con th chung ta co the chuyen
nut goc cay con nay thanh nut goc cay con cua nut cha cua nut can huy.
- Truong hop neu nut can huy co 2 nut goc cay con th chung ta phai chuyen 02
nut goc cay con nay thanh nut goc cay con cua cac nut khac voi nut can huy.
Viec chon cac nut de lam nhiem vu nut cha cua cac nut goc cay con nay tuy vao
tung truong hop cu the cua cay nh phan ma chung ta se lua chon cho phu hop.
Do vay, thao tac huy mot nut se duoc trnh bay cu the trong cac loai cay cu the
duoc trnh bay o cac phan sau.
5.2.. Cay DD( pDaD t1m R1em (E1Dazy SeazcD1DQ Tzee,
A. Khai niem Cau truc du Iieu:
Cay nh phan tm kiem la cay nh phan co thanh phan khoa cua moi nut lon hon thanh
phan khoa cua tat ca cac nut trong cay con trai cua no va nho hon thanh phan khoa
cua tat ca cac nut trong cay con phai cua no.
V du: Hnh anh sau la hnh anh cua mot cay nh phan tm kiem
BSTree

60

25 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
Tu khai niem nay chung ta co mot so nhan xet:
- Cau truc du lieu cua cay nh phan tm kiem la cau truc du lieu de bieu dien cac cay
nh phan noi chung.
typedef struct BST_Hode
{ T Key;
BST_Hode * BST_Left; // Vung lien ket quan ly da ch nut goc cay con trai
BST_Hode * BST_Pight; // Vung lien ket quan ly da ch nut goc cay con phai
} BST_OneHode;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 164
typedef BST_OneHode * BST_Type;
e quan ly cac cay nh phan tm kiem chung ta can quan ly da ch nut goc cua cay:
BST_Type BSTree;
- Khoa nhan dien (Key) cua cac nut trong cay nh phan tm kiem doi mot khac nhau
(khong co hien tuong trung khoa).
Tuy nhien trong truong hop can quan ly cac nut co khoa trung nhau trong cay nh phan
tm kiem th chung ta co the mo rong cau truc du lieu cua moi nut bang cach them
thanh phan Count de ghi nhan so luong cac nut trung khoa. Khi do, cau truc du lieu de
quan ly cac cay nh phan tm kiem duoc mo rong nhu sau:
typedef struct BSE_Hode
{ T Key;
int Count;
BSE_Hode * BSE_Left; // Vung lien ket quan ly da ch nut goc cay con trai
BSE_Hode * BSE_Pight; // Vung lien ket quan ly da ch nut goc cay con phai
} BSE_OneHode;
typedef BSE_OneHode * BSE_Type;
va chung ta quan ly cay nh phan tm kiem nay bang cach quan ly da ch nut goc:
BSE_Type BSETree;
- Hut o ben trai nhat la nut co gia tr khoa nhan dien nho nhat va nut o ben phai nhat
la nut co gia tr khoa nhan dien lon nhat trong cay nh phan tm kiem.
- Trong mot cay nh phan tm kiem thu tu duyet cay Left Poot Pight la thu tu duyet
theo su tang dan cac gia tr cua Key trong cac nut va thu tu duyet cay Pight Poot
Left la thu tu duyet theo su giam dan cac gia tr cua Key trong cac nut.
B. Cac thao tac tren cay nh| phan tm kiem:
a. Tm kiem tren cay:
Cia su chung ta can tm tren cay nh phan tm kiem xem co ton tai nut co khoa Key
la SearchData hay khong.
e thuc hien thao tac nay chung ta se van dung thuat toan tm kiem nh phan: Do
dac diem cua cay nh phan tm kiem th tai mot nut, neu Key cua nut nay khac voi
SearchData th SearchData ch co the tm thay hoac tren cay con trai cua nut nay
neu SearchData nho hon Key cua nut nay hoac tren cay con phai cua nut nay neu
SearchData lon hon Key cua nut nay.
- Thuat toan tm kiem 1 nut tren cay nh| phan tm kiem:
BT: CurHode - BSTree
B2: lF (CurHode - HGLL) or (CurHode->Key - SearchData)
Thuc hien Bkt
B3: lF (CurHode->Key > SearchData) // Tm kiem tren cay con trai
CurHode - CurHode->BST_Left
B4: ELSE // Tm kiem tren cay con phai
CurHode - CurHode->BST_Pight
B5: Lap lai B2
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 165
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can tm kiem nut co thanh phan du lieu la 30 tren cay nh phan
tm kiem sau: SearchData - 30
CurNode BSTree

60

25 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
CurHode->Key > SearchData // Tm kiem tren cay con trai
CurHode - CurHode->BST_Left
BSTree

CurNode 60

25 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 166
CurHode->Key < SearchData // Tm kiem tren cay con phai
CurHode - CurHode->BST_Pight
BSTree

60

25 CurNode 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
CurHode->Key > SearchData // Tm kiem tren cay con trai
CurHode - CurHode->BST_Left
BSTree

60

25 65

19 CurNode 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
CurHode->Key - SearchData Thuat toan ket thuc (Tm thay)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 167
Bay gio gia su chung ta can tm kiem nut co thanh phan du lieu la 35 tren cay nh
phan tm kiem tren: SearchData - 35
CurNode BSTree

60

25 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
CurHode->Key > SearchData // Tm kiem tren cay con trai
CurHode - CurHode->BST_Left
BSTree

CurNode 60

25 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 168
CurHode->Key < SearchData // Tm kiem tren cay con phai
CurHode - CurHode->BST_Pight
BSTree

60

25 CurNode 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
CurHode->Key > SearchData // Tm kiem tren cay con trai
CurHode - CurHode->BST_Left
BSTree

60

25 65

19 CurNode 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
CurHode->Key < SearchData // Tm kiem tren cay con phai
CurHode - CurHode->BST_Pight
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 169
BSTree

60

25 65

19 40 NULL NULL

10 NULL 30 CurNode 44

NULL NULL NULL NULL 50
15

NULL NULL NULL NULL
CurHode - HGLL Thuat toan ket thuc (Khong tm thay)
- Cai at thuat toan:
Ham BST_Searching co prototype:
BST_Type BST_Searching(BST_Type BS_Tree, T SearchData);
Ham thuc hien thao tac tm kiem tren cay nh phan tm kiem BS_Tree nut co
thanh phan Key la SearchData. Ham tra ve con tro tro toi da ch cua nut co Key
la SearchData neu tm thay, trong truong hop nguoc lai ham tra ve con tro HGLL.
BST_Type BST_Searching(BST_Type BS_Tree, T SearchData)
{ BST_Type CurHode - BS_Tree;
while (CurHode !- HGLL && CurHode->Key !- SearchData)
{ if (CurHode->Key > SearchData)
CurHode - CurHode->BST_Left;
else
CurHode - CurHode->BST_Pight;
}
return (CurHode);
}
b. Them mot nut vao trong cay:
Cia su chung ta can them mot nut co thanh phan du lieu (Key) la HewData vao trong
cay nh phan tm kiem sao cho sau khi them cay van la mot cay nh phan tm kiem.
Trong thao tac nay truoc het chung ta phai tm kiem v tri them, sau do moi tien
hanh them nut moi vao cay (Do vay thuat toan con duoc goi la thuat toan tm kiem
va them vao cay). ua trnh tm kiem tuan thu cac buoc trong thuat toan tm kiem
da trnh bay o tren.
Trong thuat toan nay chung ta se trnh bay thao tac them vao cay nh phan tm kiem
trong truong hop khong co hien tuong trung lap khoa. Do vay, neu HewData b trung
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 170
voi Key cua mot trong cac nut o trong cay nh phan tm kiem th chung ta se khong
thuc hien thao tac them nay. Tuy nhien, neu chung ta su dung cau truc du lieu mo
rong th viec trung khoa se giai quyet don gian v khong lam tang so nut cua cay nh
phan tm kiem ma ch lam tang thanh phan Count cua nut b trung khoa them T.
- Thuat toan them 1 nut vao cay nh| phan tm kiem:
BT: HewHode - BinT_Create_Hode(HewData)
B2: lF (HewHode - HGLL)
Thuc hien Bkt
B3: lF (BSTree - HGLL) // Cay rong
B3.T: BSTree - HewHode
B3.2: Thuc hien Bkt
B4: CurHode - BSTree
B5: lF (CurHode->Key - HewData) // Trung khoa
Thuc hien Bkt
B6: lF (CurHode->Key > HewData)
B6.T: AddLeft - True // Them vao cay con trai cua CurHode
B6.2: lf (CurHode->BST_Left !- HGLL)
CurHode - CurHode->BST_Left
B7: lF (CurHode->Key < HewData)
B7.T: AddLeft - False // Them vao cay con phai cua CurHode
B7.2: lf (CurHode->BST_Pight !- HGLL)
CurHode - CurHode->BST_Pight
B8: Lap lai B5
B9: lF (AddLeft - True)
CurHode->BST_Left - HewHode
BT0: ELSE
CurHode->BST_Pight - HewHode
Bkt: Ket thuc
- Minh hoa thuat toan:
Cia su chung ta can them vao trong cay nh phan tm kiem T nut co thanh phan
du lieu la 55: HewData - 55
NewNode CurNode BSTree

55 60

NULL NULL 25 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 171
CurHode->Key > HewData // Them vao cay con trai
AddLeft - True
CurHode->BST_Left !- HGLL // Chuyen sang cay con trai
CurHode - CurHode->BST_Left
BSTree

NewNode CurNode 60

55 25 65

NULL NULL 19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
CurHode->Key < HewData // Them vao cay con phai
AddLeft - False
CurHode->BST_Pight !- HGLL // Chuyen sang cay con phai
CurHode - CurHode->BST_Pight
BSTree

60

NewNode 25 CurNode 65

55 19 40 NULL NULL

NULL NULL 10 NULL 30 44

NULL NULL NULL NULL NULL NULL
CurHode->Key < HewData // Them vao cay con ben phai
AddLeft - False
CurHode->BST_Pight !- HGLL // Chuyen sang cay con ben phai
CurHode - CurHode->BST_Pight
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 172
BSTree

60

25 65

19 40 NULL NULL NewNode
CurNode
10 NULL 30 44 55

NULL NULL NULL NULL NULL NULL NULL NULL
CurHode->Key < HewData // Them vao cay con phai
AddLeft - False
CurHode->BST_Pight -- HGLL
// Them HewHode vao thanh nut goc cay con phai cua CurHode
// (AddLeft - False), thuat toan ket thuc.
CurHode->BST_Pight - HewHode
Ket qua sau khi them:
BSTree

60

25 65

19 40 NULL NULL
CurNode
10 NULL 30 44 NewNode

NULL NULL NULL NULL NULL 55

NULL NULL
- Cai at thuat toan:
Ham BST_Add_Hode co prototype:
BST_Type BST_Add_Hode(BST_Type &BS_Tree, T HewData);
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 173
Ham thuc hien viec them vao cay nh phan tm kiem BS_Tree mot nut co thanh
phan Key la HewData. Ham tra ve con tro tro toi da ch cua nut moi them neu
viec them thanh cong, trong truong hop nguoc lai ham tra ve con tro HGLL.
BST_Type BST_Add_Hode(BST_Type &BS_Tree, T HewData)
{ BST_Type HewHode - BinT_Create_Hode(HewData);
if (HewHode -- HGLL)
return (HewHode);
if (BS_Tree -- HGLL)
BS_Tree - HewHode;
else
{ BST_Type CurHode - BS_Tree;
int AddLeft - T;
while (CurHode->Key !- HewData)
{ if (CurHode->Key > HewData)
{ AddLeft - T;
if (CurHode->BST_Left !- HGLL)
CurHode - CurHode->BST_Left;
else
break;
}
else // CurHode->Key < HewData
{ AddLeft - 0;
if (CurHode->BST_Pight !- HGLL)
CurHode - CurHode->BST_Pight;
else
break;
}
}
if (AddLeft -- T)
CurHode->BST_Left - HewHode;
else
CurHode->BST_Pight - HewHode;
}
return (HewHode);
}
c. Loai bo (huy) mot nut tren cay:
Cung nhu thao tac them mot nut vao trong cay nh phan tm kiem, thao tac huy mot
nut tren cay nh phan tm kiem cung phai bao dam cho cay sau khi huy nut do th
cay van la mot cay nh phan tm kiem. ay la mot thao tac khong don gian boi neu
khong can than chung ta se bien cay thanh mot rung.
Cia su chung ta can huy nut co thanh phan du lieu (Key) la DelData ra khoi cay nh
phan tm kiem. ieu dau tien trong thao tac nay la chung ta phai tm kiem da ch
cua nut can huy la DelHode, sau do moi tien hanh huy nut co da ch la DelHode nay
neu tm thay (Do vay thuat toan nay con duoc goi la thuat toan tm kiem va loai bo
tren cay). ua trnh tm kiem da trnh bay o tren, o day chung ta ch trnh bay thao
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 174
tac huy khi tm thay nut co da ch DelHode (DelHode->Key - DelData) va trong qua
trnh tm kiem chung ta giu da ch nut cha cua nut can huy la PrDelHode.
Viec huy nut co da ch DelHode co the xay ra mot trong ba truong hop sau:
c
1
) DeINode Ia nut Ia:
Trong truong hop nay don gian chung ta ch can cat bo moi quan he cha-con giua
PrDelHode va DelHode bang cach cho con tro PrDelHode->BST_Left (neu DelHode la
nut con ben trai cua PrDelHode) hoac cho con tro PrDelHode->BST_Pight (neu
DelHode la nut con ben phai cua PrDelHode) ve con tro HGLL va tien hanh huy
(delete) nut co da ch DelHode nay.
V du: Cia su can huy nut co Key - 30 (DelData - 30)
BSTree

60

25 PrDeINode 65

19 DeINode 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
Trong truong hop nay chung ta cho PrDelHode->BST_Left - HGLL:
BSTree

60

25 PrDeINode 65

19 DeINode 40 NULL NULL

10 NULL NULL 44
30
NULL NULL NULL NULL
NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 175
Ket qua sau khi huy:
BSTree

60

25 PrDeINode 65

19 40 NULL NULL

10 NULL NULL 44

NULL NULL NULL NULL
c
2
) DeINode Ia nut ch co 01 nut goc cay con:
Trong truong hop nay cung kha don gian chung ta ch can chuyen moi quan he cha-
con giua PrDelHode va DelHode thanh moi quan he cha-con giua PrDelHode va nut
goc cay con cua DelHode roi tien hanh cat bo moi quan he cha-con giua DelHode va
0T nut goc cay con cua no va tien hanh huy nut co da ch DelHode nay.
V du: Cia su can huy nut co Key - T9 (DelData - T9)
BSTree

PrDeINode 60

DeINode 25 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 176
Trong truong hop nay chung ta thuc hien cac buoc:
BT: PrDelHode->BST_Left - DelHode->BST_Left
B2: DelHode->BST_Left - HGLL
BSTree

PrDeINode 60

DeINode 25 65

19 40 NULL NULL

10 NULL NULL 30 44

NULL NULL NULL NULL NULL NULL
Ket qua sau khi huy:
BSTree

PrDeINode 60

25 65

10 40 NULL NULL

NULL NULL 30 44

NULL NULL NULL NULL
c
3
) DeINode Ia nut co u 02 nut goc cay con:
Truong hop nay kha phuc tap, viec huy co the tien hanh theo mot trong hai cach sau
day (co the co nhieu cach khac nua song o day chung ta ch trnh bay hai cach):
- Chuyen 02 cay con cua DeINode ve thanh mot cay con:
Theo phuong phap nay chung ta se chuyen cay con phai cua DelHode
(DelHodeBST_Pight) ve thanh cay con phai cua cay con co nut goc la nut phai
nhat trong cay con trai cua DelHode (phai nhat trong DelHode->BST_Left), hoac
chuyen cay con trai cua DelHode (DelHode->BST_Left) ve thanh cay con trai cua
cay con co nut goc la nut trai nhat trong cay con phai cua DelHode (trai nhat trong
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 177
DelHode->BST_Pight). Sau khi chuyen th DelHode se tro thanh nut la hoac nut ch
co 0T cay con va chung ta huy DelHode nhu doi voi truong hop c
T
) va c
2
) o tren.
V du: Cia su can huy nut co Key - 25 (DelData - 25). Chung ta se chuyen cay con
phai cua DelHode (DelHode->BST_Pight) ve thanh cay con phai cua cay con
co nut goc la nut phai nhat trong cay con trai cua DelHode (nut MPHode).
PrDeINode BSTree

DeINode 60

MRNode 25 65

19 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
Trong truong hop nay chung ta thuc hien cac buoc:
BT: MPHode->BST_Pight - DelHode->BST_Pight
B2: DelHode->BST_Pight - HGLL
PrDeINode BSTree

DeINode 60

MRNode 25 65

19 NULL 40 NULL NULL

10 30 44

NULL NULL NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 178
Tien hanh cac buoc de huy DelHode:
B3: PrDelHode->BST_Left - DelHode->BST_Left
B4: DelHode->BST_Left - HGLL
PrDeINode BSTree

DeINode 60

MRNode 25 65

19 NULL NULL 40 NULL NULL

10 30 44

NULL NULL NULL NULL NULL NULL
Ket qua sau khi huy:
PrDeINode BSTree

MRNode 60

19 65

10 40 NULL NULL

NULL NULL 30 44

NULL NULL NULL NULL
- Su dung phan tu the mang (standby):
Theo phuong phap nay chung ta se khong huy nut co da ch DelHode ma chung ta
se huy nut co da ch cua phan tu the mang la nut phai nhat trong cay con trai cua
DelHode (MPHode), hoac la nut trai nhat trong cay con phai cua DelHode (MLHode).
Sau khi chuyen toan bo noi dung du lieu cua nut the mang cho DelHode
(DelHodeKey - MPHode->Key hoac DelHode->Key - MLHode->Key) th chung ta
se huy nut the mang nhu doi voi truong hop c
T
) va c
2
) o tren.
V du: Cia su can huy nut co Key - 25 (DelData - 25). Chung ta se chon phan tu the
mang MLHode la nut trai nhat trong cay con phai cua DelHode (trai nhat trong
DelHode->BST_Pight) de huy,
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 179
BSTree

DeINode 60

25 PrMLNode 65

19 MLNode 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
Chuyen du lieu trong MLHode ve cho DelHode: DelHode->Key - MLHode->Key
BSTree

DeINode 60

30 PrMLNode 65

19 MLNode 40 NULL NULL

10 NULL 30 44

NULL NULL NULL NULL NULL NULL
Tien hanh huy MLHode (huy nut la): PrMLHode->BST_Left - HGLL
BSTree

DeINode 60

30 PrMLNode 65

19 MLNode 40 NULL NULL

10 NULL 30 NULL 44

NULL NULL NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 180
Ket qua sau khi huy:
BSTree

DeINode 60

30 PrMLNode 65

19 40 NULL NULL

10 NULL NULL 44

NULL NULL NULL NULL
- Thuat toan huy 1 nut trong cay nh| phan tm kiem bang phuong phap chuyen cay
con phai cua nut can huy ve thanh cay con phai cua cay con co nut goc Ia nut
phai nhat trong cay con trai cua nut can huy (neu nut can huy co u 02 cay con):
// Tm nut can huy va nut cha cua nut can huy
BT: DelHode - BSTree
B2: PrDelHode - HGLL
B3: lF (DelHode - HGLL)
Thuc hien Bkt
B4: lF (DelHode->Key - DelData)
Thuc hien B8
B5: lF (DelHode->Key > DelData) // Chuyen sang cay con trai
B5.T: PrDelHode - DelHode
B5.2: DelHode - DelHode->BST_Left
B5.3: OnTheLeft - True
B5.4: Thuc hien B7
B6: lF (DelHode->Key < DelData) // Chuyen sang cay con phai
B6.T: PrDelHode - DelHode
B6.2: DelHode - DelHode->BST_Pight
B6.3: OnTheLeft - False
B6.4: Thuc hien B7
B7: Lap lai B3
// Chuyen cac moi quan he cua DelHode cho cac nut khac
B8: lF (PrDelHode - HGLL) // DelHode la nut goc
// Heu DelHode la nut la
B8.T: lf (DelHode->BST_Left - HGLL) and (DelHode->BST_Pight - HGLL)
B8.T.T: BSTree - HGLL
B8.T.2: Thuc hien BT0
// Heu DelHode co mot cay con phai
B8.2: lf (DelHode->BST_Left - HGLL) and (DelHode->BST_Pight !- HGLL)
B8.2.T: BSTree - BSTree->BST_Pight
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 181
B8.2.2: DelHode->BST_Pight - HGLL
B8.2.3: Thuc hien BT0
// Heu DelHode co mot cay con trai
B8.3: lf (DelHode->BST_Left !- HGLL) and (DelHode->BST_Pight - HGLL)
B8.3.T: BSTree - BSTree->BST_Left
B8.3.2: DelHode->BST_Left - HGLL
B8.3.3: Thuc hien BT0
// Heu DelHode co hai cay con
B8.4: lf (DelHode->BST_Left !- HGLL) and (DelHode->BST_Pight !- HGLL)
// Tm nut phai nhat trong cay con trai cua DelHode
B8.4.T: MPHode - DelHode->BST_Left
B8.4.2: if (MPHode->BST_Pight - HGLL)
Thuc hien B8.4.5
B8.4.3: MPHode - MPHode->BST_Pight
B8.4.4: Lap lai B8.4.2
// Chuyen cay con phai cua DelHode ve cay con phai cua MPHode
B8.4.5: MPHode->BST_Pight - DelHode->BST_Pight
B8.4.6: DelHode->BST_Pight - HGLL
// Chuyen cay con trai con lai cua DelHode ve cho BSTree
B8.4.7: BSTree - BSTree->BST_Left
B8.4.8: DelHode->BST_Left - HGLL
B8.4.9: Thuc hien BT0
B9: ELSE // DelHode khong phai la nut goc
// Heu DelHode la nut la
B9.T: lf (DelHode->BST_Left - HGLL) and (DelHode->BST_Pight - HGLL)
// DelHode la cay con trai cua PrDelHode
B9.T.T: if (OnTheLeft - True)
PrDelHode->BST_Left - HGLL
B9.T.2: else // DelHode la cay con phai cua PrDelHode
PrDelHode->BST_Pight - HGLL
B9.T.3: Thuc hien BT0
// Heu DelHode co mot cay con phai
B9.2: lf (DelHode->BST_Left - HGLL) and (DelHode->BST_Pight !- HGLL)
B9.2.T: if (OnTheLeft - True)
PrDelHode->BST_Left - DelHode->BST_Pight
B9.2.2: else
PrDelHode->BST_Pight - DelHode->BST_Pight
B9.2.3: DelHode->BST_Pight - HGLL
B9.2.4: Thuc hien BT0
// Heu DelHode co mot cay con trai
B9.3: lf (DelHode->BST_Left !- HGLL) and (DelHode->BST_Pight - HGLL)
B9.3.T: if (OnTheLeft - True)
PrDelHode->BST_Left - DelHode->BST_Left
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 182
B9.3.2: else
PrDelHode->BST_Pight - DelHode->BST_Left
B9.3.3: DelHode->BST_Left - HGLL
B9.3.4: Thuc hien BT0
// Heu DelHode co hai cay con
B9.4: lf (DelHode->BST_Left !- HGLL) and (DelHode->BST_Pight !- HGLL)
// Tm nut phai nhat trong cay con trai cua DelHode
B9.4.T: MPHode - DelHode->BST_Left
B9.4.2: if (MPHode->BST_Pight - HGLL)
Thuc hien B9.4.5
B9.4.3: MPHode - MPHode->BST_Pight
B9.4.4: Lap lai B9.4.2
// Chuyen cay con phai DelHode ve thanh cay con phai MPHode
B9.4.5: MPHode->BST_Pight - DelHode->BST_Pight
B9.4.6: DelHode->BST_Pight - HGLL
// Chuyen cay con trai con lai cua DelHode ve cho PrDelHode
B9.4.7: if (OnTheLeft - True)
PrDelHode->BST_Left - DelHode->BST_Left
B9.4.8: else
PrDelHode->BST_Pight - DelHode->BST_Left
B9.4.9: DelHode->BST_Left - HGLL
B9.4.T0: Thuc hien BT0
// Huy DelHode
BT0: delete DelHode
Bkt: Ket thuc
- Cai at thuat toan:
Ham BST_Delete_Hode_TPS co prototype:
int BST_Delete_Hode_TPS(BST_Type &BS_Tree, T DelData);
Ham thuc hien viec huy nut co thanh phan Key la DelData tren cay nh phan tm
kiem BS_Tree bang phuong phap chuyen cay con phai cua nut can huy ve thanh
cay con phai cua cay co nut goc la nut phai nhat trong cay con trai cua nut can
huy (neu nut can huy co hai cay con). Ham tra ve gia tr T neu viec huy thanh
cong (co nut de huy), trong truong hop nguoc lai ham tra ve gia tr 0 (khong ton
tai nut co Key la DelData hoac cay rong).
int BST_Delete_Hode_TPS(BST_Type &BS_Tree, T DelData)
{ BST_Type DelHode - BS_Tree;
BST_Type PrDelHode - HGLL;
int OnTheLeft - 0;
while (DelHode !- HGLL)
{ if (DelHode->Key -- DelData)
break;
PrDelHode - DelHode;
if (DelHode->Key > DelData)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 183
{ DelHode - DelHode->BST_Left;
OnTheLeft - T;
}
else // (DelHode->Key < DelData)
{ DelHode - DelHode->BST_Pight;
OnTheLeft - 0;
}
}
if (DelHode -- HGLL) // Khong co nut de huy
return (0);
if (PrDelHode -- HGLL) // DelHode la nut goc
{ if (DelHode->BST_Left -- HGLL && DelHode->BST_Pight -- HGLL)
BS_Tree - HGLL;
else
if (DelHode->BST_Left -- HGLL) // DelHode co T cay con phai
{ BS_Tree - BS_Tree->BST_Pight;
DelHode->BST_Pight - HGLL;
}
else
if (DelHode->BST_Pight -- HGLL) // DelHode co T cay con trai
{ BS_Tree - BS_Tree->BST_Left;
DelHode->BST_Left - HGLL;
}
else // DelHode co hai cay con
{ BST_Type MPHode - DelHode->BST_Left;
while (MPHode->BST_Pight !- HGLL)
MPHode - MPHode->BST_Pight;
MPHode->BST_Pight - DelHode->BST_Pight;
DelHode->BST_Pight - HGLL;
BS_Tree - BS_Tree->BST_Left;
DelHode->BST_Left - HGLL;
}
}
else // DelHode la nut trung gian
{ if (DelHode->BST_Left -- HGLL && DelHode->BST_Pight -- HGLL)
if (OnTheLeft -- T)
PrDelHode->BST_Left - HGLL;
else
PrDelHode->BST_Pight - HGLL;
else
if (DelHode->BST_Left -- HGLL) // DelHode co T cay con phai
{ if (OnTheLeft -- T)
PrDelHode->BST_Left - DelHode->BST_Pight;
else
PrDelHode->BST_Pight - DelHode->BST_Pight;
DelHode->BST_Pight - HGLL;
}
else
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 184
if (DelHode->BST_Pight -- HGLL) // DelHode co T cay con trai
{ if (OnTheLeft -- T)
PrDelHode->BST_Left - DelHode->BST_Left;
else
PrDelHode->BST_Pight - DelHode->BST_Left;
DelHode->BST_Left - HGLL;
}
else // DelHode co hai cay con
{ BST_Type MPHode - DelHode->BST_Left;
while (MPHode->BST_Pight !- HGLL)
MPHode - MPHode->BST_Pight;
MPHode->BST_Pight - DelHode->BST_Pight;
DelHode->BST_Pight - HGLL;
if (OnTheLeft -- T)
PrDelHode->BST_Left - DelHode->BST_Left;
else
PrDelHode->BST_Pight - DelHode->BST_Left;
DelHode->BST_Left - HGLL;
}
}
delete DelHode;
return (T);
}
- Thuat toan huy 1 nut trong cay nh| phan tm kiem bang phuong phap huy phan tu
the mang Ia phan tu trai nhat trong cay con phai cua nut can huy (neu nut can
huy co u 02 cay con):
// Tm nut can huy va nut cha cua nut can huy
BT: DelHode - BSTree
B2: PrDelHode - HGLL
B3: lF (DelHode - HGLL)
Thuc hien Bkt
B4: lF (DelHode->Key - DelData)
Thuc hien B8
B5: lF (DelHode->Key > DelData) // Chuyen sang cay con trai
B5.T: PrDelHode - DelHode
B5.2: DelHode - DelHode->BST_Left
B5.3: OnTheLeft - True
B5.4: Thuc hien B7
B6: lF (DelHode->Key < DelData) // Chuyen sang cay con phai
B6.T: PrDelHode - DelHode
B6.2: DelHode - DelHode->BST_Pight
B6.3: OnTheLeft - False
B6.4: Thuc hien B7
B7: Lap lai B3
// Chuyen cac moi quan he cua DelHode cho cac nut khac
B8: lF (PrDelHode - HGLL) // DelHode la nut goc
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 185
// Heu DelHode la nut la
B8.T: lf (DelHode->BST_Left - HGLL) and (DelHode->BST_Pight - HGLL)
B8.T.T: BSTree - HGLL
B8.T.2: Thuc hien BTT
// Heu DelHode co mot cay con phai
B8.2: lf (DelHode->BST_Left - HGLL) and (DelHode->BST_Pight !- HGLL)
B8.2.T: BSTree - BSTree->BST_Pight
B8.2.2: DelHode->BST_Pight - HGLL
B8.2.3: Thuc hien BTT
// Heu DelHode co mot cay con trai
B8.3: lf (DelHode->BST_Left !- HGLL) and (DelHode->BST_Pight - HGLL)
B8.3.T: BSTree - BSTree->BST_Left
B8.3.2: DelHode->BST_Left - HGLL
B8.3.3: Thuc hien BTT
B9: ELSE // DelHode khong phai la nut goc
// Heu DelHode la nut la
B9.T: lf (DelHode->BST_Left - HGLL) and (DelHode->BST_Pight - HGLL)
// DelHode la cay con trai cua PrDelHode
B9.T.T: if (OnTheLeft - True)
PrDelHode->BST_Left - HGLL
B9.T.2: else // DelHode la cay con phai cua PrDelHode
PrDelHode->BST_Pight - HGLL
B9.T.3: Thuc hien BTT
// Heu DelHode co mot cay con phai
B9.2: lf (DelHode->BST_Left - HGLL) and (DelHode->BST_Pight !- HGLL)
B9.2.T: if (OnTheLeft - True)
PrDelHode->BST_Left - DelHode->BST_Pight
B9.2.2: else
PrDelHode->BST_Pight - DelHode->BST_Pight
B9.2.3: DelHode->BST_Pight - HGLL
B9.2.4: Thuc hien BTT
// Heu DelHode co mot cay con trai
B9.3: lf (DelHode->BST_Left !- HGLL) and (DelHode->BST_Pight - HGLL)
B9.3.T: if (OnTheLeft - True)
PrDelHode->BST_Left - DelHode->BST_Left
B9.3.2: else
PrDelHode->BST_Pight - DelHode->BST_Left
B9.3.3: DelHode->BST_Left - HGLL
B9.3.4: Thuc hien BTT
// Heu DelHode co hai cay con
BT0: lf (DelHode->BST_Left !- HGLL) and (DelHode->BST_Pight !- HGLL)
// Tm nut trai nhat trong cay con phai cua DelHode va nut cha cua no
BT0.T: MLHode - DelHode->BST_Pight
BT0.2: PrMLHode - DelHode
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 186
BT0.3: if (MLHode->BST_Left - HGLL)
Thuc hien BT0.7
BT0.4: PrMLHode - MLHode
BT0.5: MLHode - MLHode->BST_Left
BT0.6: Lap lai BT0.3
// Chep du lieu tu MLHode ve DelHode
BT0.7: DelHode->Key - MLHode->Key
// Chuyen cay con phai cua MLHode ve cay con trai cua PrMLHode
BT0.8: if (PrMLHode - DelHode) // MLHode la nut phai cua PrMLHode
PrMLHode->BST_Pight - MLHode->BST_Pight
BT0.9: else // MLHode la nut trai cua PrMLHode
PrMLHode->BST_Left - MLHode->BST_Pight
BT0.T0: MLHode->BST_Pight - HGLL
// Chuyen vai tro cua MLHode cho DelHode
BT0.TT: DelHode - MLHode
BT0.T2: Thuc hien BTT
// Huy DelHode
BTT: delete DelHode
Bkt: Ket thuc
- Cai at thuat toan:
Ham BST_Delete_Hode_SB co prototype:
int BST_Delete_Hode_SB(BST_Type &BS_Tree, T DelData);
Ham thuc hien viec huy nut co thanh phan Key la DelData tren cay nh phan tm
kiem BS_Tree bang phuong phap huy phan tu the mang la phan tu trai nhat trong
cay con phai cua nut can huy (neu nut can huy co hai cay con). Ham tra ve gia
tr T neu viec huy thanh cong (co nut de huy), trong truong hop nguoc lai ham tra
ve gia tr 0 (khong ton tai nut co Key la DelData hoac cay rong).
int BST_Delete_Hode_SB(BST_Type &BS_Tree, T DelData)
{ BST_Type DelHode - BS_Tree;
BST_Type PrDelHode - HGLL;
int OnTheLeft - 0;
while (DelHode !- HGLL)
{ if (DelHode->Key -- DelData)
break;
PrDelHode - DelHode;
if (DelHode->Key > DelData)
{ DelHode - DelHode->BST_Left;
OnTheLeft - T;
}
else // (DelHode->Key < DelData)
{ DelHode - DelHode->BST_Pight;
OnTheLeft - 0;
}
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 187
if (DelHode -- HGLL) // Khong co nut de huy
return (0);
if (PrDelHode -- HGLL) // DelHode la nut goc
{ if (DelHode->BST_Left -- HGLL && DelHode->BST_Pight -- HGLL)
BS_Tree - HGLL;
else
if (DelHode->BST_Left -- HGLL) // DelHode co T cay con phai
{ BS_Tree - BS_Tree->BST_Pight;
DelHode->BST_Pight - HGLL;
}
else
if (DelHode->BST_Pight -- HGLL) // DelHode co T cay con trai
{ BS_Tree - BS_Tree->BST_Left;
DelHode->BST_Left - HGLL;
}
}
else // DelHode la nut trung gian
{ if (DelHode->BST_Left -- HGLL && DelHode->BST_Pight -- HGLL)
if (OnTheLeft -- T)
PrDelHode->BST_Left - HGLL;
else
PrDelHode->BST_Pight - HGLL;
else
if (DelHode->BST_Left -- HGLL) // DelHode co T cay con phai
{ if (OnTheLeft -- T)
PrDelHode->BST_Left - DelHode->BST_Pight;
else
PrDelHode->BST_Pight - DelHode->BST_Pight;
DelHode->BST_Pight - HGLL;
}
else
if (DelHode->BST_Pight -- HGLL) // DelHode co T cay con trai
{ if (OnTheLeft -- T)
PrDelHode->BST_Left - DelHode->BST_Left;
else
PrDelHode->BST_Pight - DelHode->BST_Left;
DelHode->BST_Left - HGLL;
}
}
// DelHode co hai cay con
if (DelHode->BST_Left !- HGLL && DelHode->BST_Pight !- HGLL)
{ BST_Type MLHode - DelHode->BST_Pight;
BST_Type PrMLHode - DelHode;
while (MLHode->BST_Left !- HGLL)
{ PrMLHode - MLHode;
MLHode - MLHode->BST_Left;
}
DelHode->Key - MLHode->Key;
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 188
if (PrMLHode -- DelHode)
PrMLHode->BST_Pight - MLHode->BST_Pight;
else
PrMLHode->BST_Left - MLHode->BST_Pight;
MLHode->BST_Pight - HGLL;
DelHode - MLHode;
}
delete DelHode;
return (T);
}
d. Huy toan bo cay:
Thao tac ch don gian la viec thuc hien nhieu lan thao tac huy mot nut tren cay nh
phan tm kiem cho den khi cay tro thanh rong.
Ham BST_Delete co prototype:
void BST_Delete(BST_Type &BS_Tree);
Ham thuc hien viec huy tat ca cac nut trong cay nh phan tm kiem BS_Tree.
void BST_Delete(BST_Type &BS_Tree)
{ BST_Type DelHode - BS_Tree;
while (BST_Delete_Hode_TPS(BS_Tree, DelHode->Key) -- T)
DelHode - BS_Tree;
return;
}
5.3. Cay can bang (Balanced Tree)
5..J. (DD DQD1a Cau tzuc u J1eu
a. nh ngha:
- Cay can bang tuong oi:
Theo Adelson-Velskii va Landis dua ra dnh nghia ve cay can bang tuong doi nhu
sau:
Cay can bang tuong doi la mot cay nh phan thoa man dieu kien la doi voi moi
nut cua cay th chieu cao cua cay con trai va chieu cao cua cay con phai cua nut
do hon kem nhau khong qua T.
Cay can bang tuong doi con duoc goi la cay AVL (AVL tree).
- Cay can bang hoan toan:
Cay can bang hoan toan la mot cay nh phan thoa man dieu kien la doi voi moi
nut cua cay th so nut o cay con trai va so nut o cay con phai cua nut do hon kem
nhau khong qua T.
Hhu vay, mot cay can bang hoan toan chac chan la mot cay can bang tuong doi.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 189
b. Cau truc d lieu cua cay can bang:
e ghi nhan muc do can bang tai moi nut goc cay con chung ta su dung them mot
thanh phan Bal trong cau truc du lieu cua moi nut. Do vay, cau truc du lieu cua cay
nh phan tm kiem can bang tuong doi va cay nh phan tm kiem can bang hoan toan
noi rieng va cua cay can bang noi chung tuong tu nhu cau truc du lieu cua cay nh
phan ngoai tru trong do chung ta dua them thanh phan Bal lam ch so can bang tai
moi nut nhu sau:
typedef struct BAL_Hode
{ T Key;
int Bal; // Ch so can bang tai nut goc cay con
BAL_Hode * BAL_Left; // Vung lien ket quan ly da ch nut goc cay con trai
BAL_Hode * BAL_Pight; // Vung lien ket quan ly da ch nut goc cay con phai
} BAL_OneHode;
typedef BAL_OneHode * BAL_Type;
e quan ly cac cay nh phan tm kiem can bang chung ta ch can quan ly da ch nut
goc cua cay:
BAL_Type BALTree;
Cia tr ch so can bang Bal tai mot nut goc cay con trong cay can bang tuong doi
bang hieu so giua chieu cao cay con trai va chieu cao cay con phai cua nut do.
Cia tr ch so can bang Bal tai mot nut goc cay con trong cay can bang hoan toan
bang hieu so giua so nut o cay con trai va so nut o cay con phai cua nut do.
Hhu vay, neu tai moi nut trong cay nh phan ma thoa man dieu kien -T Bal T th
cay la cay can bang va pham vi tu T den +T la pham vi cho phep cua ch so can
bang Bal:
+ Heu Bal - 0: cay con trai va cay con phai deu nhau
+ Heu Bal - -T: cay con trai nho hon (thap hon) cay con phai (lech phai)
+ Heu Bal - +T: cay con trai lon hon (cao hon) cay con phai (lech trai)
5..2. Cac tDao tac
Trong pham vi cua phan nay chung ta xem xet cac thao tac tren cay nh phan tm
kiem can bang tuong doi. Cac thao tac tren cay can bang hoan toan sinh vien tu van
dung tuong tu. Do vay, khi trnh bay cac thao tac ma noi toi cay can bang nghia la
cay nh phan tm kiem can bang va chung ta cung ch xet cay nh phan tm kiem
trong truong hop khong trung khoa nhan dien.
Trong cac thao tac tren cay nh phan tm kiem can bang tuong doi th co hai thao tac
Them mot nut vao cay va Huy mot nut khoi cay la hai thao tac kha phuc tap v co
nguy co pha vo su can bang cua cay, khi do chung ta phai thuc hien viec can bang
lai cay. Cac thao tac khac hoan toan tuong tu nhu trong cay nh phan noi chung va
cay nh phan tm kiem noi rieng. Do vay, trong phan nay chung ta ch trnh bay hai
thao tac nay ma thoi.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 190
a. Them mot nut vao cay can bang:
Cia su chung ta can them mot nut HewHode co thanh phan du lieu la HewData vao
trong cay can bang BALTree sao cho sau khi them BALTree van la mot cay can
bang. e thuc hien dieu nay truoc het chung ta tm kiem v tri cua nut can them la
nut con trai hoac nut con phai cua mot nut PrHewHode tuong tu nhu trong cay nh
phan tm kiem. Sau khi them HewHode vao cay con trai hoac cay con phai cua
PrHewHode th ch so can bang cua cac nut tu PrHewHode tro ve cac nut truoc se b
thay doi day chuyen va chung ta phai lan nguoc tu PrHewHode ve theo cac nut truoc
de theo doi su thay doi nay. Heu phat hien tai mot nut AncestorHode co su thay doi
vuot qua pham vi cho phep (bang 2 hoac +2) th chung ta tien hanh can bang lai
cay ngay tai nut AncestorHode nay.
Viec can bang lai cay tai nut AncestorHode duoc tien hanh cu the theo cac truong
hop nhu sau:
Truong hop 1: Heu AncestorHode->Bal - -2:
Coi: AncL - AncestorHode->BAL_Left
AncP - AncestorHode->BAL_Pight
AncL co chieu cao la h va AncP co chieu cao la h+2 (h 0)
Co it nhat T cay con cua AncP co chieu cao la h+T
Coi: AncPL - AncP->BAL_Left
AncPP - AncP->BAL_Pight
Cay con co nut goc AncestorHode co the o vao mot trong ba dang sau:
a
1
) AncRL co chieu cao Ia h va AncRR co chieu cao Ia h+1 (AncR->BaI = -1)
AncestorNode

AncL -2 AncR

AncRL -1 AncRR

h

h h+1


e can bang lai AncestorHode chung ta thuc hien viec quay don cay con phai AncP
cua nut nay len thanh nut goc; chuyen AncestorHode thanh nut con trai cua nut goc
va AncestorHode co hai cay con la AncL va AncPL (BAL_Pight Potation).
Cay con AncestorHode sau khi quay cay con phai AncP se la mot cay can bang.
V du: Viec them nut co Key - 50 vao cay nh phan tm kiem can bang sau day se
lam cho cay mat can bang va chung ta phai can bang lai theo truong hop nay:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 191
BALTree

25 -1

19 0 40 0

NULL NULL 30 0 44 0

NULL NULL NULL NULL
e thuc hien can bang lai bang phep quay don nay chung ta thuc hien cac buoc sau:
BT: AncestorHode->BAL_Pight - AncP->BAL_Left
AncestorNode

AncL -2 AncR

-1 AncRR

h

h h+1


B2: AncP->BAL_Left - AncestorHode
AncestorNode

AncL -2 AncR

-1 AncRR

h

h h+1

B3: AncP->Bal - AncestorHode->Bal - 0
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 192
Viec quay ket thuc, cay tro thanh cay can bang.
AncR

AncestorNode 0 AncRR

AncL 0 AncRL



h h h+1

Chuyen vai tro cua AncP cho AncestorHode: AncestorHode - AncP
Ket qua sau phep quay:
AncestorNode AncR

0 AncRR

AncL 0 AncRL



h h h+1

V du: Them nut co Key - 50 vao cay nh phan tm kiem can bang sau day:
BALTree

25 -1

19 0 40 0

NULL NULL 30 0 44 0

NULL NULL NULL NULL
Cay nh phan tm kiem can bang sau khi them nut co Key - 50 nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 193
BALTree

25 -2

19 0 40 -1

NULL NULL 30 0 44 -1

NULL NULL NULL 50 0

NULL NULL
Thuc hien quay cay con phai cua BALTree, cay nh phan tm kiem sau khi quay tro
thanh cay nh phan tm kiem can bang nhu sau:
BALTree

40 0

25 0 44 -1

19 0 30 0 NULL 50 0

NULL NULL NULL NULL NULL NULL
b
1
) AncRL va AncRR eu co chieu cao Ia h+1 (AncR->BaI = 0)
AncestorNode

AncL -2 AncR

AncRL 0 AncRR

h

h+1 h+1


Viec bang lai duoc thuc hien tuong tu nhu truong hop a
T
) o tren:
BT: AncestorHode->BAL_Pight - AncP->BAL_Left
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 194
AncestorNode

AncL -2 AncR

0 AncRR

h

h+1 h+1


B2: AncP->BAL_Left - AncestorHode
AncestorNode

AncL -2 AncR

0 AncRR

h

h+1 h+1

B3: AncP->Bal - T, AncestorHode->Bal - -T
Viec quay ket thuc, cay tro thanh cay can bang.
AncR

AncestorNode 1 AncRR

AncL -1 AncRL



h h+1 h+1


Chuyen vai tro cua AncP cho AncestorHode: AncestorHode - AncP
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 195
Ket qua sau phep quay:
AncestorNode AncR

1 AncRR

AncL -1 AncRL



h h+1 h+1


c
1
) AncRL co chieu cao Ia h+1 va AncRR co chieu cao Ia h (AncR->BaI = 1)
AncestorNode

AncL -2 AncR

AncRL 1 AncRR

h

h+1 h


e can bang lai AncestorHode chung ta thuc hien viec quay kep: quay cay con trai
AncPL va quay cay con phai AncP (Double Potation).
V du: Viec them nut co Key - 27 vao cay nh phan tm kiem can bang sau day se
lam cho cay mat can bang va chung ta phai can bang lai theo truong hop nay:
BALTree

25 -1

19 0 40 0

NULL NULL 30 0 44 0

NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 196
Viec quay duoc tien hanh cu the nhu sau:
Coi: AncPLL - AncPL->BAL_Left
AncPLP - AncPL->BAL_Pight
AncPLL va AncPLP co chieu cao toi da la h
Cay con co nut goc AncestorHode co the o vao mot trong ba dang sau:
- AncRLL co chieu cao la h va AncRLR co chieu cao la h-1 (AncRL->Bal =1; h 1)
AncestorNode

AncL -2 AncR

AncRL 1
AncRR
h 1
AncRLL AncRLR
h
h-1
h

e can bang lai AncestorHode dau tien chung ta thuc hien viec quay don cay con
trai AncPL cua AncP len thanh nut goc cay con phai cua AncestorHode, chuyen
AncP nut thanh nut goc cay con phai cua AncPL va chuyen AncPLP thanh nut goc
cay con trai cua AncP. Sau khi quay cay se tro thanh:
AncestorNode

AncL -2 AncRL

AncRLL -1 AncR

h AncRLR -1
AncRR
h
h-1
h

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 197
Bay gio chung ta tiep tuc thuc hien viec quay don cay con phai AncPL cua
AncestorHode len thanh nut goc va chuyen AncPLL nut thanh nut goc cay con phai
cua AncestorHode. Sau khi quay cay se tro nen can bang:
AncRL

AncestorNode 0 AncR

AncL 0 AncRLL AncRLR -1 AncRR


h-1
h h h

Hhu vay de thuc hien qua trnh quay kep nay chung ta thuc hien cac buoc sau:
BT: AncestorHode->BAL_Pight - AncPL->BAL_Left
AncestorNode

AncL -2 AncR

AncRL 1
AncRR
h 1
AncRLL AncRLR
h
h-1
h

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 198
B2: AncP->BAL_Left - AncPL->BAL_Pight
AncestorNode

AncL -2 AncR

AncRL 1
AncRR
h 1
AncRLL AncRLR
h
h-1
h

B3: AncPL->BAL_Left - AncestorHode
AncestorNode

AncL -2 AncR

AncRL 1
AncRR
h 1
AncRLL AncRLR
h
h-1
h


Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 199
B4: AncPL->BAL_Pight - AncP
AncestorNode

AncL -2 AncR

AncRL 1
AncRR
h 1
AncRLL AncRLR
h
h-1
h

Hieu chnh lai cac ch so can bang:
B5: AncestorHode->Bal - 0
B6: AncPL->Bal - 0
B7: AncP->Bal - -T
Chuyen vai tro cua AncPL cho AncestorHode va chung ta co cay can bang moi:
B8: AncestorHode - AncPL
AncestorNode AncRL

0 AncR

AncL 0 AncRLL AncRLR -1 AncRR


h-1
h h h

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 200
- AncRLL co chieu cao la h-1 va AncRLR co chieu cao la h (AncRL->Bal =-1; h 1)
AncestorNode

AncL -2 AncR

AncRL 1
AncRR
h -1
AncRLL AncRLR
h
h-1
h

e can bang lai AncestorHode hoan toan giong voi truong hop tren, duy ch khac
nhau ve gia tr ch so can bang sau khi quay kep. Chung ta cung thuc hien cac buoc
sau:
BT: AncestorHode->BAL_Pight - AncPL->BAL_Left
B2: AncP->BAL_Left - AncPL->BAL_Pight
B3: AncPL->BAL_Left - AncestorHode
B4: AncPL->BAL_Pight - AncP
B5: AncestorHode->Bal - T
B6: AncP->Bal - 0
B7: AncPL->Bal - 0
B8: AncestorHode - AncPL
Sau khi quay kep cay se tro thanh:
AncestorNode AncRL

0 AncR

AncL 1 AncRLL AncRLR 0 AncRR


h-1
h h h

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 201
- Ca AncRLL va AncRLR eu co chieu cao la h (AncRL->Bal =0; h 0)
AncestorNode

AncL -2 AncR

AncRL 1
AncRR
h 0
AncRLL AncRLR
h

h h

Cung tuong tu, chung ta can bang lai AncestorHode bang cach quay kep giong nhu
truong hop tren nhung ve gia tr ch so can bang sau khi quay th khac nhau. Cac
buoc thuc hien nhu sau:
BT: AncestorHode->BAL_Pight - AncPL->BAL_Left
B2: AncP->BAL_Left - AncPL->BAL_Pight
B3: AncPL->BAL_Left - AncestorHode
B4: AncPL->BAL_Pight - AncP
B5: AncestorHode->Bal - 0
B6: AncP->Bal - 0
B7: AncPL->Bal - 0
B8: AncestorHode - AncPL
Sau khi quay kep cay se tro thanh:
AncestorNode AncRL

0 AncR

AncL 0 AncRLL AncRLR 0 AncRR



h h h h

Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 202
V du: Them nut co Key - 27 vao cay nh phan tm kiem can bang sau day:
BALTree

25 -1

19 0 40 0

NULL NULL 30 0 44 0

NULL NULL NULL NULL
Cay nh phan tm kiem can bang sau khi them nut co Key - 27 nhu sau:
BALTree

25 -2

19 0 40 1

NULL NULL 30 1 44 0

2T 0 NULL NULL NULL

NULL NULL
Thuc hien quay don cay con trai cua BALTree->BAL_Pight cay nh phan tm kiem
sau khi quay tro thanh cay nh phan tm kiem nhu sau:
BALTree

25 -2

19 0 30 -1

NULL NULL 2T 0 40 -1

NULL NULL NULL 44 0

NULL NULL
Thuc hien quay don cay con phai cua BALTree cay nh phan tm kiem sau khi quay
tro thanh cay nh phan tm kiem can bang nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 203
BALTree

30 0

25 0 40 -1

19 0 2T 0 NULL 44 0

NULL NULL NULL NULL NULL NULL
Truong hop 2: Heu AncestorHode->Bal - 2:
Cung tuong tu nhu truong hop T song o day chung ta se thuc hien quay don hoac
quay kep cac nhanh phia nguoc lai
Coi: AncL - AncestorHode->BAL_Left
AncP - AncestorHode->BAL_Pight
AncL co chieu cao la h+2 va AncP co chieu cao la h (h 0)
Co it nhat T cay con cua AncL co chieu cao la h+T
Coi: AncLL - AncL->BAL_Left
AncLP - AncL->BAL_Pight
Cay con co nut goc AncestorHode co the o vao mot trong ba dang sau:
a
2
) AncLL co chieu cao Ia h+1 va AncLR co chieu cao Ia h (AncL->BaI = 1)
AncestorNode

AncL 2 AncR

AncLL 1 AncLR

h

h+1 h


e can bang lai AncestorHode chung ta thuc hien viec quay don cay con trai AncL
cua nut nay len thanh nut goc; chuyen AncestorHode thanh nut con phai cua nut goc
va AncestorHode co hai cay con la AncLP va AncP (BAL_Left Potation).
V du: Viec them nut co Key - T0 vao cay nh phan tm kiem can bang sau day se
lam cho cay mat can bang va chung ta phai can bang lai theo truong hop nay:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 204
BALTree

50 1

35 0 T0 0

20 0 40 0 NULL NULL

NULL NULL NULL NULL
Cac buoc thuc hien viec can bang lai bang phep quay nay nhu sau:
BT: AncestorHode->BAL_Left - AncL->BAL_Pight
B2: AncL->BAL_Pight - AncestorHode
B3: AncL->Bal - AncestorHode->Bal - 0
Chuyen vai tro cua AncL cho AncestorHode:
B4: AncestorHode - AncL
Ket qua sau phep quay don cay con trai:
AncL AncestorNode

AncLL 0

AncLR 0 AncR



h+1 h h

V du: Them nut co Key - T0 vao cay nh phan tm kiem can bang sau day:
BALTree

50 1

35 0 T0 0

20 0 40 0 NULL NULL

NULL NULL NULL NULL
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 205
Cay nh phan tm kiem can bang sau khi them nut co Key - T0 nhu sau:
BALTree

50 2

35 1 T0 0

20 1 40 0 NULL NULL

10 0 NULL NULL NULL

NULL NULL
Thuc hien quay cay con trai cua BALTree, cay nh phan tm kiem sau khi quay tro
thanh cay nh phan tm kiem can bang nhu sau:
BALTree

35 0

20 1 50 0

10 0 NULL 40 0 T0 0

NULL NULL NULL NULL NULL NULL
b
2
) AncLL va AncLR eu co chieu cao Ia h+1 (AncL->BaI = 0)
AncestorNode

AncL 2 AncR

AncLL 0 AncLR

h

h+1 h+1


Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 206
Viec can bang lai AncestorHode cung thuc hie n thao tac quay don nhu tren song ch
so can bang se khac. Do vay, cac buoc thuc hien viec quay nhu sau:
BT: AncestorHode->BAL_Left - AncL->BAL_Pight
B2: AncL->BAL_Pight - AncestorHode
B3: AncL->Bal - -T
B4: AncestorHode->Bal - T
Chuyen vai tro cua AncL cho AncestorHode:
B5: AncestorHode - AncL
Ket qua sau phep quay don cay con trai:
AncL AncestorNode

AncLL -1

AncLR 1 AncR



h+1 h+1 h



c
2
) AncLL co chieu cao Ia h va AncLR co chieu cao Ia h+1 (AncL->BaI = -1)
AncestorNode

AncL 2 AncR

AncLL -1 AncLR

h

h h+1


Cung tuong tu nhu truong hop c
T
) Viec can bang lai AncestorHode duoc thuc hien
thong qua phep quay kep: quay cay con phai AncLP va quay cay con trai AncL
(Double Potation).
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 207
V du: Viec them nut co Key - 44 vao cay nh phan tm kiem can bang sau day se
lam cho cay mat can bang va chung ta phai can bang lai theo truong hop nay:
BALTree

50 1

35 0 T0 0

20 0 40 0 NULL NULL

NULL NULL NULL NULL
Viec quay duoc tien hanh cu the nhu sau:
Coi: AncLPL - AncLP->BAL_Left
AncLPP - AncLP->BAL_Pight
AncLPL va AncLPP co chieu cao toi da la h
Cay con co nut goc AncestorHode co the o vao mot trong ba dang sau:
- AncLRL co chieu cao la h-1 va AncLRR co chieu cao la h (AncRL->Bal =-1; h 1)
AncestorNode

AncL 2 AncR

AncLL -1 AncLR

AncLRL -1 AncLRR h

h
h-1
h

ua trnh quay kep duoc thuc hien thong cac buoc sau:
BT: AncestorHode->BAL_Left - AncLP->BAL_Pight
B2: AncL->BAL_Pight - AncLP->BAL_Left
B3: AncLP->BAL_Pight - AncestorHode
B4: AncLP->BAL_Left - AncL
Hieu chnh lai cac ch so can bang:
B5: AncestorHode->Bal - 0
B6: AncLP->Bal - 0
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 208
B7: AncL->Bal - T
Chuyen vai tro cua AncLP cho AncestorHode va chung ta co cay can bang moi:
B8: AncestorHode - AncLP
AncestorNode AncLR

AncL 0

AncLL 1 AncLRL AncLRR 0 AncR


h-1
h h h

- AncLRL co chieu cao la h va AncLRR co chieu cao la h-1 (AncRL->Bal =1; h 1)
AncestorNode

AncL 2 AncR

AncLL -1 AncLR

AncLRL 1 AncLRR h

h
h-1
h

ua trnh quay kep duoc thuc hien thong cac buoc sau:
BT: AncestorHode->BAL_Left - AncLP->BAL_Pight
B2: AncL->BAL_Pight - AncLP->BAL_Left
B3: AncLP->BAL_Pight - AncestorHode
B4: AncLP->BAL_Left - AncL
Hieu chnh lai cac ch so can bang:
B5: AncestorHode->Bal - -T
B6: AncLP->Bal - 0
B7: AncL->Bal - 0
Chuyen vai tro cua AncLP cho AncestorHode va chung ta co cay can bang moi:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 209
B8: AncestorHode - AncLP
AncestorNode AncLR

AncL 0

AncLL 0 AncLRL AncLRR -1 AncR


h-1
h h h

- Ca AncLRL va AncLRR eu co chieu cao la h (AncRL->Bal =0; h 0)
AncestorNode

AncL 2 AncR

AncLL -1 AncLR

AncLRL 1 AncLRR h

h

h h

ua trnh quay kep duoc thuc hien thong cac buoc sau:
BT: AncestorHode->BAL_Left - AncLP->BAL_Pight
B2: AncL->BAL_Pight - AncLP->BAL_Left
B3: AncLP->BAL_Pight - AncestorHode
B4: AncLP->BAL_Left - AncL
Hieu chnh lai cac ch so can bang:
B5: AncestorHode->Bal - 0
B6: AncLP->Bal - 0
B7: AncL->Bal - 0
Chuyen vai tro cua AncLP cho AncestorHode va chung ta co cay can bang moi:
B8: AncestorHode - AncLP
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 210
AncestorNode AncLR

AncL 0

AncLL 0 AncLRL AncLRR 0 AncR



h h h h

V du: Them nut co Key - 44 vao cay nh phan tm kiem can bang sau day:
BALTree

50 1

35 0 T0 0

20 0 40 0 NULL NULL

NULL NULL NULL NULL
Cay nh phan tm kiem can bang sau khi them nut co Key - 44 nhu sau:
BALTree

50 2

35 -1 T0 0

20 0 40 -1 NULL NULL

NULL NULL NULL 44 0

NULL NULL
Thuc hien quay cay con phai cua BALTree->BAL_Left, cay nh phan tm kiem sau khi
quay tro thanh cay nh phan tm kiem nhu sau:
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 211
BALTree

50 2

40 1 T0 0

35 1 44 0 NULL NULL

20 0 NULL NULL NULL

NULL NULL
Thuc hien quay cay con phai cua BALTree->BAL_Left, cay nh phan tm kiem sau khi
quay tro thanh cay nh phan tm kiem nhu sau:
BALTree

40 0

35 1 50 0

20 0 NULL 44 0 T0 0

NULL NULL NULL NULL NULL NULL
- Thuat toan e quy e them 1 nut vao cay nh| phan tm kiem can bang tuong oi
(AddNew):
// Tao nut moi co Key la HewData de them vao cay HPTKCBT
BT: HewHode - new BAL_OneHode
B2: lF (HewHode - HGLL)
Thuc hien Bkt
B3: HewHode->BAL_Left - HewHode->BAL_Pight - HGLL
B4: HewHode->Key - HewData
B5: HewHode->Bal - 0
B6: lF (BALTree - HGLL) // Cay rong
B6.T: BALTree - HewHode
B6.2: Taller - True // Cay HPTKCBT b cao len hon truoc khi them
B6.3: Thuc hien Bkt
B7: lF (BALTree->Key - HewData) // Trung khoa
Thuc hien Bkt
B8: lF (BALTree->Key < HewData)
// Them de quy vao cay con phai cua BALTree
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 212
B8.T: AddHew(HewData, BALTree->BAL_Pight, Taller)
B8.2: lf (Taller - True) // Viec them vao lam cho cay con phai cao them
B8.2.T: if (BALTree->Bal - T) // Cay se can bang tot hon
B8.2.T.T: BALTree->Bal - 0
B8.2.T.2: Taller - False
B8.2.T.3: Thuc hien Bkt
B8.2.2: if (BALTree->Bal - 0) // Cay van con can bang
B8.2.2.T: BALTree->Bal - -T
B8.2.2.2: Thuc hien Bkt
B8.2.3: if (BALTree->Bal - -T)
// Cay mat can bang theo truong hop T, phai can bang lai
B8.2.3.T: AncP - BALTree->BAL_Pight
B8.2.3.2: if (AncP->Bal T) // Thuc hien quay don theo a
T
), b
T
)
B8.2.3.2.T: BALTree->BAL_Pight - AncP->BAL_Left
B8.2.3.2.2: AncP->BAL_Left - BALTree
B8.2.3.2.3: if (AncP->Bal - -T)
BALTree->Bal - AncP->Bal - 0
B8.2.3.2.4: else
AncP->Bal - T
B8.2.3.2.5: BALTree - AncP
B8.2.3.3: else // Thuc hien quay kep theo c
T
)
B8.2.3.3.T: AncPL - AncP->BAL_Left
B8.2.3.3.2: BALTree->BAL_Pight - AncPL->BAL_Left
B8.2.3.3.3: AncP->BAL_Left - AncPL->BAL_Pight
B8.2.3.3.4: AncPL->BAL_Left - BALTree
B8.2.3.3.5: AncPL->BAL_Pight - AncP
B8.2.3.3.6: if (AncPL->Bal - T)
B8.2.3.3.6.T: BALTree->Bal - AncPL->Bal - 0
B8.2.3.3.6.2: AncP->Bal - -T
B8.2.3.3.7: if (AncPL->Bal - -T)
AncP->Bal - AncPL->Bal - 0
B8.2.3.3.8: if (AncPL->Bal - 0)
AncP->Bal - BALTree->Bal - 0
B8.2.3.3.9: BALTree - AncPL
B8.2.3.4: Taller - False
B9: lF (BALTree->Key > HewData)
// Them de quy vao cay con trai cua BALTree
B9.T: AddHew(HewData, BALTree->BAL_Left, Taller)
B9.2: lf (Taller - True) // Viec them vao lam cho cay con trai cao them
B9.2.T: if (BALTree->Bal - -T) // Cay se can bang tot hon
B9.2.T.T: BALTree->Bal - 0
B9.2.T.2: Taller - False
B9.2.T.3: Thuc hien Bkt
B9.2.2: if (BALTree->Bal - 0) // Cay van con can bang
B9.2.2.T: BALTree->Bal - T
B9.2.2.2: Thuc hien Bkt
B9.2.3: if (BALTree->Bal - T)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 213
// Cay mat can bang theo truong hop 2, phai can bang lai
B9.2.3.T: AncL - BALTree->BAL_Left
B9.2.3.2: if (AncL->Bal -T) // Thuc hien quay don theo a
2
), b
2
)
B9.2.3.2.T: BALTree->BAL_Left - AncL->BAL_Pight
B9.2.3.2.2: AncL->BAL_Pight - BALTree
B9.2.3.2.3: if (AncL->Bal - T)
BALTree->Bal - AncL->Bal - 0
B9.2.3.2.4: else
AncL->Bal - -T
B9.2.3.2.5: BALTree - AncP
B9.2.3.3: else // Thuc hien quay kep theo c
2
)
B9.2.3.3.T: AncLP - AncL->BAL_Pight
B9.2.3.3.2: BALTree->BAL_Left - AncLP->BAL_Pight
B9.2.3.3.3: AncL->BAL_Pight - AncLP->BAL_Left
B9.2.3.3.4: AncLP->BAL_Pight - BALTree
B9.2.3.3.5: AncLP->BAL_Left - AncL
B9.2.3.3.6: if (AncLP->Bal - -T)
B9.2.3.3.6.T: BALTree->Bal - AncLP->Bal - 0
B9.2.3.3.6.2: AncL->Bal - T
B9.2.3.3.7: if (AncLP->Bal - T)
AncL->Bal - AncLP->Bal - 0
B9.2.3.3.8: if (AncLP->Bal - 0)
AncL->Bal - BALTree->Bal - 0
B9.2.3.3.9: BALTree - AncLP
B9.2.3.4: Taller - False
Bkt: Ket thuc
- Cai at thuat toan:
Ham BAL_Add_Hode co prototype:
BAL_Type BAL_Add_Hode (BAL_Type &BTree, T HewData, int &Taller);
Ham thuc hien viec them vao cay nh phan tm kiem can bang BTree mot nut co
thanh phan Key la HewData. Ham tra ve con tro tro toi da ch cua nut moi them
neu viec them thanh cong, trong truong hop nguoc lai ham tra ve con tro HGLL.
Trong truong hop viec them lam cho cay phat trien chieu cao th Taller co gia tr
la T, nguoc lai Taller co gia tr la 0.
BAL_Type BAL_Add_Hode (BAL_Type &BTree, T HewData, int &Taller)
{ if (BS_Tree -- HGLL)
{ BTree - new BAL_OneHode;
if (BTree !- HGLL)
{ BTree->Key - HewData;
BTree->Bal - 0;
BTree->BAL_Left - BTree->BAL_Pight - HGLL;
Taller - T;
}
return (BTree);
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 214
if (BTree->Key -- HewData)
{ Taller - 0;
return (HGLL);
}
if (BTree->Key < HewData)
{ BAL_Add_Hode (BTree->BAL_Pight, HewData, Taller);
if (Taller -- T)
{ switch (BTree->Bal)
{ case T: BTree->Bal - 0;
Taller - 0;
break;
case 0: BTree->Bal - -T;
break;
case -T: BAL_Type AncP - BTree->BAL_Pight;
if (AncP->Bal !- T)
{ BTree->BAL_Pight - AncP->BAL_Left
AncP->BAL_Left - BTree;
if (AncP->Bal -- -T)
BTree->Bal - AncP->Bal - 0;
else
AncP->Bal - T;
BTree - AncP;
}
else
{ BAL_Type AncPL - AncP->BAL_Left;
BTree->BAL_Pight - AncPL->BAL_Left;
AncP->BAL_Left - AncPL->BAL_Pight;
AncPL->BAL_Left - BTree;
AncPL->BAL_Pight - AncP;
if (AncPL->Bal -- T)
{ BTree->Bal - AncPL->Bal - 0;
AncP->Bal - -T;
}
else
if (AncPL->Bal -- -T)
AncP->Bal - AncPL->Bal - 0;
else
AncP->Bal - BTree->Bal - 0;
BTree - AncPL;
}
Taller - 0;
break;
} // switch
} // if (Taller -- T)
} // if (BTree->Key < HewData)
else // (BTree->Key > HewData)
{ BAL_Add_Hode (BTree->BAL_Left, HewData, Taller);
if (Taller -- T)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 215
{ switch (BTree->Bal)
{ case -T: BTree->Bal - 0;
Taller - 0;
break;
case 0: BTree->Bal - T;
break;
case T: BAL_Type AncL - BTree->BAL_Left;
if (AncL->Bal !- -T)
{ BTree->BAL_Left - AncL->BAL_Pight
AncL->BAL_Pight - BTree;
if (AncL->Bal -- T)
BTree->Bal - AncL->Bal - 0;
else
AncL->Bal - -T;
BTree - AncL;
}
else
{ BAL_Type AncLP - AncL->BAL_Pight;
BTree->BAL_Left - AncLP->BAL_Pight;
AncL->BAL_Pight - AncLP->BAL_Left;
AncLP->BAL_Pight - BTree;
AncLP->BAL_Left - AncL;
if (AncLP->Bal -- -T)
{ BTree->Bal - AncLP->Bal - 0;
AncL->Bal - T;
}
else
if (AncLP->Bal -- T)
AncL->Bal - AncLP->Bal - 0;
else
AncL->Bal - BTree->Bal - 0;
BTree - AncLP;
}
Taller - 0;
break;
} // switch
} // if (Taller -- T)
} // else: (BTree->Key > HewData)
return (BTree);
}
b. Huy mot nut ra khoi cay can bang:
Tuong tu nhu trong thao tac them, gia su chu ng ta can huy mot nut DelHode co
thanh phan du lieu la DelData ra khoi cay can bang BALTree sao cho sau khi huy
BALTree van la mot cay can bang. e thuc hien dieu nay truoc het chung ta phai
thuc hien viec tm kiem v tri cua nut can huy la nut con trai hoac nut con phai cua
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 216
mot nut PrDelHode tuong tu nhu trong cay nh phan tm kiem. Viec huy cung chia
lam ba truong hop nhu doi voi trong cay nh phan tm kiem:
- DelHode la nut la,
- DelHode la nut trung gian co 0T cay con,
- DelHode la nut co du 02 cay con.
Trong truong hop DelHode co du 02 cay con chung ta su dung phuong phap huy
phan tu the mang v theo phuong phap nay se lam cho chieu cao cua cay it bien
dong hon phuong phap kia.
Sau khi huy DewHode ra khoi cay con trai hoac cay con phai cua PrHewHode th ch
so can bang cua cac nut tu PrDelHode tro ve cac nut truoc cung se b thay doi day
chuyen va chung ta phai lan nguoc tu PrDelHode ve theo cac nut truoc de theo doi
su thay doi nay. Heu phat hien tai mot nut AncHode co su thay doi vuot qua pham vi
cho phep (bang 2 hoac +2) th chung ta tien hanh can bang lai cay ngay tai nut
AncHode nay.
Viec can bang lai cay tai nut AncHode duoc tien hanh cu the theo cac truong hop
tuong tu nhu trong thao tac them:
- Thuat toan e quy e huy 1 nut trong cay nh| phan tm kiem can bang tuong oi
(BAL_DeIete_Node):
// Tm nut can huy va nut cha cua nut can huy
BT: PrDelHode - HGLL
B2: lF (BALTree - HGLL)
B2.T: Shorter - False
B2.2: Thuc hien Bkt
B3: PrDelHode - BALTree
B4: lF (BALTree->Key > DelData) // Chuyen sang cay con trai
B4.T: OnTheLeft - True
B4.2: BAL_Delete_Hode (BALTree->BAL_Left, DelData, Shorter)
B5: lF (BALTree->Key < DelData) // Chuyen sang cay con phai
B5.T: OnTheLeft - False
B5.2: BAL_Delete_Hode (BALTree->BAL_Pight, DelData, Shorter)
B6: lf (Shorter - True)
B6.T: if (OnTheLeft - True)
B6.T.T: if (BALTree->Bal - T) // Cay can bang tot hon
B6.T.T.T: BALTree->Bal - 0
B6.T.T.2: Shorter - False
// Cay van b thap nhung van con can bang
B6.T.2: if (BALTree->Bal - 0)
BALTree->Bal - -T
B6.T.3: if (BALTree->Bal - -T) // Cay mat can bang
B6.T.3.T: AncP - BALTree->BAL_Pight
B6.T.3.2: if (AncP->Bal T) // Thuc hien quay don
B6.T.3.2.T: BALTree->BAL_Pight - AncP->BAL_Left
B6.T.3.2.2: AncP->BAL_Left - BALTree
B6.T.3.2.3: if (AncP->Bal - -T)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 217
BALTree->Bal - AncP->Bal - 0
B6.T.3.2.4: else
AncP->Bal - T
B6.T.3.2.5: BALTree - AncP
B6.T.3.3: else // Thuc hien quay kep
B6.T.3.3.T: AncPL - AncP->BAL_Left
B6.T.3.3.2: BALTree->BAL_Pight - AncPL->BAL_Left
B6.T.3.3.3: AncP->BAL_Left - AncPL->BAL_Pight
B6.T.3.3.4: AncPL->BAL_Left - BALTree
B6.T.3.3.5: AncPL->BAL_Pight - AncP
B6.T.3.3.6: if (AncPL->Bal - T)
B6.T.3.3.6.T: BALTree->Bal - AncPL->Bal - 0
B6.T.3.3.6.2: AncP->Bal - -T
B6.T.3.3.7: if (AncPL->Bal - -T)
AncP->Bal - AncPL->Bal - 0
B6.T.3.3.8: if (AncPL->Bal - 0)
AncP->Bal - BALTree->Bal - 0
B6.T.3.3.9: BALTree - AncPL
B6.T.3.4: Shorter - False
B6.2: else // (OnTheLeft - False)
B6.2.T: if (BALTree->Bal - -T) // Cay can bang tot hon
B6.2.T.T: BALTree->Bal - 0
B6.2.T.2: Shorter - False
// Cay van b thap nhung van con can bang
B6.2.2: if (BALTree->Bal - 0)
BALTree->Bal - T
B6.2.3: if (BALTree->Bal - T) // Cay mat can bang
B6.2.3.T: AncL - BALTree->BAL_Left
B6.2.3.2: if (AncL->Bal -T) // Thuc hien quay don
B6.2.3.2.T: BALTree->BAL_Left - AncL->BAL_Pight
B6.2.3.2.2: AncL->BAL_Pight - BALTree
B6.2.3.2.3: if (AncL->Bal - T)
BALTree->Bal - AncL->Bal - 0
B6.2.3.2.4: else
AncL->Bal - T
B6.2.3.2.5: BALTree - AncL
B6.2.3.3: else // Thuc hien quay kep
B6.2.3.3.T: AncLP - AncL->BAL_Pight
B6.2.3.3.2: BALTree->BAL_Left - AncLP->BAL_Pight
B6.2.3.3.3: AncL->BAL_Pight - AncLP->BAL_Left
B6.2.3.3.4: AncLP->BAL_Pight - BALTree
B6.2.3.3.5: AncLP->BAL_Left - AncL
B6.2.3.3.6: if (AncLP->Bal - -T)
B6.2.3.3.6.T: BALTree->Bal - AncLP->Bal - 0
B6.2.3.3.6.2: AncL->Bal - T
B6.2.3.3.7: if (AncLP->Bal - T)
AncL->Bal - AncLP->Bal - 0
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 218
B6.2.3.3.8: if (AncLP->Bal - 0)
AncL->Bal - BALTree->Bal - 0
B6.2.3.3.9: BALTree - AncLP
B6.2.3.4: Shorter - False
// Chuyen cac moi quan he cua DelHode cho cac nut khac
B7: lF (PrDelHode - HGLL) // Huy la nut goc
// Heu nut can huy la nut la
B7.T: lf (BALTree->BAL_Left - HGLL) and (BALTree->BAL_Pight - HGLL)
B7.T.T: BALTree - HGLL
B7.T.2: delete BALTree
B7.T.3: Thuc hien Bkt
// Heu nut can huy co mot cay con phai
B7.2: lf (BALTree->BAL_Left - HGLL) and (BALTree->BAL_Pight !- HGLL)
B7.2.T: BALTree - BALTree->BAL_Pight
B7.2.2: BALTree->BAL_Pight - HGLL
B7.2.3: delete BALTree
B7.2.4: Thuc hien Bkt
// Heu nut can huy co mot cay con trai
B7.3: lf (BALTree->BAL_Left !- HGLL) and (BALTree->BAL_Pight - HGLL)
B7.3.T: BALTree - BALTree->BAL_Left
B7.3.2: BALTree->BAL_Left - HGLL
B7.3.3: delete BALTree
B7.3.4: Thuc hien Bkt
B8: ELSE // nut can huy khong phai la nut goc
// Heu nut can huy la nut la
B8.T: lf (BALTree->BAL_Left - HGLL) and (BALTree->BAL_Pight - HGLL)
// Hut can huy la cay con trai cua PrDelHode
B8.T.T: if (OnTheLeft - True)
PrDelHode->BAL_Left - HGLL
B8.T.2: else // Hut can huy la cay con phai cua PrDelHode
PrDelHode->BAL_Pight - HGLL
B8.T.3: delete BALTree
B8.T.4: Thuc hien Bkt
// Heu nut can huy co mot cay con phai
B8.2: lf (BALTree->BAL_Left - HGLL) and (BALTree->BAL_Pight !- HGLL)
B8.2.T: if (OnTheLeft - True)
PrDelHode->BAL_Left - BALTree->BAL_Pight
B8.2.2: else
PrDelHode->BAL_Pight - BALTree->BAL_Pight
B8.2.3: BALTree->BAL_Pight - HGLL
B8.2.4: delete BALTree
B8.2.5: Thuc hien Bkt
// Heu nut can huy co mot cay con trai
B8.3: lf (BALTree->BAL_Left !- HGLL) and (BALTree->BAL_Pight - HGLL)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 219
B8.3.T: if (OnTheLeft - True)
PrDelHode->BAL_Left - BALTree->BAL_Left
B8.3.2: else
PrDelHode->BAL_Pight - BALTree->BAL_Left
B8.3.3: BALTree->BAL_Left - HGLL
B8.3.4: delete BALTree
B8.3.5: Thuc hien Bkt
// Heu DelHode co hai cay con
B9: lf (BALTree->BAL_Left !- HGLL) and (BALTree->BAL_Pight !- HGLL)
// Tm nut trai nhat trong cay con phai cua nut can huy va nut cha cua no
B9.T: MLHode - BALTree->BAL_Pight
B9.2: PrMLHode - BALTree
B9.3: if (MLHode->BAL_Left - HGLL)
Thuc hien B9.7
B9.4: PrMLHode - MLHode
B9.5: MLHode - MLHode->BAL_Left
B9.6: Lap lai B9.3
// Chep du lieu tu MLHode ve DelHode
B9.7: BALTree->Key - MLHode->Key
// Chuyen cay con phai cua MLHode ve cay con trai cua PrMLHode
B9.8: if (PrMLHode - BALTree) // MLHode la nut phai cua PrMLHode
PrMLHode->BAL_Pight - MLHode->BAL_Pight
B9.9: else // MLHode la nut trai cua PrMLHode
PrMLHode->BAL_Left - MLHode->BAL_Pight
B9.T0: MLHode->BAL_Pight - HGLL
// Chuyen vai tro cua MLHode cho nut can huy
B9.TT: BALTree - MLHode
Bkt: Ket thuc
- Cai at thuat toan:
Ham BAL_Del_Hode co prototype:
int BAL_Del_Hode(BAL_Type &BALTree, T Data,
int &Shorter, BAL_Type &PrDHode, int &OnTheLeft);
Ham thuc hien viec huy nut co thanh phan Key la Data tren cay nh phan tm
kiem can bang BALTree bang phuong phap huy phan tu the mang la phan tu phai
nhat trong cay con trai cua nut can huy (neu nut can huy co hai cay con). Ham
tra ve gia tr T neu viec huy thanh cong (co nut de huy), trong truong hop nguoc
lai ham tra ve gia tr 0 (khong ton tai nut co Key la Data hoac cay rong).
int BAL_Del_Hode(BAL_Type &BALTree, T Data,
int &Shorter, BAL_Type &PrDHode, int &OnTheLeft)
{ if (BALTree !- HGLL)
{ Shorter - 0;
PrDHode - HGLL;
return (0)
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 220
PrDHode - BALTree;
if (BALTree->Key > Data) // Huy nut o cay con trai
{ OnTheLeft - T;
return(BAL_Del_Hode (BALTree->BAL_Left, Data, Shorter, PrDHode));
}
if (BALTree->Key < Data) // Huy nut o cay con phai
{ OnTheLeft - 0;
return(BAL_Del_Hode (BALTree->BAT_Pight, Data, Shorter, PrDHode));
}
if (Shorter -- True)
{ if (OnTheLeft -- T)
{ if (BALTree->Bal -- T) // Cay can bang tot hon
{ BALTree->Bal - 0;
Shorter - 0;
}
if (BALTree->Bal--0) //Cay van b thap nhung van con can bang
BALTree->Bal - -T;
if (BALTree->Bal -- -T) // Cay mat can bang
{ BAL_Type AncP - BALTree->BAL_Pight;
if (AncP->Bal !- T) // Thuc hien quay don
{ BALTree->BAL_Pight - AncP->BAL_Left;
AncP->BAL_Left - BALTree;
if (AncP->Bal -- -T)
BALTree->Bal - AncP->Bal - 0;
else
AncP->Bal - T;
BALTree - AncP;
}
else // Thuc hien quay kep
{ BAL_Type AncPL - AncP->BAL_Left;
BALTree->BAL_Pight - AncPL->BAL_Left;
AncP->BAL_Left - AncPL->BAL_Pight;
AncPL->BAL_Left - BALTree;
AncPL->BAL_Pight - AncP;
if (AncPL->Bal -- T)
{ BALTree->Bal - AncPL->Bal - 0;
AncP->Bal - -T;
}
if (AncPL->Bal -- -T)
AncP->Bal - AncPL->Bal - 0;
if (AncPL->Bal -- 0)
AncP->Bal - BALTree->Bal - 0;
BALTree - AncPL;
}
Shorter - 0;
}
}
else // (OnTheLeft - 0)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 221
{ if (BALTree->Bal -- -T) // Cay can bang tot hon
{ BALTree->Bal - 0;
Shorter - 0;
}
// Cay van b thap nhung van con can bang
if (BALTree->Bal -- 0)
BALTree->Bal - T;
if (BALTree->Bal -- T) // Cay mat can bang
{ BAL_Type AncL - BALTree->BAL_Left;
if (AncL->Bal !- -T) // Thuc hien quay don
{ BALTree->BAL_Left - AncL->BAL_Pight;
AncL->BAL_Pight - BALTree;
if (AncL->Bal -- T)
BALTree->Bal - AncL->Bal - 0;
else
AncL->Bal - T;
BALTree - AncL;
}
else // Thuc hien quay kep
{ BAL_Type AncLP - AncL->BAL_Pight;
BALTree->BAL_Left - AncLP->BAL_Pight;
AncL->BAL_Pight - AncLP->BAL_Left;
AncLP->BAL_Pight - BALTree;
AncLP->BAL_Left - AncL;
if (AncLP->Bal -- -T)
{ BALTree->Bal - AncLP->Bal - 0;
AncL->Bal - T;
}
if (AncLP->Bal -- T)
AncL->Bal - AncLP->Bal - 0;
if (AncLP->Bal -- 0)
AncL->Bal - BALTree->Bal - 0;
BALTree - AncLP
}
Shorter - 0;
}
}
}
if (PrDHode -- HGLL) // huy nut goc
{ if (BALTree->BAL_Left -- HGLL && BALTree->BAL_Pight -- HGLL)
BALTree - HGLL;
else
if (BALTree->BST_Left -- HGLL) // nut can huy co T cay con phai
{ BALTree - BALTree->BAL_Pight;
BALTree->BAL_Pight - HGLL;
}
else
if (BALTree->BAL_Pight -- HGLL) //nut can huy co T cay con trai
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 222
{ BALTree - BALTree->BAL_Left;
BALTree->BAL_Left - HGLL;
}
}
else // nut can huy la nut trung gian
{ if (BALTree->BAL_Left -- HGLL && BALTree->BAL_Pight -- HGLL)
if (OnTheLeft -- T)
PrDHode->BAL_Left - HGLL;
else
PrDHode->BAL_Pight - HGLL;
else
if (BALTree->BAL_Left -- HGLL)
{ if (OnTheLeft -- T)
PrDHode->BAL_Left - BALTree->BAL_Pight;
else
PrDHode->BAL_Pight - BALTree->BAL_Pight;
BALTree->BAL_Pight - HGLL;
}
else
if (BALTree->BAL_Pight -- HGLL)
{ if (OnTheLeft -- T)
PrDHode->BAL_Left - BALTree->BAL_Left;
else
PrDHode->BAL_Pight - BALTree->BAL_Left;
BALTree->BAL_Left - HGLL;
}
}
if (BALTree->BAL_Left !- HGLL && BALTree->BAL_Pight !- HGLL)
{ BAL_Type MLHode - BALTree->BAL_Pight;
BAL_Type PrMLHode - BALTree;
while (MLHode->BAL_Left !- HGLL)
{ PrMLHode - MLHode;
MLHode - MLHode->BAL_Left;
}
BALTree->Key - MLHode->Key;
if (PrMLHode -- BALTree)
PrMLHode->BAL_Pight - MLHode->BAL_Pight;
else
PrMLHode->BAL_Left - MLHode->BAL_Pight;
MLHode->BAL_Pight - HGLL;
BALTree - MLHode;
}
delete BALTree;
return (T);
}
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 223
Cau hoi va Bai tap
1. Trnh bay khai niem, dac diem va cau truc du lieu cua cac loai cay So sanh voi
danh sach lien ket
2. Hay dua ra phuong phap de chuyen tu cau truc du lieu cua mot cay H-phan noi
chung thanh mot cay nh phan
3. Trnh bay thuat toan va cai dat tat ca cac thao tac tren cay nh phan tm kiem, cay
nh phan tm kiem can bang
4. Trnh bay thuat toan va cai dat tat ca ca c thao tac tren cay nh phan tm kiem, cay
nh phan tm kiem can bang trong truong hop chap nhan su trung khoa nhan dien
cua cac nut trong cay
5. Trnh bay tat ca cac thuat toan va cai dat tat ca cac thuat toan de thuc hien viec huy
mot nut tren cay nh phan tm kiem neu cay co 02 cay con Theo ban, thuat toan
nao la don gian Cho nhan xet ve moi thuat toan
6. Trnh bay va cai dat tat ca cac thuat toan de thuc hien cac thao tac tren cay nh
phan tm kiem, cay nh phan tm kiem can bang trong hai truong hop: Chap nhan va
Khong chap nhan su trung lap ve khoa cua cac nut bang cach khong su dung thuat
toan de quy (Tru cac thao tac da trnh bay trong tai lieu)
T. Trnh bay thuat toan va cai dat chuong trnh thuc hien cac cong viec sau tren cay nh
phan:
a) Tinh so nut la cua cay.
b) Tinh so nut trung gian cua cay.
c) Tinh chieu dai duong di toi mot nut co khoa la K tren cay.
d) Cho biet cap cua mot nut co khoa la K tren cay.
8. Trnh bay thuat toan va cai dat chuong trnh thuc hien cong viec tao cay nh phan
tm kiem ma khoa cua cac nut la khoa cua cac nut trong mot danh sach lien ket doi
sao cho toi uu hoa bo nho. Biet rang, danh sach lien ket doi ban dau khong can thiet
sau khi tao xong cay nh phan tm kiem va gia su khong cho phep su trung khoa
giua cac nut trong cay.
9. Voi yeu cau trong bai tap 8 o tren, trong truong hop neu danh sach lien ket co nhieu
nut co thanh phan du lieu giong nhau, ban hay de xuat phuong an giai quyet de
khong b mat du lieu sau khi tao xong cay nh phan tm kiem.
10. Trnh bay thuat toan va cai dat chuong trnh thuc hien cong viec chuyen cay nh
phan tm kiem thanh danh sach lien ket doi sao cho toi uu hoa bo nho. Biet rang,
cay nh phan tm kiem ban dau khong can thiet sau khi tao xong danh sach lien ket
(ngc vi yeu cau trong bai tap 8).
11. Trnh bay thuat toan va cai dat chuong trnh thuc hien cong viec nhap hai cay nh
phan tm kiem thanh mot cay nh phan tm kiem duy nhat sao cho toi uu bo nho. Biet
rang, hai cay nh phan tm kiem ban dau khong can thiet sau khi tao xong cay moi.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 224
ON TAP (REVIEW)
He thong lai cac Cau truc d lieu va cac Giai thuat a hoc
Chuong 1: Tong quan ve Cau Truc Du Lieu va Giai Thuat
1. Tam quan trong cua Cau truc du Iieu va Giai thuat trong mot e an tin hoc
T.T. Xay dung Cau truc du lieu
T.2. Xay dung Ciai thuat
T.3. Moi quan he giua Cau truc du lieu va Ciai thuat
2. anh gia Cau truc du Iieu va Giai thuat
2.T. Cac tieu chuan danh gia Cau truc du lieu
- Thoi gian thuc hien
- Muc do tieu ton bo nho
- Tinh thuc te
2.2. anh gia do phuc tap cua thuat toan
3. Kieu du Iieu
3.T. Khai niem ve Kieu du lieu
T - {V, O}
3.2. Cac kieu du lieu co so
- Hguyen
- Thuc
- Ky tu
3.3. Cac kieu du lieu co cau truc
- Mang
- Cau truc (struct)
3.4. Kieu du lieu con tro
T * Pt;
3.5. Kieu du lieu tap tin
FlLE * Fp;
int Fh;
Chuong 2: Ky thuat tm kiem (Searching)
1. Khai quat ve tm kiem
2. Cac giai thuat tm kiem noi (tm kiem tren day)
2.T. Tm tuyen tinh (Linear Search)
Duyet tu dau den cuoi mang de tm
2.2. Tm nh phan (Binary Search)
Duyet tung nua cac phan tu, ch ap dung cho mang da co thu tu.
3. Cac giai thuat tm kiem ngoai (tm kiem tren tap tin)
3.T. Tm tuyen tinh (Linear Search)
Duyet tu dau den cuoi file de tm
3.2. Tm kiem theo ch muc (lndex Search)
Duyet tu dau den tap tin ch muc de lay du lieu trong tap tin du lieu.
Chuong 3: Ky thuat sap xep (Sorting)
1. Khai quat ve sap xep
2. Cac phuong phap sap xep noi (sap xep day)
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 225
2.T. Sap xep bang phuong phap doi cho (Exchange)
- Hoi bot (Bubble Sort)
- Phan hoach (uick Sort)
2.3. Sap xep bang phuong phap chon (Selection)
Chon truc tiep (Straight Selection Sort)
2.4. Sap xep bang phuong phap chen (lnsertion)
- Chen truc tiep (Straight lnsertion Sort)
2.5. Sap xep bang phuong phap tron (Merge)
- Tron truc tiep (Straight Merge Sort)
- Tron tu nhien (Hatural Merge Sort)
3. Cac phuong phap sap xep ngoai (sap xep tap tin)
3.T. Sap xep bang phuong phap tron
- Tron truc tiep (Straight Merge Sort)
- Tron tu nhien (Hatural Merge Sort)
3.2. Sap xep theo ch muc
Chuong 4: Danh sach (List)
1. Khai niem ve danh sach
2. Cac phep toan tren danh sach
3. Danh sach ac (Condensed List)
3.T. nh nghia
3.2. Bieu dien va Cac thao tac
const int MaxLen - T0000; // hoac: +define MaxLen T0000
int Length;
T CD_LlST|MaxLen]; // hoac: T * CD_LlST - new T|MaxLen];
3.3. Uu nhuoc diem va Ung dung
4. Danh sach Iien ket (Linked List)
4.T. nh nghia
4.2. Danh sach lien ket don (Singly Linked List)
typedef struct SLL_Hode
{ T Key;
SLL_Hode * HextHode;
} SLL_OneHode;
typedef SLL_OneHode * SLL_Type;
4.3. Danh sach lien ket kep (Doubly Linked List)
typedef struct DLL_Hode
{ T Key;
DLL_Hode * HextHode;
DLL_Hode * PreHode;
} DLL_OneHode;
typedef DLL_OneHode * DLL_Type;
4.4. Uu nhuoc diem cua danh sach lien ket
5. Danh sach han che
5.T. Hang doi (ueue)
typedef struct _C
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 226
{ int Len; // Chieu dai hang doi
int Front, Pear;
T * List; // Hoi dung hang doi
} C_GEGE;
C_GEGE C_List;
5.2. Hgan xep (Stack)
typedef struct S_C
{ int Size; // Kich thuoc ngan xep
int SP;
T * List; // Hoi dung ngan xep
} C_STACK;
C_STACK CS_List;
Chuong 5: Cay (Tree)
1. Cac khai niem
2. Cay nh| phan (Binary tree)
2.T. nh nghia
2.2. Bieu dien va Cac thao tac
typedef struct BinT_Hode
{ T Key;
BinT_Hode * BinT_Left;
BinT_Hode * BinT_Pight;
} BinT_OneHode;
typedef BinT_OneHode * BinT_Type;
2.3. Cay nh phan tm kiem (Binary Searching Tree)
typedef struct BST_Hode
{ T Key;
BST_Hode * BST_Left;
BST_Hode * BST_Pight;
} BST_OneHode;
typedef BST_OneHode * BST_Type;
3. Cay can bang (BaIanced tree)
3.T. nh nghia
typedef struct BAL_Hode
{ T Key;
int Bal;
BAL_Hode * BAL_Left;
BAL_Hode * BAL_Pight;
} BAL_OneHode;
typedef BAL_OneHode * BAL_Type;
3.2. Cac thao tac
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 227
Cau hoi va Bai tap on tap tong hp
1. Phan biet ve cau truc du lieu, y nghia va tac dung giua: danh sach lien ket doi, danh
sach da lien ket co hai moi lien ket va cay nh phan
2. Hay su dung cau truc du lieu thich hop de luu tru cac so nguyen co dau co gia tr
tuyet doi qua lon trong bo nho trong cua may tinh. Voi cau truc du lieu nay, hay
trnh bay thuat toan va cai dat chuong trnh thuc hien viec cong, tru, nhan, chia
nguyen, lay du, so sanh cac so nguyen co gia tr lon nay.
3. Hay su dung cau truc du lieu thich hop de luu tru do dai duong di giua cac Thanh
pho voi nhau trong mot quoc gia vao trong bo nho trong cua may tinh. Voi cau truc
du lieu nay, hay trnh bay thuat toan va cai dat chuong trnh thuc hien viec liet ke tat
ca cac duong di tu Thanh pho A den Thanh pho B uong di nao la duong di ngan
nhat
4. Cac van ban duoc luu tru thanh tung dong tren cac file van ban, moi dong co chieu
dai khong qua T27 ky tu. Hay de xuat cau truc du lieu thich hop de luu tru trong bo
nho trong cua may tinh tan suat xuat hien cua cac tu trong tap tin van ban nay. Voi
cau truc du lieu nay, hay trnh bay thuat toan va cai dat chuong trnh thuc hien viec
thong ke xem cac tu trong file van ban xuat hien voi tan suat nhu the nao Cho biet
van ban co bao nhieu tu, bao nhieu ten tu
5. Cac van ban duoc luu tru thanh tung dong tren cac file van ban, moi dong co chieu
dai khong qua T27 ky tu. Hay de xuat cau truc du lieu thich hop de luu tru trong bo
nho trong cua may tinh cac dong van ban trong tap tin van ban nay (co the bo nho
khong du de luu toan bo noi dung tap tin van ban nay vao trong bo nho trong cua
may tinh). Voi cau truc du lieu nay, hay trnh bay thuat toan va cai dat chuong trnh
thuc hien viec hien noi tap tin van ban nay theo tung trang man hnh sao cho chung
ta co the su dung cac phim PgGp/PgDn de lat len/xuong theo tung trang man hnh va
su dung cac phim Gp-arrow/Down-arrow de cho troi len/xuong tung dong van ban
tren man hnh Cho biet van ban co bao nhieu dong
6. Hay su dung cau truc du lieu thich hop de luu tru cac ma tran thua (ma tran ma chu
yeu gia tr cac phan t bang 0) trong bo nho trong cua may tinh. Voi cau truc du lieu
nay, hay trnh bay thuat toan va cai dat chuong trnh thuc hien viec cong, tru, nhan
hai ma tran thua voi nhau, tao ma tran thua chuyen v tu mot ma tran thua khac.
T. Hay su dung cau truc du lieu thich hop de luu tru Cia pha cua mot dong ho nao do
trong bo nho trong cua may tinh. Voi cau truc du lieu nay, hay trnh bay thuat toa n
va cai dat chuong trnh thuc hien viec kiem tra xem 02 nguoi co ten la X va Y co
phai la hai anh em ruot hay khong Heu khong phai th ai co vai ve cao hon Cia
su rang moi cap vo chong co khong qua 05 nguoi con.
8. Hay su dung cau truc du lieu thich hop de luu tru mot he thong Menu co nhieu muc
chon, nhieu cap trong bo nho trong cua may tinh. Voi cau truc du lieu nay, hay trnh
bay thuat toan va cai dat chuong trnh thuc hien viec cho menu xuat hien tren man
hnh va cho phep nguoi su dung chon mot chuc nang nao do cua menu.
9. Ket hop cau truc du lieu o trong bai tap va 4, 5 va 8. Hay trnh bay thuat toan va cai
dat chuong trnh thuc hien cac chuc nang cua mot phan mem soan thao van ban
don gian
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 228
10. Hay su dung cau truc du lieu thich hop de luu tru cac tu cua mot tu dien vao trong
tap tin co ten DlCT.DAT. Thong tin giai nghia ve mot tu bao gom: Ten tu, Loai tu
(Danh t, ong t, tnh t, ), nghia tieng Viet.
a) Su dung tap tin ch muc de liet ke cac tu theo thu tu Alphabet (A -> Z).
b) Hay de xuat cau truc du lieu thich hop de luu tru trong bo nho trong cua may tinh
thong tin giai nghia cua cac tu trong tap tin DlCT.DAT nay (co the bo nho khong
du de luu toan bo noi dung tap tin DlCT.DAT nay vao trong bo nho trong cua may
tinh). Voi cau truc du lieu nay, hay trnh bay thuat toan va cai dat chuong trnh
thuc hien viec tra nghia cho mot tu. Hgoai ra, ta co the su dung cac phim
PgGp/PgDn de lat len/xuong theo tung trang (do mnh quy dnh) man hnh va su
dung cac phim Gp-arrow/Down-arrow de cho troi len/xuong tung tu tren man
hnh Su dung cau truc du lieu thich hop de luu tru trong bo nho trong cac tu da
duoc tra nghia.
11. Hguoi ta luu tru cac he so cua mot da thuc bac n thanh cac dong van ban trong file
DATHGC.DAT theo nguyen tac: Moi dong la he so va so mu cua T da thuc va cac he
so va so mu nay cach nhau it nhat la mot khoang trang.
Hay su dung cau truc du lieu thich hop de luu tru mot da thuc vao trong bo nho
trong cua may tinh. Voi cau truc du lieu nay, hay trnh bay thuat toan va cai dat
chuong trnh thuc hien cac cong viec sau:
- Xuat cac da thuc trong file DATHGC.DAT ra man hnh;
- Tinh da thuc tong, da thuc hieu cua cac da thuc nay;
- Tinh da thuc tich cua cac da thuc nay.
12. Mot hnh vuong co do dai canh la a duoc to 02 mau: trang va den. Hguoi ta tien
hanh chia hnh vuong nay thanh 04 hnh vuong con deu nhau va ghi nhan v tri cua
chung trong hnh vuong lon. Heu trong moi hnh vuong con ch gom toan mau trang
hoac mau den th giu nguyen, con neu trong hnh vuong con con co 02 mau th tiep
tuc chia hnh vuong con nay thanh 04 hnh vuong con nho hon va ghi nhan v tri, ,
cu nhu vay sau mot so huu han phep chia se ket thuc viec chia. Hay su dung cau
truc du lieu thich hop de luu tru cac hnh vuong nay vao trong bo nho trong cua may
tinh. Voi cau truc du lieu lua chon, hay trnh bay thuat toan va cai dat chuong trnh
thuc hien cac cong viec sau:
- Tinh tong so hnh vuong tao thanh qua cac lan chia.
- Tinh tong so hnh vuong mau trang, mau den va tong dien tich tuong ung cua
chung.
- Tai tao lai hnh vuong ban dau.
13. nh nghia cau truc du lieu thich hop de luu tru cac gia tr trong tam giac Pascal
vao trong bo nho trong cua may tinh. Voi cau truc du lieu nay hay trnh bay thuat
toan va viet chuong trnh thuc hien cac cong viec sau:
- ln tam giac Pascal co H dong ra man hnh.
- ln va tinh gia tr bieu thuc (a+b)
H
ra man hnh.
14. Trnh bay thuat toan va viet chuong trnh thuc hien cong viec minh hoa (Demo) qua
trnh thuc hien tat ca cac thuat toan da hoc.
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns
Giao trnh: Cau Truc D Lieu va Giai Thuat
Trang: 229
IV. HUCNG DAN SU DUNG TAI LIE U THAM KHA C
1. Cau truc du Iieu
Tac gia: Hguyen Trung Truc
Khoa CHTT, truong HBK TP.HCM
2. Giao trnh Cau truc du Iieu 1
Tac gia: Tran Hanh Hhi Duong Anh uc
Khoa CHTT, truong HKHTH HC TP.HCM
3. AIgorithms + Data Structures = Programs
Tac gia: H.Wirth
HXB: Prentice Hall, T976
4. Data Structures and AIgorithms
Tac gia: Alfred V.Aho - John E.Hopcroft Jeffrey D.Gllman
HXB: Addison-Wesley Publishing Company
5. AIgorithms (Second Edition)
Tac gia: Pobert Sedgewick
HXB: Addison-Wesley Publishing Company
6. Data Structures and Program Design (Third Edition)
Tac gia: Pobert L.Kruse
HXB: Prentice Hall
Smi t h Ngu y en St u d i o.
ht t p:/ / gg.gg/ sns

You might also like