3. 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 ** 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: Ý tưởng: thu hẹp phạm vi tìm kiếm bằ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 cách so sánh k với số hạng ở giữa dãy a 1 , a 2 , …, a [(1+N)/2] , … a N-1 , a N 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 < a [(1+N)/2] > a [(1+N)/2] Giua = [ (1 + N)/2] Nếu k = a Giua thì thông báo chỉ số Giua Túm li: 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 a Giữa = k => tìm được chỉ số, kết thúc; - Nếu a Giữ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ừ a 1 a Giữa - 1 ; - Nếu a Giữ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ừ a Giữa + 1 a N . Quá trình trên được lặp đi lặp lại cho đến khi tìm được OUTPUT. 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ì đưa ra Giua rồi kết thúc. Nếu a Giua > k thì tìm trong đoạn a 1 a Giua -1 Ngược lại tìm trong đoạn a Giua+1 a 10 Xác định a Giua như thế nào? a Giua = a [(1+10)/2] = a 5 22 55 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10 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ử a 1 , a 2 , …, a N và số k = 55 Ta thấy a 8 - = k = 55, đưa ra Giua = 8 (hay i = 8) 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 toán Thuật toán * Cách liệt kê [...]... Cuoi Giua - 1 S S Dau Giua+1 Dau > Cuoi ? Đ 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 N = 10 Dau Nhập N; dãy a1, ,aN ; K K = 21 Cuoi Giua 1 Dau 1 ; Cuoi N A 2 3 4 5 6 7 8 9 10 2 4 5 6 9 21 22 30 31 33 Giua [ (Dau + Cuoi)/2 ] Đ Dau 21 6 AGiua = K? Đưa ra vò trí Giua rồi kết thúc S 22 7 30 8 Cuoi 31 9 Giua S AGiua >K? Giua Đ Dau 21 6 Cuoi Giua -1 Dau Giua + 1 Dau... 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 tht to¸n t×m kiÕm nhÞ ph©n víi d·y t¨ng dÇn thµnh tht to¸n t×m kiÕm nhÞ ph©n víi d·y gi¶m dÇn 1/ Hãy cho biếtthời gian thực 14 18 20 thuật tốn 3/ 2/ Cho dãy A = điều kiện cần phải có để có thể sử so sánh 3 6 7 9 11 hiện giữa dụng thuật tốn tìm và tìm kiếm nhị phân tìm kiếm tuần tự kiếm nhị phân ? a) Hãy : phỏng việc thực hiện . Xác định a Giua như thế nào? a Giua = a [(1+10)/2] = a 5 22 55 a 1 a 2 a 3 a 4 a 5 a 6 a 7 a 8 a 9 a 10 vì a 5 < k nên tìm k trong đoạn a 6 a 10 Cho. 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