Bài dạy:Tiết 14: Bài toán & thuật tóan Thuật tóan tìm kiếm nhị phân Tin học 10... Kiểm tra bài cũCho dãy số nguyên A gồm N số nguyên khác nhau a1, …, aN và một số nguyên k.. • Xác định b
Trang 1TRƯỜNG THPT ĐỨC TRỌNG
TỔ TIN HỌC
Giáo viên thực hiện
Âu Trường Sơn
Trang 2Bài dạy:
Tiết 14: Bài toán & thuật tóan
Thuật tóan tìm kiếm nhị phân
(Tin học 10)
Trang 3Kiểm tra bài cũ
Cho dãy số nguyên A gồm N số nguyên khác nhau a1, …, aN và một số nguyên k Hãy cho biết
có hay không chỉ số i (1 ≤ i ≤ N) sao cho ai = k, nếu có cho biết chỉ số đó.
• Xác định bài toán
• Nêu ý tưởng của thuật tóan tìm kiếm tuần tự?
• Viết thuật tóan dạng liệt kê theo ý tưởng trên.
Trang 4Trả lời
Bài tóan tìm kiếm:
• Input: Dãy A gồm N số hạng khác nhau a1,
a2, …, aN và khóa k
Output: Thông báo vị trí của số hạng bằng
k trong dãy A hoặc thông báo không tìm
thấy
• Ý tưởng: So sánh tuần tự ai với khóa k
(với 1≤ i ≤ N), nếu ai = k thì đưa ra i hoặc thông báo không tìm thấy
Trang 5B5: Nếu i > N thì thông báo dãy A không có
số hạng nào có giá trị bằng k rồi kết thúc
B6: Quay lại bước 3
Trang 6Bài tóan trên có dãy A là một
dãy số bất kỳ, vậy nếu cho dãy
A là dãy đã sắp xếp (tăng hoặc giảm) thì nên tìm kiếm như thế nào cho nhanh?
Trang 7Ví dụ: Cho dãy không giảm a1, …, a1000
(a1<a2<a3<a4<…<a1000) và khóa k = 5000
Giả sử a1000 = 5000
Câu hỏi:
• Với thuật tóan tìm kiếm tuần tự, phải thực hiện bao nhiêu phép so sánh mới xác định được vị trí số cần tìm?
• Có cách nào tìm kiếm nhanh hơn không? (lợi dụng tính không giảm của dãy số)
Trang 8Ý tưởng : thu hẹp phạm vi tìm kiếm bằng cách so sánh k với số hạng ở giữa dãy
a1, a2, …, a(N+1)/2, … aN-1, aN
Nếu k < a(N+1)/2
Tìm kiếm trong phạm vi này
Nếu k > a(N+1)/2
Tìm kiếm trong phạm vi này
Nếu k = a [(N+1)/2] thì thông báo chỉ số (N+1)/2
Trang 9Cho dãy A tăng a1, a2, …, a10 và k = 55
Làm thế nào để tìm ra vị trí của số hạng có giá trị bằng 55 nhanh nhất?
Xác định vị trí ở giữa – gọi là aGiua, nếu aGiua < k thì tìm trong
đọan a1 aGiua, ngược lại tìm trong đọan aGiua a10
Xác định aGiua như thế nào?
Tiếp tục: Xác định lại vị trí đầu, giữa, cuối trong dãy mới:
Dau = 9; Cuoi = 10; aGiua = a[(9+10)/2] = a9
vì a5 < k nên tìm k trong đọan a6 a10
vì a9 = k nên thông báo chỉ số Giua (=9), kết thúc.
VÍ DỤ MINH HỌA Ý TƯỞNG
vì a8 < k nên tiếp tục tìm k trong đọan a9, a10
Trang 10Ý tưởng trên gọi là tìm kiếm nhị phân (hay chia để trị) giúp giảm
bớt thao tác so sánh
Trang 11Tiết 14: Bài toán & thuật tóan (t5)
Thuật tóan tìm kiếm nhị phân
Xét bài tóan :
Cho dãy số A gồm N số nguyên tăng khác nhau a1, a2, …, aN và số nguyên k, nếu có
ai = k (1 ≤ k ≤ N) thì thông báo chỉ số i
Trang 12Tiết 14: Bài toán & thuật tóan (t5)
Thuật tóan tìm kiếm nhị phân
• Xác định bài tóan:
- Input: Dãy A là dãy tăng gồm N số nguyên đôi một khác nhau a 1 , a 2 , , a N và một số
nguyên k;
- Output: Chỉ số i mà a i = k hoặc thông báo
không có số hạng nào của dãy A có giá trị
bằng k.
• Ý tưởng:
Trang 13Ý tưởng : Sử dụng tính chất dãy A là dãy tăng, ta tìm cách
thu hẹp nhanh phạm vi tìm kiếm sau mỗi lần so sánh
khoá với số hạng được chọn Để làm điều đó, ta chọn số
hạng a Giua ở "giữa dãy" để so sánh với k;
Khi đó, chỉ xảy ra một trong ba trường hợp sau:
Nếu a Giua = k thì Giua là chỉ số cần tìm Việc tìm kiếm kết
thúc.
Nếu a Giua > k thì do dãy A là dãy đã được sắp xếp nên
việc tìm kiếm tiếp theo chỉ xét trên dãy a 1 , a 2 , , a Giua–1
(phạm vi tìm kiếm mới bằng khoảng một nửa phạm vi
tìm kiếm trước đó)
Nếu a Giua < k thì thực hiện tìm kiếm trên dãy aGiua+1 , a Giua+2 , ,
a N
Quá trình trên sẽ được lặp lại một số lần cho đến khi
hoặc đã tìm thấy khoá k trong dãy A hoặc phạm vi tìm kiếm bằng rỗng.
Trang 14•Thuật toán tìm kiếm nhị phân (Cách liệt kê)
Trang 15• Ở bước 7 có thể thay Dau>Cuoi bằng Dau=Cuoi được không? Giải thích?
Trang 16Không thể được, hãy xem:
Nếu [đầu] = [cuối] thì vẫn còn một số hạng nữa
phải so sánh với khoá k
Trang 17Thông báo dãy A không
có số hạng có giá trị bằng k rồi kết thúc
Giua ← [(Dau + Cuoi)/2]
Trang 18• Hãy diễn đạt ý tưởng của thuật
tóan tìm kiếm nhị phân?
• Ý tưởng này có ý nghĩa thực tế
không? Cho ví dụ?
Trang 19(gợi ý: Cho một dãy cụ thể và một giá trị k>aN rồi mô phỏng lại thuật tóan để kiểm tra).
Trang 20Trả lời
a Có thể hóan vị B4 và B5
b Không thể thay phép gán ở B6 bằng
lặp vô tận khi không có số hạng nào bằng k.
Ví dụ: Cho dãy 0, 1, 2, 3, 5 và k = 4
trên đọan [2, 3, 5]
Trang 22H Ế T