SlideShare a Scribd company logo
Cấu trúc dữ liệu và thuật giải
Tìm kiếm
Tìm kiếm
• Tìm kiếm tuần tự
• Thời gian tồi nhất là n
• Chúng tôi có Độ phức tạp O(n)
• Ứng dụng cho mảng (không sắp xếp) và danh
sách liên kết
• Tìm kiếm nhị phân
• Ứng dụng cho dãy đã sắp xếp
• Thời gian thực hiện thuật toán log2 n
• Độ phức tạp tính toán O(log n)
Tìm kiếm – Tìm kiếm nhị phân
• Tạo ra một dãy đã sắp xếp
• Bổ xung vào danh sách liên kết
(AddToCollection)
• Bổ xung giá trị vào các vị trí đúng
• Tìm vị trí c1 log2 n
• Duyệt xuống c2 n
• Tổng quát c1 log2 n + c2 n
Hoặc c2 n
• Mỗi hoạt động gắn với dãy đã sắp xếp O(n)
? Chúng tôi có thể duy trì một dãy đã sắp
xếp với các hoạt động chèn dẻ hơn?
Dominant
term
Cây
• Cây nhị phân
• Bao gồm
• Node
• Các cây con trái và cây con phải
• Cả hai cây con đều là cây nhị phân
Cây
• Cây nhị phân
• Bao gồm
• Node
• Các cây con trái và con phải
• Cả hai đều là cây nhị phân
Chú ý
Định nghĩa
đệ qui!
Mỗi cây con
Là một cây
Nhị phân
Cây – Thủ tục
• Cấu trúc dữ liệu
struct t_node {
void *item;
struct t_node *left;
struct t_node *right;
};
typedef struct t_node *Node;
struct t_collection {
Node root;
……
};
Cây – Thủ tục
• Tìm (Find )
extern int KeyCmp( void *a, void *b );
/* Returns -1, 0, 1 for a < b, a == b, a > b */
void *FindInTree( Node t, void *key ) {
if ( t == (Node)0 ) return NULL;
switch( KeyCmp( key, ItemKey(t->item) ) ) {
case -1 : return FindInTree( t->left, key );
case 0: return t->item;
case +1 : return FindInTree( t->right, key );
}
}
void *FindInCollection( collection c, void *key ) {
return FindInTree( c->root, key );
}
Less,
search
left
Greater,
search right
Cây – Thủ tục
• Find
• key = 22;
if ( FindInCollection( c , &key ) ) ….
n = c->root;
FindInTree( n, &key );
FindInTree(n->right,&key );
FindInTree(n->left,&key );
return n->item;
Cây – hoạt động
• Find
• Cây hoàn toàn
• Chiều cao, h
• Các node di truyển trên một con đường từ gốc đến
một lá
• Số các node, h
• n = 1 + 21 + 22 + … + 2h = 2h+1 - 1
• h = floor( log2 n )
Cây – Hoạt động
• Find
• Cây hoàn toàn
• Vì chúng tôi cần nhiều nhât h+1 phép so sánh,
độ phức tạp O(h+1) hoặc O(log n)
• Giống như tìm kiếm nhị phân
Tổng kết
Arrays
Đơn giản, nhanh
Không mềm dẻo
O(1)
O(n) inc sort
O(n)
O(n)
O(logn)
Tìm kiếm nhị phân
Add
Delete
Find
Linked List
Đơn giản
Mềm dẻo
O(1)
sort -> no adv
O(1) - any
O(n) - specific
O(n)
(không tìm kiếm
nhị phân)
Trees
Vẫn đơn giản
Mềm dẻo
O(log n)
Cây – Bổ xung (Addition)
• Cộng 21 vào cây
• Chúng tôi cần tối đa h+1 phép so sánh
• Tạo một node mới (thời gian là hằng số)
add lấy c1(h+1)+c2 hoặc c log n
• Vì thế việc bổ xung vào một cây cũng chiếm
thời gian là log n
Ignoring
low order
terms
Cây - Addition – thủ tục
static void AddToTree( Node *t, Node new ) {
Node base = *t;
/* If it's a null tree, just add it here */
if ( base == NULL ) {
*t = new; return; }
else
if( KeyLess(ItemKey(new->item),ItemKey(base->item)) )
AddToTree( &(base->left), new );
else
AddToTree( &(base->right), new );
}
void AddToCollection( collection c, void *item ) {
Node new, node_p;
new = (Node)malloc(sizeof(struct t_node));
/* Attach the item to the node */
new->item = item;
new->left = new->right = (Node)0;
AddToTree( &(c->node), new );
}
Cây – Bổ xung (Addition)
• Find c log n
• Add c log n
• Delete c log n
• Hiệu quả rất đáng kể!
• Tuy nhiên vẫn bắt gặp một số trường hợp
………..
Cây – Bổ xung (Addition)
• Lấy danh sách ký tự này và hình thành một
cây
A B C D E F
• ??
Trees - Addition
• Nhận danh sách ký tự này và hình thành
một cây A B C D E F
• Trong trường hợp này:
? Find
? Add
? Delete

More Related Content

DOCX
Bai tap c++
PDF
Chứng minh số node của Heap chiều cao h
PDF
12 vidu baitap_c
PDF
030 cpp streams
DOC
Bt c cpp_0021
PPTX
Chương 2: Ngôn ngữ PHP
PPTX
Chương 3: Tạo web động
PDF
C8 object-oriented thinking
Bai tap c++
Chứng minh số node của Heap chiều cao h
12 vidu baitap_c
030 cpp streams
Bt c cpp_0021
Chương 2: Ngôn ngữ PHP
Chương 3: Tạo web động
C8 object-oriented thinking

Viewers also liked (14)

PDF
Bai6 stacks
PDF
Bai5 dsachlket
PDF
Chuong 2 co so phan tich do phuc tap cua giai thuat - sinh vien 2
PDF
Chuong7
PDF
Lect04 functions
DOCX
Bài tập CTDL và GT 9
PDF
Ctdl 2005 chuong 1
PDF
Chuong3 c
DOC
Bài tập CTDL và GT 13
PDF
Bài tập CTDL và GT 7
DOCX
Bài tập CTDL và GT 6
DOC
Bài tập CTDL và GT 3
PDF
Nguyen lyoop
PPTX
Ppresentacion eu
Bai6 stacks
Bai5 dsachlket
Chuong 2 co so phan tich do phuc tap cua giai thuat - sinh vien 2
Chuong7
Lect04 functions
Bài tập CTDL và GT 9
Ctdl 2005 chuong 1
Chuong3 c
Bài tập CTDL và GT 13
Bài tập CTDL và GT 7
Bài tập CTDL và GT 6
Bài tập CTDL và GT 3
Nguyen lyoop
Ppresentacion eu
Ad

Similar to Bai7 timkiemnhiphan (17)

PDF
Baigiang ctdl
PDF
Bai3 timkiemsapxep
PDF
Bai3 timkiem sapxep
PPT
Chuong 2 Tim Kiem N Sap Xep
PPT
Chuong 2 Tim Kiem N Sap Xep
PPT
Ctdl c4-cay
PPT
Ctdl c4-cay
PPTX
Cấu Trúc Dữ Liệu_Baigiang4_Danh sách liên kết.pptx
PPT
Ctdl C10
PDF
CacSoDoThuatToan Mon cấu trúc dữ liệu và giải thuật
PPT
Ctdl C07
PPT
3_Chiavatri.pptdfasfasffafasdfasfasffaasd
PPTX
Cấu trúc dữ liệu và giải thuật Bai 2_Ky Thuat Tim Kiem.pptx
PPT
Ctdl C11
PDF
Cau truc du lieu va giai thuat - cay nhi phan
PPT
Ctdl C05
PDF
Chuong 5 cau truc du lieu cay
Baigiang ctdl
Bai3 timkiemsapxep
Bai3 timkiem sapxep
Chuong 2 Tim Kiem N Sap Xep
Chuong 2 Tim Kiem N Sap Xep
Ctdl c4-cay
Ctdl c4-cay
Cấu Trúc Dữ Liệu_Baigiang4_Danh sách liên kết.pptx
Ctdl C10
CacSoDoThuatToan Mon cấu trúc dữ liệu và giải thuật
Ctdl C07
3_Chiavatri.pptdfasfasffafasdfasfasffaasd
Cấu trúc dữ liệu và giải thuật Bai 2_Ky Thuat Tim Kiem.pptx
Ctdl C11
Cau truc du lieu va giai thuat - cay nhi phan
Ctdl C05
Chuong 5 cau truc du lieu cay
Ad

More from Hồ Lợi (20)

PDF
Xu ly chuoi
DOC
Tóm tắt các hàm chuẩn của c
PDF
DOC
Ky thuatkhudequy
PDF
Itt epc assignment
DOC
Huong danontapc
DOC
H hai epc_baitap
PDF
Gtrinh oop
PDF
Giaotrinhbaitapkythuatlaptrinh
PDF
Giao trinh ky thuat lap trinh 2
PDF
Giao trinh c c++
PDF
File trong c_
PDF
Epc assignment
PDF
Epc test practical
DOC
De thic++ --th
DOC
Dethi c++ -lt
PDF
Debug trong c
PDF
D05 stl
PDF
Cpl test3
PDF
Cpl test2
Xu ly chuoi
Tóm tắt các hàm chuẩn của c
Ky thuatkhudequy
Itt epc assignment
Huong danontapc
H hai epc_baitap
Gtrinh oop
Giaotrinhbaitapkythuatlaptrinh
Giao trinh ky thuat lap trinh 2
Giao trinh c c++
File trong c_
Epc assignment
Epc test practical
De thic++ --th
Dethi c++ -lt
Debug trong c
D05 stl
Cpl test3
Cpl test2

Bai7 timkiemnhiphan

  • 1. Cấu trúc dữ liệu và thuật giải Tìm kiếm
  • 2. Tìm kiếm • Tìm kiếm tuần tự • Thời gian tồi nhất là n • Chúng tôi có Độ phức tạp O(n) • Ứng dụng cho mảng (không sắp xếp) và danh sách liên kết • Tìm kiếm nhị phân • Ứng dụng cho dãy đã sắp xếp • Thời gian thực hiện thuật toán log2 n • Độ phức tạp tính toán O(log n)
  • 3. Tìm kiếm – Tìm kiếm nhị phân • Tạo ra một dãy đã sắp xếp • Bổ xung vào danh sách liên kết (AddToCollection) • Bổ xung giá trị vào các vị trí đúng • Tìm vị trí c1 log2 n • Duyệt xuống c2 n • Tổng quát c1 log2 n + c2 n Hoặc c2 n • Mỗi hoạt động gắn với dãy đã sắp xếp O(n) ? Chúng tôi có thể duy trì một dãy đã sắp xếp với các hoạt động chèn dẻ hơn? Dominant term
  • 4. Cây • Cây nhị phân • Bao gồm • Node • Các cây con trái và cây con phải • Cả hai cây con đều là cây nhị phân
  • 5. Cây • Cây nhị phân • Bao gồm • Node • Các cây con trái và con phải • Cả hai đều là cây nhị phân Chú ý Định nghĩa đệ qui! Mỗi cây con Là một cây Nhị phân
  • 6. Cây – Thủ tục • Cấu trúc dữ liệu struct t_node { void *item; struct t_node *left; struct t_node *right; }; typedef struct t_node *Node; struct t_collection { Node root; …… };
  • 7. Cây – Thủ tục • Tìm (Find ) extern int KeyCmp( void *a, void *b ); /* Returns -1, 0, 1 for a < b, a == b, a > b */ void *FindInTree( Node t, void *key ) { if ( t == (Node)0 ) return NULL; switch( KeyCmp( key, ItemKey(t->item) ) ) { case -1 : return FindInTree( t->left, key ); case 0: return t->item; case +1 : return FindInTree( t->right, key ); } } void *FindInCollection( collection c, void *key ) { return FindInTree( c->root, key ); } Less, search left Greater, search right
  • 8. Cây – Thủ tục • Find • key = 22; if ( FindInCollection( c , &key ) ) …. n = c->root; FindInTree( n, &key ); FindInTree(n->right,&key ); FindInTree(n->left,&key ); return n->item;
  • 9. Cây – hoạt động • Find • Cây hoàn toàn • Chiều cao, h • Các node di truyển trên một con đường từ gốc đến một lá • Số các node, h • n = 1 + 21 + 22 + … + 2h = 2h+1 - 1 • h = floor( log2 n )
  • 10. Cây – Hoạt động • Find • Cây hoàn toàn • Vì chúng tôi cần nhiều nhât h+1 phép so sánh, độ phức tạp O(h+1) hoặc O(log n) • Giống như tìm kiếm nhị phân
  • 11. Tổng kết Arrays Đơn giản, nhanh Không mềm dẻo O(1) O(n) inc sort O(n) O(n) O(logn) Tìm kiếm nhị phân Add Delete Find Linked List Đơn giản Mềm dẻo O(1) sort -> no adv O(1) - any O(n) - specific O(n) (không tìm kiếm nhị phân) Trees Vẫn đơn giản Mềm dẻo O(log n)
  • 12. Cây – Bổ xung (Addition) • Cộng 21 vào cây • Chúng tôi cần tối đa h+1 phép so sánh • Tạo một node mới (thời gian là hằng số) add lấy c1(h+1)+c2 hoặc c log n • Vì thế việc bổ xung vào một cây cũng chiếm thời gian là log n Ignoring low order terms
  • 13. Cây - Addition – thủ tục static void AddToTree( Node *t, Node new ) { Node base = *t; /* If it's a null tree, just add it here */ if ( base == NULL ) { *t = new; return; } else if( KeyLess(ItemKey(new->item),ItemKey(base->item)) ) AddToTree( &(base->left), new ); else AddToTree( &(base->right), new ); } void AddToCollection( collection c, void *item ) { Node new, node_p; new = (Node)malloc(sizeof(struct t_node)); /* Attach the item to the node */ new->item = item; new->left = new->right = (Node)0; AddToTree( &(c->node), new ); }
  • 14. Cây – Bổ xung (Addition) • Find c log n • Add c log n • Delete c log n • Hiệu quả rất đáng kể! • Tuy nhiên vẫn bắt gặp một số trường hợp ………..
  • 15. Cây – Bổ xung (Addition) • Lấy danh sách ký tự này và hình thành một cây A B C D E F • ??
  • 16. Trees - Addition • Nhận danh sách ký tự này và hình thành một cây A B C D E F • Trong trường hợp này: ? Find ? Add ? Delete