Mục đích Yêu cầu– - Hiểu và thực hiện đợc thuật toán tìm kiếm nhị phân.. ở tiết trớc các em đã đợc tìm hiểu về thuật toán tìm kiếm tuần tự, tiếp theo chúng ta cùng tìm hiểu một thuật toá
Trang 1Bài 4: bài toán và thuật toán
(tiết 6)
Ngời soạn: Nguyễn Thị Huê
SV lớp: SP Tin K40 Ngày soạn: 25/9/2008 Giáo viên hớng dẫn: Nguyễn Văn Trờng
I Mục đích Yêu cầu–
- Hiểu và thực hiện đợc thuật toán tìm kiếm nhị phân
- Biết cách xây dựng thuật toán đó
- Hình thành kĩ năng t duy logic để giải quyết các bài toán và vấn đề trong thực tế
II Công tác chuẩn bị.
Giáo viên chuẩn bị bảng phụ mô tả sơ đồ khối thuật toán tìm kiếm nhị phân
III Nội dung
1 ổn định tổ chức lớp (1 phút)
Sĩ số: Vắng: Có phép: Không phép:
2 Kiểm tra bài cũ (6 phút)
* Câu hỏi: Cho dãy số nguyên sau và khoá k= 27, em hãy thực hiện thuật toán tìm kiếm tuần tự và đa ra kết quả dới dạng mảng mô phỏng?
Dãy số: 7, 5, 23, 27, 17, 32, 1
* Đáp án:
Bảng mô phỏng:
-Ai = k ? Sai Sai Sai Sai Đúng -
-Kết quả thực hiện thuật toán: Thông báo chỉ số cần tìm: i = 5
3 Bài mới
1
Trang 2Hoạt động của GV Hoạt động của HS Thời
gian
Đặt vấn đề: Bài toán tìm kiếm rất phổ
biến trong thực tế Ví dụ: tìm thuê bao
trong danh bạ điện thoại, tìm học sinh
trong danh sách, … Ta cũng có thể tìm
kiếm theo nhiều cách khác nhau ở tiết
trớc các em đã đợc tìm hiểu về thuật
toán tìm kiếm tuần tự, tiếp theo chúng
ta cùng tìm hiểu một thuật toán tìm
kiếm nữa: tìm kiếm nhị phân
- Các em hãy mở SGK trang 42
Bài toán đợc phát biểu nh sau:
Bài toán : “Dãy A gồm N số nguyên
khác nhau: a1,a2,…,aN đợc sắp xếp tăng
dần và số nguyên k Cần biết có hay
không chỉ số i (1<=i<=N) mà ai=k
Nếu có hãy cho biết chỉ số đó”
Em hãy xác định Input và Output của
bài toán?
Bài 4: Bài toán và thuật toán
(tiết 6)
3 Một số ví dụ về thuật toán
Ví dụ 3 (tiếp): Thuật tón tìm kiếm nhị phân
- Xác định:
+ Input: Dãy tăng gồm N số nguyên khác nhau a1, a2, , a… N
và số nguyên k;
+ Output: Chỉ số i mà ai=k hoặc
thông báo không có số hạng nào của dãy có giá trị bằng k;
- Em nào có thể mô tả ngắn gọn cách
mở trang sách của mình?
Ngoài cách nh trên, ta cũng có thể làm
nh sau: Em mở một trang bất kì trong
sách Nếu trang đó đúng là trang 42 thì
thôi Nếu số trang đó nhỏ hơn 42 thì
- Trả lời
2
Trang 3lại mở từ trang trớc đó trở về đầu sách,
ngợc lại thì mở từ trang sau đó trở về
cuối sách
- Với cách làm đó của em thì có thực
hiện đợc trên cuốn vở viết bình thờng
không?
- Việc tìm trang 42 cũng gần giống với
ý tởng của thuật toán tìm kiếm nhị
phân Để xem ý tởng đó thế nào,
chúng ta sẽ cùng đi tìm hiểu
ý tởng thuật toán tìm kiếm nhị phân
đ-ợc phát biểu nh sau:
Sử dụng tính chất của một dãy số tăng
Ta tìm cách thu hẹp phạm vi tìm kiếm
sau mỗi lần so sánh khoá k với phần tử
tìm kiếm Phần tử tìm kiếm thờng đợc
chọn là phần tử ở giữa
Với Giua=[(Dau+Cuoi)/2]; Dau và
Cuoi là chỉ số tơng ứng của phần tử
đầu và cuối dãy tìm kiếm Ban đầu
khởi tạo Dau=1, Cuoi=N.
+ Đầu tiên, ta xét phần tử ở giữa, so
sánh với k Nếu đúng bằng k thì dừng.
+ Nếu phần tử giữa lớn hơn k, ta thực
hiện lại công việc tìm kiếm với các
phần tử từ đầu đến phần tử gần phần tử
giữa nhất (tìm ở phần đầu cuốn sách)
+ Nếu phần tử giữa nhỏ hơn k thì thực
hiện lại việc tìm kiếm với các phần tử
từ phần tử ngay sau phần tử giữa đến
- Trả lời: Cách đó không thể làm với quyển vở bình thờng vì vở không đánh số trang
- Ghi bài:
Sử dụng tính chất dãy A tăng
So sánh aGiua với k Với Giua [(Dau + Cuoi)/2] Dau 1, Cuoi N.
+ Nếu aGiua = k thì Giua là chỉ số cần tìm, kết thúc tìm kiếm
+ Nếu aGiua > k thì tìm kiếm tiếp trên dãy a1, a2, , a… Giua-1
+ Nếu aGiua < k thì tìm kiếm tiếp trên dãy aGiua +1 , aGiua+2, , a… N
+ Quá trình kết thúc khi tìm thấy chỉ số i sao cho ai = k hoặc phạm
vi tìm kiếm bằng rỗng
3
Trang 4phần tử cuối (tìm ở phần sau cuốn
sách)
+ Việc tìm kiếm sẽ dừng nếu tìm thấy
phần tử k đó trong dãy hoặc phạm vi
tìm kiếm bằng rỗng (không còn trang
sách nào để tìm nữa)
- Thuật toán đợc gọi là “Tìm kiếm nhị
phân” bởi ta thực hiện việc tìm kiếm
bằng cách chia dãy tìm kiếm thành 2
dãy con (nhị phân), sau đó lại tìm
kiếm trên một trong hai dãy con đó
nếu vẫn cha tìm thấy
- Từ ý tởng ở trên, ta có cách biểu diễn
thuật toán ở dạng liệt kê nh sau:
(nêu lên các bớc)
- Quan sát và ghi bài
Bớc 1: Nhập N, các phần tử a1, a2, , a… N và khoá k;
Bớc 2: Dau1, CuoiN;
Bớc 3:
Giua[(Dau+Cuoi)/2];
Bớc 4: Nếu aGiua=k thì thông báo
chỉ số Giua rồi kết thúc;
Bớc 5: Nếu aGiua >k thì CuoiGiua- 1, rồi chuyển đến
bớc 7;
Bớc 6: DauGiua+1;
Bớc 7: Nếu Dau>Cuoi thì thông
báo dãy A không có phàn tử nào
có giá trị bằng k, rồi kết thúc;
Bớc 8: Quay lại bớc 3;
- VD 1: N=7, k=5 Dãy số: 2, 4, 5, 21,
43, 47, 52
+ Chọn Dau là phần tử đầu tiên: Dau
Thông báo chỉ số cần tìm i=Giua=3
4
a Giua 21 4 5
a và > < =
Trang 5 1, và Cuoi là phần tử cuối cùng:
Cuoi N (tức Cuoi = 7)
+ Xét phần tử ở giữa: Giua
[(Dau+Cuoi)/2], tức Giua = 4; Thấy
aGiua=21 > k = 5 Thực hiện tìm kiếm
trong nửa đầu của dãy: CuoiGiua-1;
tức Cuoi=3;
+ Lại xét phần tử giữa:
Giua[(Dau+Cuoi)/2]; tức Giua = 2;
aGiua=4 < k = 5; Thực hiện tìm kiếm
trong nửa sau của dãy: DauGiua +
1; tức Dau=3
+ Xét tiếp phần tử ở giữa:
Giua[(Dau+Cuoi)/2]; tức Giua = 3;
aGiua=5 = k ; Thông báo ra chỉ số cần
tìm i=Giua=3 rồi kết thúc tìm kiếm
- Đa ra sơ đồ khối của thuật toán và
giải thích Đồng thời giải thích sự tơng
đơng giữa sơ đồ khối và các bớc liệt
kê
- Nhận xét: trong thuật toán, việc tìm
kiếm thực chất là lặp một số lần thao
tác:
+ Chọn phần tử ở giữa làm phần tử tìm
kiếm
+ So sánh phần tử tìm kiếm với k
+ Căn cứ vào kết quả so sánh để thu
hẹp phạm vi tìm kiếm hoặc kết luận đã
tì thấy (không tìm thấy)
- Quan sát sơ đồ của giáo viên
5
Đ
Nhập N, a 1 , a 2 , , a… N và
k
Dau 1; CuoiN
a
Giua = k
Giua [(Dau+Cuoi)/2]
Đưa ra Giua
rồi kết thúc
a
Giua > k
Cuoi Giua-1
Dau Giua+1
Dau>Cuoi
Thông báo trong dãy
không có số hạng nào có
giá trị bằng k rồi kết thúc
Đ
Đ
S
S
S
Trang 6- Hớng dẫn HS tìm hiểu các VD.
- VD 2: N=8, k=23 Dãy số: 3, 5, 9,
12, 16, 17, 19, 24
Bảng mô phỏng nh sau (kết hợp với sơ
đồ hoặc các bớc liệt kê)
a Giua 12 17 19 24
a Giua < < < >
- Nghe giảng và ghi bài
6
Trang 7và k
Lần
duyệt
Nhận thấy rằng: Dau>Cuoi nên phạm
vi tìm kiếm bằng rỗng, thông báo:
không tìm thấy phần tử nào bằng 23
trong dãy
+ VD 3: N=5, k=36 Dãy số: 9, 10, 29,
36, 42
HS tự làm
GV nhận xét bài của HS
- Làm VD
IV Củng cố (1 phút)
- So với thuật toán tìm kiếm tuần tự, ở thuật toán tìm kiém nhị phân cần lu ý: + Dãy số ban đầu là dãy tăng
+ Số lần duyệt ít hơn
- BTVN:
Học các cách biểu diễn bài toán tìm kiếm bằng liệt kê và bằng sơ đồ khối Mỗi học sinh lấy 2 ví dụ về dãy tăng dần và khoá k, sau đó mô phỏng thuật toán tìm kiếm nhị phân bằng bảng
7
Trang 8V nhËn xÐt cña gi¸o viªn híng dÉn:
8