Kiểm tra bài cũNhắc lại ý tưởng của thuật toán tìm kiếm tuần tự?... BÀI TOÁN TÌM KiẾM NHỊ PHÂN2... Trả lời :Thời gian thực hiện tìm kiếm của thuật toán nhị phân nhanh hơn thuật toán tuầ
Trang 1Lớp 10A8 Kính chào quý thầy cô giáo
đến dự giờ !
Trang 2Kiểm tra bài cũ
Nhắc lại ý tưởng của thuật
toán tìm kiếm tuần tự?
Trang 3Trả lời
Bài toán tìm kiếm:
• Input: Dãy A gồm N số hạng a1, a2, …, aN
và khóa k
Output: 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 4BÀI TOÁN TÌM KiẾM NHỊ PHÂN
2 Xác định bài toán :
• Input :
– Dãy A là dãy tăng gồm N số nguyên
khác nhau a1, a2, ., aN và một số nguyên k
• Output :
– Chỉ số i mà a i = k hoặc thông báo không tìm thấy k trong dãy A
Trang 5Ý tưởng thuật toán tìm kiếm nhị phân: 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
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 6Tiếp tục: Xác định lại vị trí đầu, giữa, cuối trong dãy mới:
Dau = 6; Cuoi = 10
aGiua = a[(6+10)/2] = a8,
Xác định vị trí ở giữa – gọi là a Giua, nếu a Giua >
k thì tìm trong đoạn a 1 a Giua, ngược lại tìm trong đoạn a Giua a 10
Xác định aGiua như thế nào?
aGiua = a[(1+10)/2] = a5
Cho 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?
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
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; a Giua = a [(9+10)/2] = a 9
vì a 5 < k nên tìm k trong đoạn a 6 a 10
vì a 9 = k nên thông báo chỉ số Giua (=9), kết thúc
vì a8 < k nên tiếp tục tìm k trong đoạn a9, a10
Trang 7A Giua > K?
Bước 1: Nhập N, các số hạng a1,
a2, , aN và khóa k
Bước 2: Dau ← 1 , Cuoi ← N
Bước 3: Giua ← [(Dau+ Cuoi)/2]
Bước 4: Nếu a Giua = k thì thông
báo chỉ số Giua, rồi kết thúc.
Bước 5: Nếu a Giua > k thì Cuoi =
Giua - 1, rồi chuyển đến bước 7
Bước 6: Dau ← Giua + 1
Bước 7: Nếu Dau > Cuoi thì
thông báo dãy A không có số
hạng có giá trị bằng k, rồi kết thúc
Bước 8: Quay lại bước 3
Thuật
toán
Đưa ra Giua,
rồi kết thúc
Nhập N; dãy a 1 , ,a N ; K Dau 1 ; Cuoi N
Giua [ (Dau + Cuoi)/2 ]
A Giua = K?
Dau Giua + 1
Cuoi Giua -1
Thông báo K không
có trong dãy số
A, rồi kết thúc
Dau>Cuoi?
Sai Sai
Đúng Đúng
Trang 8Thông báo K không có trong dãy số A, rồi kết thúc
Cuoi Giua -1
A Giua = K?
Nhập N; dãy a1, ,aN ; K
Dau 1 ; Cuoi N
Dau Giua + 1
Sai
A Giua > K?
Dau>Cuoi?
Giua [ (Dau + Cuoi)/2 ]
Đưa ra Giua
rồi kết thúc
Sai
Đúng
Đúng
Sai
Đúng
N = 10 K = 21
Giua Cuoi
7 6
21 22
Giua = 6
Giua
Cuoi Dau
Dau
Cuoi Dau
22
21 30 31 33
7
6 8 9 10
7
6 8 9 10 5
4 3
2 1
i
A 2 4 5 6 9 21 22 30 31 33
Giua
Trang 9Thông báo K không có trong dãy số A, rồi kết thúc
Cuoi Giua -1
A Giua = K?
Nhập N; dãy a1, ,aN ; K
Dau 1 ; Cuoi N
Dau Giua + 1
Sai
A Giua > K?
Dau>Cuoi?
Giua [ (Dau + Cuoi)/2 ]
Đưa ra Giua
rồi kết thúc
Sai
Đúng
Đúng
Sai
Đúng
N = 10 K = 25
Giua Cuoi
7 6
21 22 Giua
Cuoi Dau
Dau
Cuoi Dau
22
21 30 31 33
7
6 8 9 10
7
6 8 9 10 5
4 3
2 1
i
A 2 4 5 6 9 21 22 30 31 33
Giua
7
22
Cuoi Dau
Giua = 7 Dau = 8
Trang 10Trả lời :
Thời gian thực hiện tìm kiếm của thuật toán nhị phân nhanh hơn thuật toán tuần tự, hạn
chế đáng kể số lượng phép toán so sánh trong thuật toán.
2/ Hãy so sánh thời gian thực hiện giữa thuật
toán tìm kiếm tuần tự và tìm kiếm nhị phân
Trả lời :
Dãy đã cho phải là một dãy có thứ tự.
1/ Hãy cho biết điều kiện cần phải có để có thể
sử dụng thuật toán tìm kiếm nhị phân ?
a) Hãy mô phỏng việc thực hiện tìm kiếm nhị
phân, với khóa cần tìm k = 6 ?
3/ Cho dãy A = 3 6 7 9 11 14 18 20
CỦNG CỐ
a) Hãy mô phỏng việc thực hiện tìm kiếm nhị
phân, với khóa cần tìm k = 15 ?
Trang 11Xin cảm ơn và tạm biệt
quý thầy cô giáo !