Lớp 10A8
Kính chào quý thầy cô giáo
đến dự giờ !
Kiểm tra bài cũ
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ự?
Trả lời
Trả lời
Bài toán tìm kiếm:
•
Input: Dãy A gồm N số hạng a
1
, a
2
, …, a
N
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ự a
i
với khóa k (với
1≤ i ≤ N), nếu a
i
= k thì đưa ra i hoặc thông
báo không tìm thấy
BÀI TOÁN TÌM KiẾM NHỊ PHÂN
BÀ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 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 tìm thấy k trong dãy A
Ý tưởng thuật toán tìm kiếm nhị phân:
Ý tưởng thuật toán tìm kiếm nhị phân:
thu
thu
hẹp phạm vi tìm kiếm bằng cách so sánh
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
k với số hạng ở giữa dãy
a
1
, a
2
, …, a
(N+1)/2
, … a
N-1
, a
N
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
< a
(N+1)/2
> a
(N+1)/2
Tiếp tục: Xác định lại vị trí đầu, giữa, cuối trong
dãy mới:
Dau = 6; Cuoi = 10
a
Giua
= a
[(6+10)/2]
= a
8
,
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 a
Giua
như thế nào?
a
Giua
= a
[(1+10)/2]
= a
5
Cho dãy A tăng a
Cho dãy A tăng a
1
1
, a
, a
2
2
, …, a
, …, a
10
10
và k = 55
và k = 55
22 40 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?
a
1
a
2
a
3
a
4
a
5
a
6
a
7
a
8
a
9
a
10
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
A
Giua
> K?
Bước 1: Nhập N, các số hạng a
1
,
a
2
, , a
N
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
Thuật
toán
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
Sai
Đúng
Thô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
76
21 22
Giua = 6
Giua
CuoiDau
Dau
CuoiDau
2221 30 31 33
76 8 9
10
76 8 9
10
54321i
A 2221 30 31 3396542
Giua
Thô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
76
21 22
Giua
Cuoi
Dau
Dau
CuoiDau
2221 30 31 33
76 8 9
10
76 8 9
10
54321i
A 2221 30 31 3396542
Giua
7
22
Cuoi
Dau
Giua = 7 Dau = 8
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ầ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Ố
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 ?
H
H
Ế
Ế
T
T
Xin cảm ơn và tạm biệt
quý thầy cô giáo !