Thực hành tìm kiếm tuần tự¶
Tóm lược nội dung
Bài này hướng dẫn cách giải một số bài toán liên quan đến thuật toán tìm kiếm tuần tự:
- Tính tần số xuất hiện.
- Xác định vị trí xuất hiện đầu tiên và cuối cùng.
- Kiểm tra số chính phương.
Lưu ý: các bài tập này dùng cho mục đích luyện tập thuật toán tìm kiếm tuần tự, cho nên cách giải đề xuất trong bài viết chưa chắc là tốt nhất.
Bài 1¶
Đề bài¶
Yêu cầu:
Áp dụng thuật toán tìm kiếm tuần tự, viết chương trình tính tần số của giá trị k trong mảng một chiều A.
Đầu vào:
Mảng một chiều A và giá trị k.
Đầu vào:
Tần số của k.
Ví dụ:
| Đầu vào | Đầu ra | Giải thích |
|---|---|---|
| [1, 7, 4, 0, 9, 4, 8, 8, 2, 4, 5, 5] 4 |
3 | Số 4 xuất hiện 3 lần |
Cách giải đề xuất¶
Ý tưởng chính
Gọi counter là bộ đếm, dùng để lưu tần số của k.
Duyệt mảng A từ đầu đến cuối: ứng với mỗi phần tử A[i] bằng k, ta tăng biến đếm counter thêm 1 đơn vị.
Viết chương trình
0. Nạp thư viện numpy.
1. Viết hàm occurrence() dùng để tính tần số của k trong A.
Hàm gồm có:
- Hai tham số đầu vào là mảng
Avà giá trịk. - Giá trị trả về là tần số.
Hàm hoạt động như sau:
- Khởi tạo biến
counterlà0. - Duyệt mảng
A: nếuA[i] == kthì cộng thêm 1 chocounter.
3. Viết chương trình chính.
- Khởi tạo mảng
arr. - Cho người dùng nhập giá trị cần tính tần số, lưu vào biến
key. - Gọi hàm
occurrence()ra thực hiện và gán kết quả trả về cho biếnc. - In ra tần số
c.
Bài 2¶
Đề bài¶
Yêu cầu:
Áp dụng thuật toán tìm kiếm tuần tự, viết chương trình xác định vị trí xuất hiện đầu tiên và cuối cùng của một giá trị k trong mảng một chiều A đã có thứ tự tăng dần.
Đầu vào:
Mảng một chiều A tăng dần và giá trị k.
Đầu vào:
Vị trí bắt đầu và vị trí kết thúc.
Ví dụ:
| Đầu vào | Đầu ra |
|---|---|
| [0, 1, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 7, 8, 8, 9] 4 |
Vị trí bắt đầu: 3 Vị trí kết thúc: 12 |
Cách giải đề xuất¶
Ý tưởng chính
Ta dùng thuật toán tìm kiếm tuần tự để xác định vị trí xuất hiện đầu tiên của k.
Ta cũng dùng thuật toán này nhưng với chiều duyệt từ cuối ngược về đầu để xác định vị trí xuất hiện cuối cùng.
Viết chương trình
1. Nạp thư viện numpy.
2. Viết hàm find_first_occurrence() dùng để tìm vị trí xuất hiện đầu tiên.
Hàm gồm có:
- Hai tham số đầu vào là mảng
Atăng dần và giá trịk. - Giá trị trả về là vị trí đầu tiên tìm thấy.
2. Viết hàm find_last_occurrence() dùng để tìm vị trí xuất hiện cuối cùng.
Hàm gồm có:
- Hai tham số đầu vào là mảng
Atăng dần và giá trịk. - Giá trị trả về là vị trí cuối cùng tìm thấy.
Hàm hoạt động như sau:
- Duyệt từ cuối mảng ngược về đầu: nếu
A[i] == kthì trả vềi.
4. Viết chương trình chính.
- Khởi tạo mảng
arr. - Cho người dùng nhập giá trị
key. - Gọi hàm
find_first_occurrence()ra thực hiện và gán kết quả trả về cho biếnfirst. - Gọi hàm
find_last_occurrence()ra thực hiện và gán kết quả trả về cho biếnlast. - In ra
firstvàlast.
Bài 3¶
Đề bài¶
Yêu cầu:
Áp dụng thuật toán tìm kiếm tuần tự, viết chương trình kiểm tra xem số nguyên dương \(n (n > 1)\) có phải là số chính phương không.
Đầu vào:
Số nguyên dương n.
Đầu ra:
Là số chính phương hoặc không.
Ví dụ:
| Đầu vào | Đầu ra |
|---|---|
| 81 | Là số chính phương |
| 82 | Không phải là số chính phương |
| 6241 | Là số chính phương |
Cách giải đề xuất¶
Ý tưởng chính
Nếu tồn tại một giá trị \(i\) sao cho \(i^2\) bằng \(n\) thì \(n\) là số chính phương.
Ngược lại, không tồn tại \(i\) thì \(n\) không phải là số chính phương.
Do đó, ta dùng thuật toán tìm kiếm tuần tự để tìm \(i\) này, bắt đầu từ \(2\).
Viết chương trình
1. Viết hàm is_square_number() để kiểm tra chính phương.
Hàm gồm có tham số n là số cần kiểm tra.
Giá trị trả về là i hoặc -1.
Hàm hoạt động như sau:
-
Dùng vòng lặp cho
ichạy từ2đếnn // 2 + 1. (Vì \(\sqrt{n}\) không vượt quá \(\frac{n}{2} + 1\)):- Nếu
i * i == nthì trả vềi. - Nếu
i * i > nthì trả về-1.
- Nếu
2. Viết chương trình chính.
- Gọi hàm
is_square_number()ra thực hiện và gán kết quả trả về cho biếns. - Dựa vào giá trị của
s, in ra thông báo là chính phương hoặc không.
Mã nguồn¶
Code đầy đủ được đặt tại: