Binary Search Tìm kiếm nhị fânthuật chia để trị để tìm kiếm.. giới hạn tìm kiệm lại về nửa đầu của list... Binary Searchkinh ngạc để tìm kiếm trong 1 list đã được sắp xếp.. Exercise: Đệ
Trang 1Binary Search (Tìm kiếm nhị fân)
thuật chia để trị để tìm kiếm
với phần tử giữa của list
giới hạn tìm kiệm lại về nửa đầu của list
Trang 2Binary Search
kinh ngạc để tìm kiếm trong 1 list đã được sắp xếp
danh bạ điện thoại
Trang 3- Thử tính xem phải dùng bao nhiêu phép toán nếu sử dụng tìm kiếm tuần tự?
Trang 4Ví dụ
list L[5] là 11
L[6……11] như hình minh hoạ
Trang 5Binary Search Code
// target là số cần tìm, size là kích thước list
Int binSearch (int List[], int Target, int Size) { int Mid,
Lo = 0,
Hi = Size –1;
while( Lo <= Hi ) {
Mid = (Lo + Hi) / 2;
if( List[Mid] == Target )
Trang 6Chương trình test
#include <stdio.h>
#define NotFound (-1)
typedef int ElementType;
int BinarySearch(ElementType A[ ], ElementType X, int N ) {
int Low, Mid, High;
Low = 0; High = N -1;
while( Low <= High ) {
Mid = ( Low + High ) / 2;
Trang 8Exercise: Đệ quy tìm kiếm nhị fân
kiếm nhị fân
Trang 9Solution
#define NotFound (-1)
typedef int ElementType;
int BinarySearch(ElementType A[ ], ElementType X, int Lo, int Hi ) {
if (Lo > High) return NotFound; //không tìm thấy
Mid = ( Low + High ) / 2;
if (A[ Mid ] < X ) return BinarySearch(A, X, Mid+1, Hi);
Trang 10Ký hiệu chữ O lớn
không âm của n Ta nói f(n) là O(g(n)) nếu tồn tại các hằng số C>0 và N>0 để với mọi n>N thì f(n) ≤ Cg(n).
lệ không lớn hơn hàm g(n),tức g(n) là cận trên của f(n).
của 1 hàm với giá trị lớn thích đáng của n.
Trang 11Phân tích thời gian tính của thuật toán
liệu vào
Trang 12Exercise
1 đến 100 theo thứ tự vào mảng
nhị fân trên mảng.In ra “not found” nếu
mảng không chứa số đó
số mảng được so sánh với đầu ra chuẩn,
và hiển thị số các fép so sánh đến khi dữ liệu được tìm ra
Trang 13Gợi ý
- Tăng biến đếm toàn cục
Trang 14kiếm nhị fân
mà dữ liệu được tìm thấy
Trang 15Thứ tự từ điển và tìm kiếm nhị fân
giữa 2 giá trị là dựa trên thứ tự từ điển
Trang 16tên, sđthoại địa chỉ mail.Khai báo 1 mảng cấu trúc có thể chứa 100 fần tử
file đầu vào,ghi ra tên trùng với tên được
mô tả và chỉ số mảng của ai là nhỏ nhất trong file đầu ra.Sử dụng tìm kiếm nhị fân cho bài tập này
Trang 18Solution: Khai triển tìm kiếm nhị fân thứ
tự từ điển
int BinarySearch(phoneaddress A[ ], char name[] , int N ) {
int Low, Mid, High;
Low = 0; High = N -1;
while( Low <= High ) {
Mid = ( Low + High ) / 2;
if( strcmp(A[ Mid ].name, name) < 0 )
Trang 19int reval = SUCCESS//biến kiểm tra
printf(“bạn muốn nhập bao nhiêu liên lạc (<100)?"); scanf("%d", &n);
if ((fp = fopen("phonebook.dat","rb")) == NULL){
printf(“không thể mở %s.\n", "phonebook.dat");
reval = FAIL;
}
irc = fread(phonearr, sizeof(phoneaddress), n, fp);
printf(" fread trả về code = %d\n", irc); fclose(fp);
if (irc <0) {
printf (" không thể đọc từ file!");
return -1;
}
Trang 20Solution (tiếp)
printf(“nhập tên muốn tìm: "); gets(name);
irc = BinarySearch(phonearr, name,n);
if (irc <0) {
printf (" không có dữ liệu fù hợp!\n";
return -1;
}
// Ghi kết quả lên file đầu ra
if ((fpout = fopen("result.txt","w")) == NULL){
printf(“không thể tạo file để ghi.\n");
Trang 21 Trở về bài tập SortedList (list đã được sắp xếp) trong week 4 (quản lý Student) (Linked list) với cấu trúc của phần tử như sau:
typedef struct Student_t{
Trang 22Kiểm thử các list
nhất với nhau không.
Trang 23Kiểm thử các list
kiểu.Tìm:
không tìm thấy ở list 2
không tìm thấy ở list 1
list 2 với cùng key (khoá tìm kiếm) nhưng khác ở 1 trường nào đó khác
Trang 24Solution: Kiểu phần tử và khai báo list
# define MAX-SIZE 1000/* Kích thước lớn nhất của list cộng thêm 1 */
Trang 25Hàm Binary Search
int binsearch(element list[ ], int searchnum, int n)
{
/* tìm kiếm list [0], , list[n-1]*/
int left = 0, right = n-1, middle;
while (left <= right) {
middle = (left+ right)/2;
switch (COMPARE(list[middle].key, searchnum)) {
case -1: left = middle +1;break;
case 0: return middle;break;
case 1:right = middle -1;break;
} }
return -1;
}
Trang 26Kiểm thử sử dụng tìm kiếm tuần tự
void verify1(element list1[], element list2[ ], int n, int m)
/* so sánh 2 list không được sắp xếp list1 and list2 */
Trang 28Kiểm thử sử dụng Binary Search
void verify2(element list1[ ], element list2[], int n, int m)
/*cùng nhiệm vụ với verify1 nhưng list1 và list2 được sắp xếp*/
cứ sự khác nhau nào*/
i++;j++;
}