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

Binary Search (Tìm kiếm nhị phân) doc

29 1K 5
Tài liệu đã được kiểm tra trùng lặp

Đ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 29
Dung lượng 190,5 KB

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

Nội dung

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 1

Binary 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 2

Binary 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 4

Ví dụ

list L[5] là 11

L[6……11] như hình minh hoạ

Trang 5

Binary 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 6

Chươ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 8

Exercise: Đệ quy tìm kiếm nhị fân

kiếm nhị fân

Trang 9

Solution

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

Ký 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 11

Phân tích thời gian tính của thuật toán

liệu vào

Trang 12

Exercise

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 13

Gợi ý

- Tăng biến đếm toàn cục

Trang 14

kiếm nhị fân

mà dữ liệu được tìm thấy

Trang 15

Thứ 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 16

tê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 18

Solution: 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 19

int 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 20

Solution (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 22

Kiểm thử các list

nhất với nhau không.

Trang 23

Kiể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 24

Solution: 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 25

Hà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 26

Kiể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 28

Kiể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++;

}

Ngày đăng: 28/06/2014, 22:20

TỪ KHÓA LIÊN QUAN

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

TÀI LIỆU LIÊN QUAN

w