SlideShare a Scribd company logo
CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Chương 7: Tìm kiếm
Khái niệm tìm kiếm Cho biết: Một danh sách các bản ghi (record).  Một khóa cần tìm. Tìm bản ghi có khóa trùng với khóa cần tìm (nếu có). Đo độ hiệu quả: Số lần so sánh khóa cần tìm và khóa của các bản ghi Phân loại: Tìm kiếm nội (internal searching) Tìm kiếm ngoại (external searching)
Bản ghi và khóa Bản ghi: Khóa Dữ liệu Khóa: So sánh được Thường là số Trích khóa từ bản ghi: So sánh các bản ghi
Bản ghi và khóa trên C++ class  Key { public:  //  Add any constructors and methods for key data. private: //  Add declaration of key data members here. } ; bool operator  == ( const  Key &x , const  Key &y) ; bool operator  > ( const  Key &x , const  Key &y) ; bool operator  < ( const  Key &x , const  Key &y) ; bool operator  >= ( const  Key &x , const  Key &y) ; bool operator  <= ( const  Key &x , const  Key &y) ; bool operator  != ( const  Key &x , const  Key &y) ; class  Record{ public: operator  Key( ) ; //  implicit conversion from Record to Key . //  Add any constructors and methods for Record objects. private: //  Add data components. } ;
Hàm tìm kiếm Tham số vào: Danh sách cần tìm Khóa cần tìm Tham số ra: Vị trí phần tử tìm thấy (nếu có) Kết quả hàm: kiểu Error_code Tìm thấy: success Không tìm thấy: not_present
Tìm tuần tự (sequential search) 5 Target key 7 13 5 21 6 2 8 15 position = 2 return success Số lần so sánh: 3 0 1 2 3 4 5 6 7
Tìm tuần tự - không tìm thấy 9 Target key 7 13 5 21 6 2 8 15 return not_present Số lần so sánh: 8 0 1 2 3 4 5 6 7
Tìm tuần tự - Mã C++ Error_code sequential_search( const  List<Record> &the_list ,  const  Key &target , int  &position) / *  Post:  If an entry in the_list has key equal to target, then return success and the output parameter position locates such an entry within the list. Otherwise return not_present and position becomes invalid. * / { int  s = the_list . size( ) ; for  (position = 0 ;  position < s ;  position++) { Record data ; the_list . retrieve(position ,  data) ; if  (data == target)  return  success ; } return  not_present ; }
Tìm tuần tự - Đánh giá Số lần so sánh trên khóa đối với danh sách có n phần tử: Tìm không thành công: n. Tìm thành công, trường hợp tốt nhất: 1. Tìm thành công, trường hợp xấu nhất: n. Tìm thành công, trung bình: (n + 1)/2.
Tìm trên danh sách có thứ tự Danh sách có thứ tự (ordered list): Phần tử tại vị trí i có khóa nhỏ hơn hoặc bằng phần tử tại vị trí j (i<j). Tìm tuần tự có thể kết thúc sớm hơn: Khi khóa cần tìm nhỏ hơn khóa của phần tử hiện tại. Trả giá: Mỗi bước lặp cần kiểm tra xem ngừng được chưa. Tốn 2 phép so sánh trên khóa cho mỗi lần lặp. Số phép so sánh “có vẻ” gấp đôi so với phép tìm trên danh sách bất kỳ.
Quản lý danh sách có thứ tự Thừa hưởng từ List và Hiệu chỉnh (override) lại các phương thức insert, replace: Đảm bảo là danh sách kết quả vẫn còn thứ tự. Thiết kế thêm (overload) phương thức insert mới không cần tham số position. class  Ordered_list:  public  List<Record> { public : … Error_code insert ( const  Record &data); };
Thêm vào danh sách có thứ tự - Giải thuật Algorithm  Insert Input : x là giá trị cần thêm vào Output : danh sách đã thêm x vào và vẫn có thứ tự // Đi tìm vị trí position mà khóa của x nằm giữa khóa của các phần từ  // tại vị trí position – 1 và position.  1.  for   position = 0  to  size 1.1.  list_data = phần tử tại vị trí position 1.2.  if   x nhỏ hơn hoặc bằng list_data 1.2.1.  thêm  vào tại vị trí này 1.2.2.  ngừng lại End  Insert
Thêm vào danh sách có thứ tự  - Mã C++ Error_code Ordered_list  ::  insert( const  Record &data) / *  Post:  If the Ordered_list is not full, the function succeeds: The Record data is inserted into the list, following the last entry of the list with a strictly  lesser key (or in the rst list position if no list element has a lesser key). Else: the function fails with the diagnostic Error_code overflow. * / { int  s = size( ) ; int  position ; for  (position = 0 ;  position < s ;  position++) { Record list_data ; retrieve(position ,  list_data) ; if  (data <= list_data)  break; } return  List<Record>  ::  insert(position ,  data) ; }
Thêm vào danh sách (viết đè) - Giải thuật Algorithm  Insert_overridden Input : position là vị trí cần thêm vào, x là giá trị cần thêm vào Output : danh sách đã thêm x vào và vẫn có thứ tự // Kiểm tra xem có thỏa mãn mà khóa của x nằm giữa khóa của  // các phần từ  tại vị trí position – 1 và position.  1.  if  position > 0 1.1.  list_data = phần tử tại vị trí position -1 1.2.  if   x nhỏ hơn list_data 1.2.1.  có lỗi 2.  if  position < count 2.1.  list_data = phần tử tại vị trí position 2.2.  if   x lớn hơn list_data 2.2.1.  có lỗi Thêm  vào tại vị trí này End  Insert_overridden
Tìm nhị phân (binary search) Ý tưởng:  So sánh khóa cần tìm với phần tử giữa. Nếu nó nhỏ hơn thì tìm bên trái danh sách. Ngược lại tìm bên phải danh sách. Lặp lại động tác này. Cần 2 chỉ mục top và bottom để giới hạn đoạn tìm kiếm trên danh sách. Khóa cần tìm nếu có chỉ nằm trong đoạn này.
Tìm nhị phân – Cách 2 10 Target key 2 5 8 10 12 13 15 18 21 24 position = 3 return success Số lần so sánh: 7 Khóa cần tìm không bằng Khóa cần tìm nhỏ hơn Khóa cần tìm lớn hơn Khóa cần tìm bằng 0 1 2 3 4 5 6 7 8 9 bottom top middle
Tìm nhị phân – Giải thuật 2 Algorithm  Binary_search2 Input : target là khóa cần tìm, bottom và top là giới hạn danh sách Output : position là vị trí nếu tìm thấy 1.  if  bottom > top 1.1.  return  not_present 2.  if  bottom <= top 2.1.  list_data = phần tử tại vị trí mid = (bottom + top)/2 2.2.  if  x == list_data 2.2.1.  position = mid 2.2.2.  return  success 2.3.  if   x < list_data 2.3.1.  call  Binary_search2 với đoạn bên trái (bottom, mid-1) 2.4.  else 2.4.1.  call  Binary_search2 với đoạn bên phải (mid+1, top) End  Binary_search2
Tìm nhị phân 2 – Mã C++ Error_code recursive_binary_2( const  Ordered_list &the list , const  Key &target , int  bottom , int  top , int  &position) { Record data ; if  (bottom <= top) { int  mid = (bottom + top)/2 ; the_list . retrieve(mid ,  data) ; if  (data == target) { position = mid ; return  success ; } else if  (data < target) return  recursive_binary_2(the list ,  target ,  mid + 1 ,  top ,  position) ; else return  recursive_binary_2(the list ,  target ,  bottom ,  mid − 1 ,  position) ; } else return  not_present ; }
Tìm nhị phân – Cách 1 10 Target key 2 5 8 10 12 13 15 18 21 24 position = 3 return success Số lần so sánh: 4 Khóa cần tìm nhỏ hơn hoặc bằng Khóa cần tìm lớn hơn Khóa cần tìm bằng 0 1 2 3 4 5 6 7 8 9 bottom top middle
Tìm nhị phân – Giải thuật 1 Algorithm  Binary_search1 Input : target là khóa cần tìm, bottom và top là giới hạn danh sách Output : position là vị trí nếu tìm thấy 1.  if  bottom == top 1.1.  if   x == phần tử tại vị trí bottom 1.1.1.  position = bottom 1.1.2.  return  success 2.  if  bottom > top 2.1.  return not_present 3.  if  bottom < top 3.1.  if   x < phần tử tại vị trí mid = (bottom + top)/2 3.1.1.  call  Binary_search1 với đoạn bên trái (bottom, mid-1) 3.2.  else 3.2.1.  call  Binary_search1 với đoạn bên phải (mid, top) End  Binary_search1
Tìm nhị phân 1 – Mã C++ Error_code recursive_binary_1( const  Ordered_list &the_list ,  const  Key &target , int  bottom , int  top , int  &position) { Record data ; if  (bottom < top) {  //  List has more than one entry. the_list . retrieve((bottom + top)/2 ,  data) ; if  (data < target)  return  recursive_binary_1(the list ,  target ,  mid + 1 ,  top ,  position) ; else //  Reduce to bottom half of list. return  recursive_binary_1(the list ,  target ,  bottom ,  mid ,  position) ; }  else if  (top < bottom) return  not_present ; //  List is empty. else  { position = bottom ; the_list . retrieve(bottom ,  data) ; if  (data == target)  return  success ; else return  not_present ; } }
Cây so sánh của giải thuật 1
Cây so sánh của giải thuật 2
Tìm nhị phân – Đánh giá
So sánh trong trường hợp trung bình các giải thuật
Đánh giá độ phức tạp của giải thuật So sánh với các hàm cơ bản:  g(n) =  1  Constant function g(n) =  log  n  Logarithmic function g(n) =   n  Linear function g(n) =   n 2   Quadratic function g(n) =   n 3   Cubic function g(n) =  2 n   Exponential function
Độ phức tạp tính bằng tiệm cận
Độ tăng của các hàm chung
Ký hiệu Big-O Thứ tự tăng dần về độ lớn: O (1)  O (lg n)  O (n)  O (n lg n)  O (n 2 )  O (n 3 )  O (2 n ) a  ≠ 0 hoặc là ∞  ≥  : lớn hơn hoặc bằng Ω (g(n)) a  ≠ 0 =  : bằng Θ (g(n)) a ≤  : nhỏ hơn hoặc bằng O (g(n)) 0 <  : nhỏ hơn hẳn o (g(n)) lim n-> ∞  (f(n)/g(n) Bậc của f so với g f(n)  

More Related Content

PPT
Ctdl C06
PPT
Ctdl C11
PPT
Ctdl C10
PPT
Ctdl C09
PPT
Ctdl C08
PPT
Gioi Thieu
PDF
Cau truc dl_va_giai_thuat_bai1[1] - copy
DOC
Bài tập CTDL và GT 3
Ctdl C06
Ctdl C11
Ctdl C10
Ctdl C09
Ctdl C08
Gioi Thieu
Cau truc dl_va_giai_thuat_bai1[1] - copy
Bài tập CTDL và GT 3

What's hot (20)

PDF
ctdl&amp;gt 04-list_don
PDF
Chuong 4 danh sach lien ket
PPT
Ctdl c4-cay
PDF
Bài tập CTDL và GT 1
PPTX
Hsbd van tri
DOC
Bài tập CTDL và GT 12
PPT
Cây Nhị Phân
PPTX
Giao an tin hoc 11
PPT
Ctdl+va+gt chuong+5 8
PPTX
Hsbd van tri
PDF
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
PPT
Bai13-Cau truc du lieu va giai thuat - Cay (Tree)
PPT
Cây nhị phân tìm kiếm
PDF
Ham excel
PPT
Gtga trị
PPT
Cac ham excel co ban va nang cao
PDF
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
DOC
Cac ham thong dung trong excel
PPT
Ctdl C02
PPT
Ctdl C04
ctdl&amp;gt 04-list_don
Chuong 4 danh sach lien ket
Ctdl c4-cay
Bài tập CTDL và GT 1
Hsbd van tri
Bài tập CTDL và GT 12
Cây Nhị Phân
Giao an tin hoc 11
Ctdl+va+gt chuong+5 8
Hsbd van tri
Bài 6: Các cấu trúc dữ liệu đặc biệt: ngăn xếp, hàng đợi, cây - Giáo trình FPT
Bai13-Cau truc du lieu va giai thuat - Cay (Tree)
Cây nhị phân tìm kiếm
Ham excel
Gtga trị
Cac ham excel co ban va nang cao
Bài 7: Danh sách liên kết (LINKED LIST) và tập hợp (SET) - Giáo trình FPT
Cac ham thong dung trong excel
Ctdl C02
Ctdl C04
Ad

Viewers also liked (18)

PPT
Ctdl C03
PPT
Ctdl c1-tong quan
PPTX
Baigiang bai2 lop12_tiet2
PPT
Ctdl 01 t_quan
PPT
Chuong 2 - CSDL phân tán
PPT
Bai giang thuat toan tim kiem va sap xep
PDF
Bai giang thiet_ke_mang
PDF
Slide 01
PDF
Dh Uml1
PDF
Giáo trình cấu trúc dữ liệu và giải thuật của lê minh hoàng
PPT
Ctdl C01
PPT
Ctdl C05
PDF
Slide báo cáo cuối kì system hacking-Trần Nguyễn Lộc
PDF
System hacking_Athena
PDF
Phần 1: Các khái niệm cơ bản về lập trình
PPT
Chuong 1 - CSDL phân tán
PDF
Security Bootcamp 2013 - Giải pháp phát hiện xâm nhập mạng không dây - WIDS -...
Ctdl C03
Ctdl c1-tong quan
Baigiang bai2 lop12_tiet2
Ctdl 01 t_quan
Chuong 2 - CSDL phân tán
Bai giang thuat toan tim kiem va sap xep
Bai giang thiet_ke_mang
Slide 01
Dh Uml1
Giáo trình cấu trúc dữ liệu và giải thuật của lê minh hoàng
Ctdl C01
Ctdl C05
Slide báo cáo cuối kì system hacking-Trần Nguyễn Lộc
System hacking_Athena
Phần 1: Các khái niệm cơ bản về lập trình
Chuong 1 - CSDL phân tán
Security Bootcamp 2013 - Giải pháp phát hiện xâm nhập mạng không dây - WIDS -...
Ad

Similar to Ctdl C07 (19)

PPT
Giáo trình excel nâng cao tud
PPT
Chuong 2 Tim Kiem N Sap Xep
PPT
Chuong 2 Tim Kiem N Sap Xep
PDF
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
PPT
ThiếT Kế Và đáNh Giá ThuậT ToáN
PDF
Bai3 timkiemsapxep
PDF
Bai3 timkiem sapxep
PDF
Ctdl c2
PPT
Chuong 2
PDF
CHƯƠNG 4.pdf
PDF
Fortran cơ sở
PPT
1. Algorithms_ Giải thuật.ppt
PDF
trac-nghiem-cau-truc-du-lieu-va-giai-thuat.pdf
PPTX
Cấu trúc dữ liệu và giải thuật Bai 2_Ky Thuat Tim Kiem.pptx
DOC
THCS_W11_BaiDocThem
PDF
Bai7 timkiemnhiphan
PDF
Trí tueeuj nhân tạo
PDF
Tablists help
PPT
Timkiem&sapxep
Giáo trình excel nâng cao tud
Chuong 2 Tim Kiem N Sap Xep
Chuong 2 Tim Kiem N Sap Xep
Bài 5: Các thuật toán sắp xếp và tìm kiếm cơ bản - Giáo trình FPT
ThiếT Kế Và đáNh Giá ThuậT ToáN
Bai3 timkiemsapxep
Bai3 timkiem sapxep
Ctdl c2
Chuong 2
CHƯƠNG 4.pdf
Fortran cơ sở
1. Algorithms_ Giải thuật.ppt
trac-nghiem-cau-truc-du-lieu-va-giai-thuat.pdf
Cấu trúc dữ liệu và giải thuật Bai 2_Ky Thuat Tim Kiem.pptx
THCS_W11_BaiDocThem
Bai7 timkiemnhiphan
Trí tueeuj nhân tạo
Tablists help
Timkiem&sapxep

Ctdl C07

  • 1. CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Chương 7: Tìm kiếm
  • 2. Khái niệm tìm kiếm Cho biết: Một danh sách các bản ghi (record). Một khóa cần tìm. Tìm bản ghi có khóa trùng với khóa cần tìm (nếu có). Đo độ hiệu quả: Số lần so sánh khóa cần tìm và khóa của các bản ghi Phân loại: Tìm kiếm nội (internal searching) Tìm kiếm ngoại (external searching)
  • 3. Bản ghi và khóa Bản ghi: Khóa Dữ liệu Khóa: So sánh được Thường là số Trích khóa từ bản ghi: So sánh các bản ghi
  • 4. Bản ghi và khóa trên C++ class Key { public: // Add any constructors and methods for key data. private: // Add declaration of key data members here. } ; bool operator == ( const Key &x , const Key &y) ; bool operator > ( const Key &x , const Key &y) ; bool operator < ( const Key &x , const Key &y) ; bool operator >= ( const Key &x , const Key &y) ; bool operator <= ( const Key &x , const Key &y) ; bool operator != ( const Key &x , const Key &y) ; class Record{ public: operator Key( ) ; // implicit conversion from Record to Key . // Add any constructors and methods for Record objects. private: // Add data components. } ;
  • 5. Hàm tìm kiếm Tham số vào: Danh sách cần tìm Khóa cần tìm Tham số ra: Vị trí phần tử tìm thấy (nếu có) Kết quả hàm: kiểu Error_code Tìm thấy: success Không tìm thấy: not_present
  • 6. Tìm tuần tự (sequential search) 5 Target key 7 13 5 21 6 2 8 15 position = 2 return success Số lần so sánh: 3 0 1 2 3 4 5 6 7
  • 7. Tìm tuần tự - không tìm thấy 9 Target key 7 13 5 21 6 2 8 15 return not_present Số lần so sánh: 8 0 1 2 3 4 5 6 7
  • 8. Tìm tuần tự - Mã C++ Error_code sequential_search( const List<Record> &the_list , const Key &target , int &position) / * Post: If an entry in the_list has key equal to target, then return success and the output parameter position locates such an entry within the list. Otherwise return not_present and position becomes invalid. * / { int s = the_list . size( ) ; for (position = 0 ; position < s ; position++) { Record data ; the_list . retrieve(position , data) ; if (data == target) return success ; } return not_present ; }
  • 9. Tìm tuần tự - Đánh giá Số lần so sánh trên khóa đối với danh sách có n phần tử: Tìm không thành công: n. Tìm thành công, trường hợp tốt nhất: 1. Tìm thành công, trường hợp xấu nhất: n. Tìm thành công, trung bình: (n + 1)/2.
  • 10. Tìm trên danh sách có thứ tự Danh sách có thứ tự (ordered list): Phần tử tại vị trí i có khóa nhỏ hơn hoặc bằng phần tử tại vị trí j (i<j). Tìm tuần tự có thể kết thúc sớm hơn: Khi khóa cần tìm nhỏ hơn khóa của phần tử hiện tại. Trả giá: Mỗi bước lặp cần kiểm tra xem ngừng được chưa. Tốn 2 phép so sánh trên khóa cho mỗi lần lặp. Số phép so sánh “có vẻ” gấp đôi so với phép tìm trên danh sách bất kỳ.
  • 11. Quản lý danh sách có thứ tự Thừa hưởng từ List và Hiệu chỉnh (override) lại các phương thức insert, replace: Đảm bảo là danh sách kết quả vẫn còn thứ tự. Thiết kế thêm (overload) phương thức insert mới không cần tham số position. class Ordered_list: public List<Record> { public : … Error_code insert ( const Record &data); };
  • 12. Thêm vào danh sách có thứ tự - Giải thuật Algorithm Insert Input : x là giá trị cần thêm vào Output : danh sách đã thêm x vào và vẫn có thứ tự // Đi tìm vị trí position mà khóa của x nằm giữa khóa của các phần từ // tại vị trí position – 1 và position. 1. for position = 0 to size 1.1. list_data = phần tử tại vị trí position 1.2. if x nhỏ hơn hoặc bằng list_data 1.2.1. thêm vào tại vị trí này 1.2.2. ngừng lại End Insert
  • 13. Thêm vào danh sách có thứ tự - Mã C++ Error_code Ordered_list :: insert( const Record &data) / * Post: If the Ordered_list is not full, the function succeeds: The Record data is inserted into the list, following the last entry of the list with a strictly lesser key (or in the rst list position if no list element has a lesser key). Else: the function fails with the diagnostic Error_code overflow. * / { int s = size( ) ; int position ; for (position = 0 ; position < s ; position++) { Record list_data ; retrieve(position , list_data) ; if (data <= list_data) break; } return List<Record> :: insert(position , data) ; }
  • 14. Thêm vào danh sách (viết đè) - Giải thuật Algorithm Insert_overridden Input : position là vị trí cần thêm vào, x là giá trị cần thêm vào Output : danh sách đã thêm x vào và vẫn có thứ tự // Kiểm tra xem có thỏa mãn mà khóa của x nằm giữa khóa của // các phần từ tại vị trí position – 1 và position. 1. if position > 0 1.1. list_data = phần tử tại vị trí position -1 1.2. if x nhỏ hơn list_data 1.2.1. có lỗi 2. if position < count 2.1. list_data = phần tử tại vị trí position 2.2. if x lớn hơn list_data 2.2.1. có lỗi Thêm vào tại vị trí này End Insert_overridden
  • 15. Tìm nhị phân (binary search) Ý tưởng: So sánh khóa cần tìm với phần tử giữa. Nếu nó nhỏ hơn thì tìm bên trái danh sách. Ngược lại tìm bên phải danh sách. Lặp lại động tác này. Cần 2 chỉ mục top và bottom để giới hạn đoạn tìm kiếm trên danh sách. Khóa cần tìm nếu có chỉ nằm trong đoạn này.
  • 16. Tìm nhị phân – Cách 2 10 Target key 2 5 8 10 12 13 15 18 21 24 position = 3 return success Số lần so sánh: 7 Khóa cần tìm không bằng Khóa cần tìm nhỏ hơn Khóa cần tìm lớn hơn Khóa cần tìm bằng 0 1 2 3 4 5 6 7 8 9 bottom top middle
  • 17. Tìm nhị phân – Giải thuật 2 Algorithm Binary_search2 Input : target là khóa cần tìm, bottom và top là giới hạn danh sách Output : position là vị trí nếu tìm thấy 1. if bottom > top 1.1. return not_present 2. if bottom <= top 2.1. list_data = phần tử tại vị trí mid = (bottom + top)/2 2.2. if x == list_data 2.2.1. position = mid 2.2.2. return success 2.3. if x < list_data 2.3.1. call Binary_search2 với đoạn bên trái (bottom, mid-1) 2.4. else 2.4.1. call Binary_search2 với đoạn bên phải (mid+1, top) End Binary_search2
  • 18. Tìm nhị phân 2 – Mã C++ Error_code recursive_binary_2( const Ordered_list &the list , const Key &target , int bottom , int top , int &position) { Record data ; if (bottom <= top) { int mid = (bottom + top)/2 ; the_list . retrieve(mid , data) ; if (data == target) { position = mid ; return success ; } else if (data < target) return recursive_binary_2(the list , target , mid + 1 , top , position) ; else return recursive_binary_2(the list , target , bottom , mid − 1 , position) ; } else return not_present ; }
  • 19. Tìm nhị phân – Cách 1 10 Target key 2 5 8 10 12 13 15 18 21 24 position = 3 return success Số lần so sánh: 4 Khóa cần tìm nhỏ hơn hoặc bằng Khóa cần tìm lớn hơn Khóa cần tìm bằng 0 1 2 3 4 5 6 7 8 9 bottom top middle
  • 20. Tìm nhị phân – Giải thuật 1 Algorithm Binary_search1 Input : target là khóa cần tìm, bottom và top là giới hạn danh sách Output : position là vị trí nếu tìm thấy 1. if bottom == top 1.1. if x == phần tử tại vị trí bottom 1.1.1. position = bottom 1.1.2. return success 2. if bottom > top 2.1. return not_present 3. if bottom < top 3.1. if x < phần tử tại vị trí mid = (bottom + top)/2 3.1.1. call Binary_search1 với đoạn bên trái (bottom, mid-1) 3.2. else 3.2.1. call Binary_search1 với đoạn bên phải (mid, top) End Binary_search1
  • 21. Tìm nhị phân 1 – Mã C++ Error_code recursive_binary_1( const Ordered_list &the_list , const Key &target , int bottom , int top , int &position) { Record data ; if (bottom < top) { // List has more than one entry. the_list . retrieve((bottom + top)/2 , data) ; if (data < target) return recursive_binary_1(the list , target , mid + 1 , top , position) ; else // Reduce to bottom half of list. return recursive_binary_1(the list , target , bottom , mid , position) ; } else if (top < bottom) return not_present ; // List is empty. else { position = bottom ; the_list . retrieve(bottom , data) ; if (data == target) return success ; else return not_present ; } }
  • 22. Cây so sánh của giải thuật 1
  • 23. Cây so sánh của giải thuật 2
  • 24. Tìm nhị phân – Đánh giá
  • 25. So sánh trong trường hợp trung bình các giải thuật
  • 26. Đánh giá độ phức tạp của giải thuật So sánh với các hàm cơ bản: g(n) = 1 Constant function g(n) = log n Logarithmic function g(n) = n Linear function g(n) = n 2 Quadratic function g(n) = n 3 Cubic function g(n) = 2 n Exponential function
  • 27. Độ phức tạp tính bằng tiệm cận
  • 28. Độ tăng của các hàm chung
  • 29. Ký hiệu Big-O Thứ tự tăng dần về độ lớn: O (1) O (lg n) O (n) O (n lg n) O (n 2 ) O (n 3 ) O (2 n ) a ≠ 0 hoặc là ∞ ≥ : lớn hơn hoặc bằng Ω (g(n)) a ≠ 0 = : bằng Θ (g(n)) a ≤ : nhỏ hơn hoặc bằng O (g(n)) 0 < : nhỏ hơn hẳn o (g(n)) lim n-> ∞ (f(n)/g(n) Bậc của f so với g f(n) 