1. Trang chủ
  2. » Công Nghệ Thông Tin

Bài giảng cấu trúc dữ liệu thuật toán chương 6 nguyễn đức nghĩa

85 263 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 85
Dung lượng 1,46 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

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 4

th 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 5

Tình hu ng 2: list[mid] < target

target

New list:

Trang 6

Cà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 7

Thu 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 9

t 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 10

Tí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 12

6.2.2 Bi u di n BST

12

54

3

1 right left

66

right

right right

right

p

p p

Trang 13

struct 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 14

struct TreeNodeRec* leftPtr;

struct TreeNodeRec* rightPtr;

struct TreeNodeRec* leftPtr;

struct TreeNodeRec* rightPtr;

Trang 15

Ví 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 16

struct 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 17

struct 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 18

Mô 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 19

37

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 21

Duy 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 22

Successorc 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 23

Tì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 24

Ví 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 27

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

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 28

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

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 29

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

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 30

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

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 31

Duy 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 32

Duy 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 33

53

6457

7559

48

53

6457

7559

70

49

Trang 34

53

6457

7559

48

53

6457

7559

70

49

Inorder: 37,

Nguy n c Ngh a - B môn KHMT HBKHN

Trang 35

53

6457

7559

48

53

6457

7559

70

49

Inorder: 37, 39, 48

Trang 36

53

6457

7559

48

53

6457

7559

70

49

Inorder: 37, 39, 48

Nguy n c Ngh a - B môn KHMT HBKHN

Trang 37

53

6457

7559

48

53

6457

7559

70

49

Inorder: 37, 39, 48, 49, 53

Trang 38

53

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 39

53

6457

7559

48

53

6457

7559

70

49

Inorder: 37, 39, 48, 49, 53, 55

Trang 40

53

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 41

53

6457

7559

48

53

6457

7559

70

49

Inorder: 37, 39, 48, 49, 53, 55, 57, 59, 64

Trang 42

53

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 43

53

6457

7559

48

53

6457

7559

70

49

Inorder: 37, 39, 48, 49, 53, 55, 57, 59, 64, 70, 75

Trang 44

Chè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 45

x

So sánh 32 và 25 duy t ti p cây con ph i

40

3512

20

25

x y

32

3512

Trang 48

rootPtr = 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 49

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

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 50

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

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 51

Deletion: 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 52

Deletion: 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 53

Deletion: Tình hu ng 4

Tình hu ng 4: nút x có hai con

r x

Trang 54

Xoá 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 56

S p x p dãy sau nh s d ng BST

Nguy n c Ngh a - B môn KHMT HBKHN

Trang 57

S p x p dãy sau nh s d ng BST

0.5

Trang 60

l 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 61

6.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 62

Tí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 63

AVL 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).

Ngày đăng: 04/12/2015, 17:49

TỪ KHÓA LIÊN QUAN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm