Một số ví dụ về thuật toánVí dụ 3: Bài toán tìm kiếm aTìm kiếm tuần tự bTìm kiếm nhị phân... Quá trình trên được lặp đi lặp lại cho đến khi tìm được OUTPUT... Hãy sửa đổi thuật toán tìm
Trang 33 Một số ví dụ về thuật toán
Ví dụ 3: Bài toán tìm kiếm
a)Tìm kiếm tuần tự b)Tìm kiếm nhị phân
Trang 5** Xác định bài toán :
• Input :
• 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 6**Ý 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[(1+N)/2], … aN-1, aN
Nếu k < a[(N+1)/2] Nếu k > a[(N+1)/2]
Tìm kiếm trong phạm vi này Tìm kiếm trong phạm vi này
Giua = [ (1 + N)/2]
Trang 7Túm lại: Do dãy A là một dãy tăng dần nên khi ta so sánh k với phần tử ở Giữa dãy xảy ra một trong ba trư ờng hợp
- Nếu aGiữa= k => tìm được chỉ số, kết thúc;
- Nếu aGiữa > k => do dãy A đã được sắp xếp tăng
nên việc tìm kiếm thu hẹp chỉ xét từ a1 aGiữa - 1;
- Nếu aGiữa < k => do dãy A đã được sắp xếp tăng
nên việc tìm kiếm thu hẹp chỉ xét từ aGiữa + 1 aN.
Quá trình trên được lặp đi lặp lại cho đến khi tìm
được OUTPUT.
Trang 8Tiế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,
Nếu a Giua > k thì tìm trong đoạn a 1 a Giua -1
a Giua = a [(1+10)/2] = a 5
a1 a2 a3 a4 a5 a6 a7 a8 a9 a10
vì a 5 < k nên tìm k trong đoạn a 6 a 10
Cho dãy A gồm 10 phần tử a1, a2, …, aN và số k = 55
Trang 10Bước 1: Nhập N, các số hạng a 1 , a 2 , , a N và khóa k
Bước 4: Nếu aGiua = k thì thông báo chỉ số Giua, rồi kết
thúc.
bước 7
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
* Cách liệt kê
Trang 11a Giua = k ?
Nhập n và a 1 , a 2 , , a N , k
Dau 1 ; Cuoi n
Đưa ra Giua
rồi kết thúc
Giua [(Dau + Cuoi ) /2]
Đ a Giua > K ?
Dau Giua+1
Cuoi Giua - 1
Dau > Cuoi ?
S
Đ
S
Đ
S
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
Sơ đồ khối
Trang 12Đưa ra vị
trí 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?
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?
Đ
S
Đ S
S
22
9 6
5 4
2
Nhập N; dãy a 1 , ,a N ; K Dau 1 ; Cuoi N
Giua [ (Dau + Cuoi)/2 ]
A Giua = K?
K = 21
A Giua >K?
Dau Giua + 1
Dau
7
Dau >
Cuoi?
Giua [ (Dau + Cuoi)/2 ] Giua
A Giua = K? 21 22 30 31 33
S
A Giua >K?
7
Cuoi Giua -1
Cuoi
S
Dau >
Cuoi?
7 6
Giua [ (Dau + Cuoi)/2 ]
Giua
A Giua = K?
22 21
Đưa ra vị
trí Giua rồi
kết thúc
Giua = 6
22
21
7
5 4
3 2
1
A
Trang 13Bài 1: Cho dãy A gồm các phần tử a1, a2, , aN được sắp xếp giảm dần Hãy sửa đổi thuật toán tìm kiếm nhị phân với dãy tăng dần thành thuật toán tìm kiếm nhị phân với dãy giảm dần
Trang 14Trả lời :
Thời gian thực hiện tìm kiếm của thuật toán nhị
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
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 ?