Tình hu ng 2: list[mid] < targettarget New list:... struct TreeNodeRec { int key; struct TreeNodeRec* leftPtr; struct TreeNodeRec* rightPtr; }; typedef struct TreeNodeRec TreeNode; Binar
Trang 4th i gian tính t t nh t c a thu t toán là (1).
N u target không có m t trong dãy đã cho, thì phép so sánh (*)
ph i th c hi n n l n Vì th th i gian tính t i nh t c a thu t toán là
(n).
7 Nguy n c Ngh a - B môn KHMT HBKHN
Phân tích th i gian tính
Cu i cùng, ta tính th i gian tính trung bình c a thu t toán N u
target tìm th y v trí th i c a dãy (target = a[i]) thì phép so
Trang 5Tình hu ng 2: list[mid] < target
target
New list:
Trang 6Cài đ t trên C
11
int binarySearch(float array[], int size, int target) {
int lower = 0, upper = size - 1, mid;
while (lower <= upper) {
mid = (upper + lower)/2;
B ba (a1, a2, a3) đ c g i là đi tr c b ba (b1, b2, b3) trong th t t đi n n u
nh m t trong ba đi u ki n sau đây đ c th c hi n:
• Yêu c u: Hãy ki m tra xem dãy s nguyên cho tr c có ph i là dãy c p ba hay
không N u câu tr l i là kh ng đ nh hãy đ a ra b ba c p s c ng t ng đ u tiên trong th t t đi n
12 Nguy n c Ngh a - B môn KHMT HBKHN
Trang 7Thu t toán tr c ti p
• S p x p dãy a[1 n] theo th t không gi m
• Duy t t t c các b ba a[i], a[j], a[k], 1 <= i < j < k <= n
} }
}
• Th i gian tính: O(n3)
13 Nguy n c Ngh a - B môn KHMT HBKHN
Thu t toán nhanh h n
• S p x p dãy a[1 n] theo th t không gi m
• V i m i b
(a[i], a[j]), i=1, , n-2; j=i+1, , n-1, tìm ki m nh phân giá tr key =2*a[j]-a[i] trong kho ng
t j+1 đ n n N u tìm th y thì (a[i], a[j], a[k]) là m t b
ba tho mãn đi u ki n đ u bài.
• B ba đ u tiên tìm đ c s là b ba c n đ a ra N u không tìm đ c b ba nào thì dãy đã cho không là dãy
c p ba.
• Th i gian tính: O(n2 log n)
Trang 9t v n đ
Ta xây d ng c u trúc đ bi u di n các t p bi n đ ng (dynamic sets)
Các ph n t có khoá (key) và thông tin đi kèm ( satellite data)
T p đ ng c n h tr các truy v n (queries) nh :
Search(S, k): Tìmph n t có khoá k
Minimum(S), Maximum(S): Tìmph n t có khoá nh nh t, l n nh t
Predecessor(S, x), Successor(S, x): Tìm ph n t k c n tr c, k c n sau
đ ng th i c ng h tr các thao tác bi n đ i (modifying operations) nh :
6.2.1 nh ngh a cây nh phân tìm ki m
Binary Search Trees
Cây nh phân tìm ki m (s vi t t t là BST) là cây nh phân có cáctính ch t sau:
– M i nút x (ngoài thông tin đi kèm) có các tr ng:
• left : contr đ n con trái
• right: contr đ n con ph i,
• parent: contr đ n cha (tr ng này là tu ch n), và
• key: khoá (th ng gi thi t là khoá c a các nút là khác nhau t ng đôi,
trái l i n u có khoá trùng nhau thì c n ch rõ th t c a hai khoá trùng nhau).
key left right parent
Trang 10Tính ch t BST
– Tính ch t BST (Binary-search-tree property):
Gi s x là g c c a m t cây con:
• y thu c cây con trái c a x: key(y) < key(x).
• y thu c cây con ph i c a x: key(y) > key(x).
(T t c các khoá c a các nút trong cây con trái (ph i) c a x
đ u nh h n (l n h n) khoá c a x.)
x
M i nút y trong cây con trái
đ u có key(y) < key(x) M i nút y trong cây con ph i đ u có key(y) > key(x)
19 Nguy n c Ngh a - B môn KHMT HBKHN
Trang 126.2.2 Bi u di n BST
12
54
3
1 right left
66
right
right right
right
p
p p
Trang 13struct TreeNodeRec
{
int key;
struct TreeNodeRec* leftPtr;
struct TreeNodeRec* rightPtr;
};
typedef struct TreeNodeRec TreeNode;
Binary Search Tree Node
struct TreeNodeRec* leftPtr;
struct TreeNodeRec* rightPtr;
};
typedef struct TreeNodeRec TreeNode;
Trang 14struct TreeNodeRec* leftPtr;
struct TreeNodeRec* rightPtr;
struct TreeNodeRec* leftPtr;
struct TreeNodeRec* rightPtr;
Trang 15Ví d 4 Thông tin đi kèm:
typedef struct BookRec Book;
Gi s thông tin v sách đ c ghi nh n trong các b n ghi có c u trúc nh sau
khoá
Trang 16struct TreeNodeRec
{
Book info;
struct TreeNodeRec* leftPtr;
struct TreeNodeRec* rightPtr;
};
typedef struct TreeNodeRec TreeNode;
Ví d 4: Khi đó ta có th mô t Binary Search Tree Node nh sau
Trang 17struct TreeNodeRec* leftPtr;
struct TreeNodeRec* rightPtr;
• makeTreeNode( value) - T o m t nút v i khoá cho b i value
• search(nodePtr, k) - Tìm ki m nút có giá tr khoá b ng k trên BST tr b i
nodePtr
• find_min(nodePtr): Tr l i nút có khoá nh nh t trên BST tr b i nodePtr
• find_max: Tr l i nút có khoá l n nh t trên BST tr b i nodePtr
• Ngoài ra có th s d ng các hàm c b n đ i v i cây nh phân nh :
– void printInorder( nodePtr); void printPreorder( nodePtr);
– void printPostorder( nodePtr);
Trang 18Mô t trên C
struct TreeNodeRec
{
float key;
struct TreeNodeRec* leftPtr;
struct TreeNodeRec* rightPtr;
};
typedef struct TreeNodeRec TreeNode;
TreeNode* makeTreeNode(float value);
TreeNode* insert(TreeNode* nodePtr, float item);
TreeNode* search(TreeNode* nodePtr, float item);
void printInorder(const TreeNode* nodePtr);
void printPreorder(const TreeNode* nodePtr);
void printPostorder(const TreeNode* nodePtr);
35 Nguy n c Ngh a - B môn KHMT HBKHN
Trang 1937
TreeNode* makeTreeNode(float value) {
TreeNode* newNodePtr = NULL;
1
94
7
• tìm ph n t l n nh t trên BST, ta đi theo con ph i cho đ n khi g p NULL.
5
Trang 21Duy t BST theo th t gi a
5030
K c n tr c và K c n sau Predecessor and Successor
• K c n sau (Successor) c a nút x là nút y sao cho key[y] là khoá
nh nh t còn l n h n key[x].
• K c n sau c a nút v i khoá l n nh t là NIL
• K c n tr c (Predcessor) c a nút x là nút y sao cho key[y] là khoá
l n nh t còn nh h n key[x].
• K c n tr c c a nút v i khoá nh nh t là NIL
• Vi c tìm ki m k c n sau/tr c đ c th c hi n mà không c n th c
hi n so sánh khoá
Trang 22Successorc a x
là nút trái nh t trong cây con ph i c a nó
Tìm k c n sau
Có hai tình hu ng
1) N u x có con ph i thì k c n sau c a x s là nút y v i khoá key[y]
nh nh t trong cây con ph i c a x (nói cách khác y là nút trái nh t
trong cây con ph i c a x).
tìm y cóth dùng find-min(x->rightPtr): y= find-min(x->rightPtr)
ho c b t đ u t g c c a cây con ph i luôn đi theo con trái đ n khi g p nút
không có con trái chính là nút yc n tìm.
2) N u x không có con ph i thì k c n sau c a x là t tiên g n nh t
có con trái ho c là x ho c là t tiên c a x. tìm k c n sau:
B t đ u t x c n di chuy n lên trên (theo con tr parent) cho đ n khi g p nút
y có con trái đ u tiên thì d ng: y là k c n sau c a x.
N u không th di chuy n ti p đ c lên trên (t c là đã đ n g c) thì x là nút
l n nh t (và vì th x không có k c n sau).
44 Nguy n c Ngh a - B môn KHMT HBKHN
Trang 23Tìm k c n tr c
T ng t nh tìm k c n sau, có hai tình hu ng
N u x có con trái thì k c n tr c c a x s là nút y v i khoá key[y]
l n nh t trong cây con trái c a x (nói cách khác y là nút ph i nh t
nh t trong cây con trái c a x):
y = find_max(x->leftPtr)
N u x không có con trái thì k c n tr c c a x là t tiên g n nh t
có con ph i ho c là x ho c là t tiên c a x.
45 Nguy n c Ngh a - B môn KHMT HBKHN
Thu t toán tìm ki m trên BST
• N u khoá c n tìm nh h n khoá c a nút hi n t i thì ti p t c tìm ki m cây con trái
• Trái l i, n u khoá c n tìm là l n h n khoá c a nút
hi n t i, thì ti p t c tìm ki m cây con ph i
• K t qu c n đ a ra:
– n u tìm th y (ngh a là khoá c n tìm là b ng khoá c anút hi n t i), thì tr l i con tr đ n nút ch a khoá c ntìm
– ng c l i, tr l i con tr NULL
Trang 24Ví d : Tìm ki m trên BST
5030
Trang 26} /* … các l nh khác … */
nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
2.7 1.4
1.9
0.4 0.7
0.8 0.3
0.6
Find 0.7
nodePtr
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 27nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
2.7 1.4
1.9
0.4 0.7
0.8 0.3
nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
}
1.0
1.8 1.1
2.7 1.4
1.9
0.4 0.7
0.8 0.3
0.6
Find 0.7
nodePtr
Trang 28nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
2.7 1.4
1.9
0.4 0.7
0.8 0.3
nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
2.7 1.4
1.9
0.4 0.7
0.8 0.3
0.6
Find 0.5
nodePtr
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 29nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
2.7 1.4
1.9
0.4 0.7
0.8 0.3
nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
}
1.0
1.8 1.1
2.7 1.4
1.9
0.4 0.7
0.8 0.3
0.6
Find 0.5
nodePtr
Trang 30nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
2.7 1.4
1.9
0.4 0.7
0.8 0.3
nodePtr = search(nodePtr->leftPtr, target);
else if (target > nodePtr->key)
nodePtr = search(nodePtr->rightPtr, target);
2.7 1.4
1.9
0.4 0.7
0.8 0.3
0.6
Find 0.5
nodePtr
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 31Duy t theo th t gi a (Inorder)
• Duy t theo th t gi a c a BST luôn cho dãy các khoá
}
Trang 32Duy t theo th t gi a (Inorder)
48
53
6457
7559
48
53
6457
7559
70
49
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 3353
6457
7559
48
53
6457
7559
70
49
Trang 3453
6457
7559
48
53
6457
7559
70
49
Inorder: 37,
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 3553
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48
Trang 3653
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 3753
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48, 49, 53
Trang 3853
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48, 49, 53, 55
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 3953
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48, 49, 53, 55
Trang 4053
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48, 49, 53, 55, 57, 59
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 4153
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48, 49, 53, 55, 57, 59, 64
Trang 4253
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48, 49, 53, 55, 57, 59, 64, 70
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 4353
6457
7559
48
53
6457
7559
70
49
Inorder: 37, 39, 48, 49, 53, 55, 57, 59, 64, 70, 75
Trang 44Chèn và Xoá trên BST
87 Nguy n c Ngh a - B môn KHMT HBKHN
158
30
15
88 Nguy n c Ngh a - B môn KHMT HBKHN
Trang 45x
So sánh 32 và 25 duy t ti p cây con ph i
40
3512
20
25
x y
32
3512
Trang 48rootPtr = insert(rootPtr, item) ; }
else if (item < nodePtr->key)
nodePtr->leftPtr = insert(nodePtr->leftPtr, item);
else if (item > nodePtr->key)
nodePtr->rightPtr = insert(nodePtr->rightPtr, item);
return nodePtr;
}
1.0
1.8 1.1
2.7 1.4
1.9
0.4 0.7
0.8 0.3
0.6
Insert 0.9
nodePtr
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 49else if (item < nodePtr->key)
nodePtr->leftPtr = insert(nodePtr->leftPtr, item);
else if (item > nodePtr->key)
nodePtr->rightPtr = insert(nodePtr->rightPtr, item);
return nodePtr;
}
1.0
1.8 1.1
2.7 1.4
1.9
0.4 0.7
0.8 0.3
else if (item < nodePtr->key)
nodePtr->leftPtr = insert(nodePtr->leftPtr, item);
else if (item > nodePtr->key)
nodePtr->rightPtr = insert(nodePtr->rightPtr, item);
1.0
1.8 1.1
2.7 1.4
1.9
0.4 0.7
0.8 0.3
0.6
Insert 0.9
nodePtr
Trang 50else if (item < nodePtr->key)
nodePtr->leftPtr = insert(nodePtr->leftPtr, item);
else if (item > nodePtr->key)
nodePtr->rightPtr = insert(nodePtr->rightPtr, item);
return nodePtr;
}
1.0
1.8 1.1
2.7 1.4
1.9
0.4 0.7
0.8 0.3
else if (item < nodePtr->key)
nodePtr->leftPtr = insert(nodePtr->leftPtr, item);
else if (item > nodePtr->key)
nodePtr->rightPtr = insert(nodePtr->rightPtr, item);
return nodePtr;
}
1.0
1.8 1.1
2.7 1.4
1.9
0.4 0.7
0.8 0.3
Trang 51Deletion: Tình hu ng 1
Tình hu ng 1: Nút c n xoá x là lá (leaf node)
Thao tác: ch a l i nút cha c a x có con r ng.
25
2017
4530
x
Trang 52Deletion: Tình hu ng 2
Tình hu ng 2: nút c n xoá x có con trái mà không có con ph i
Thao tác: g n cây con trái c a x vào cha
25
2017
4530
Deletion: Tình hu ng 3
Tình hu ng 3: nút c n xoá x có con ph i mà không có con trái
Thao tác: g n cây con ph i c a x vào cha
25
2017
Trang 53Deletion: Tình hu ng 4
Tình hu ng 4: nút x có hai con
r x
Trang 54Xoá ph n t có key = x
TreeNode* delete(TreeNode * T, float x) {
TreeNode tmp;
if (T == NULL) printf("Not found\n");
else if (x < T- >key) /* đi bên trái */
ho c không có con */
T = T->rightPtr;
else
if (T->rightPtr == NULL) /* ch có con trái */
T = T->leftPtr;
free(tmp);
} return(T);
}
107 Nguy n c Ngh a - B môn KHMT HBKHN
108
S p x p nh s d ng BST
s p x p dãy ph n t ta có th th c hi n nh sau:
• B sung (insert) các ph n t vào cây nh phân tìm ki m.
• Duy t BST theo th t gi a đ đ a ra dãy đ c s p x p.
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 56S p x p dãy sau nh s d ng BST
Nguy n c Ngh a - B môn KHMT HBKHN
Trang 57S p x p dãy sau nh s d ng BST
0.5
Trang 60l i nó (Splay Trees [Tarjan])
ph c t p c a các thao tác v i BST
120 Nguy n c Ngh a - B môn KHMT HBKHN
Trang 616.3 Cây AVL
nh ngh a Cây AVL là cây nh phân tìm ki m tho mãn
tính ch t AVL sau đây: chi u cao c a cây con trái và cây
con ph i c a g c ch sai khác nhau không quá 1 và c cây con trái và cây con ph i đ u là cây AVL.
Ví d :
AVL
AVL
AVL AVL
Trang 62Tính ch t AVL
123
Tính ch t AVL (tính ch t cân b ng):
Chênh l ch gi a đ cao c a cây con trái và đ cao c a
cây con ph i c a m t nút b t k trong cây là không quá 1.
Chú ý:Cây nh phân đ y đ và hoàn ch nh có tính ch t này, nh ng cây có tính
ch t AVL không nh t thi t ph i là đ y đ hay hoàn ch nh
8
104
2 6
(nút 8 và 12 khôngtho mãn t/c AVL)
Trang 63AVL Trees
• Cây AVL (Adelson-Velskii và Landis, 1962):
– là cây BST đ c gi sao cho luôn tr ng thái cân b ng (cân
đ i)
– Ý ch đ o: N u vi c b sung hay lo i b d n đ n m t tính cân
b ng c a cây thì c n ti n hành khôi ph c ngay l p t c
– Các thao tác: tìm ki m, b sung, lo i b đ u có th th c hi n
v i cây AVL có n nút trong th i gian O(log n) (c trong tình
hu ng trung bình l n t i nh t!)
125 Nguy n c Ngh a - B môn KHMT HBKHN
u đi m và nh c đi m c a cây AVL
u đi m c a cây AVL:
1. Th i gian tìm ki m là O(log n) và cây AVL luôn là cân b ng.
2. Thao tác B sung và Lo i b c ng ch t n th i gian O(log n)
3 Vi c khôi ph c cân b ng không quá t n kém.
Nh c đi m c a vi c s d ng cây AVL:
1 Khó cài đ t và g r i; c n thêm b nh cho y u t cân b ng.
2 Th i gian là nhanh h n ti m c n nh ng t n th i gian khôi ph c cân b ng.
3 Vi c tìm ki m v i d li u l n th ng th c hi n trên c s d li u trên đ a
và khi đó ng i ta s d ng các c u trúc khác (ví d , B-trees).
4. Có th ch p nh n th i gian O(n) đ i v i vài thao tác riêng l , n u nh t ng
th i gian th c hi n nhi u thao tác khác l i là nhanh (ví d , s d ng cây d t
- Splay trees).
Trang 65 B ng b m (hash table) là cách ti p c n gi i quy t v n đ đ t ra.
Trong m c này ta s ch xét khoá là các s nguyên d ng (có th
r t l n)
129 Nguy n c Ngh a - B môn KHMT HBKHN
ng d ng
Xây d ng ch ng trình d ch c a ngôn ng l p trình (Compiler):
Ta c n thi t l p b ng ký hi u trong đó khoá c a các ph n t là dãy
ký t t ng ng v i các t đ nh danh (identifiers) trong ngôn ng
l p trình
B ng b m là c u trúc d li u hi u qu đ cài đ t các t đi n(dictionaries)
M c dù trong tình hu ng x u nh t vi c tìm ki m đòi h i th i gian
O(n) gi ng nh danh sách móc n i, nh ng trên th c t b ng b mlàm vi c hi u qu h n nhi u V i m t s gi thi t khá h p lý, vi ctìm ki m ph n t trong b ng b m đòi h i th i gian O(1).
B ng b m có th xem nh s m r ng c a m ng thông th ng
Vi c đ a ch hoá tr c ti p trong m ng cho phép truy nh p đ n ph n
t b t k trong th i gian O(1).