Hãy nhập câu hỏi của bạn vào đây, nếu là tài khoản VIP, bạn sẽ được ưu tiên trả lời.
Đáp án : 1. Phần tử có giá trị nhỏ nhất trong dãy được tìm thấy và đổi chỗ cho phần tử đứng đầu dãy.
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll a[]={10,2,5,12,20,6,8,15,18}; //mảng đã cho
ll n=sizeof(a)/sizeof(a[0]); //độ dài mảng
sort(a,a+n); //sắp xếp mảng
//Thuật toán tìm kiếm nhị phân
ll l=0, r=n-1;
while(l<=r) {
ll mid=(l+r)/2; //Tìm phần tử giữa left và right
if(a[mid]<15) l=mid+1; //Vì từ đoạn [0,mid] thì phần tử nhỏ hơn 15 nên ta duyệt từ khoảng (mid,r]
else r=mid-1; //vì thấy nên rút r để thu hẹp phạm vi
}
cout << l+1; //in ra kq (vì bắt đầu từ 0 đến n-1 nên phải tăng thêm để ra vị trí đúng)
}
(Bạn có thể dựa vào code mình để rút ra các bước)
Chúc bạn học tốt!
Sự khác biệt cơ bản nhất là thuật toán tìm kiếm nhị phân yêu cầu dữ liệu phải được sắp xếp, trong khi thuật toán tìm kiếm tuần tự không có yêu cầu này. Ngoài ra, cách thức tìm kiếm của thuật toán nhị phân là chia để trị, còn thuật toán tuần tự là duyệt lần lượt từng phần tử
Tìm kiếm tuần tự duyệt từng phần tử một, không cần sắp xếp. Tìm kiếm nhị phân chia đôi danh sách mỗi bước, cần sắp xếp trước.
Vì tìm kiếm nhị phân cần danh sách đã sắp xếp để biết chắc phần tử cần tìm nằm ở bên trái hay bên phải. Nếu không sắp xếp, ta không thể loại bỏ nửa danh sách một cách chính xác
Cách làm theo tìm kiếm nhị phân:
- Xác định khoảng cần tìm: từ 1001 đến 1500.
- Tìm số ở giữa: \(\frac{1001 + 1500}{2} = 1250 , 5 \approx 1250\).
- So sánh 1320 với 1250. Vì 1320 > 1250, ta bỏ nửa trái (1001 → 1250), chỉ giữ nửa phải (1251 → 1500).
- Lấy số giữa của khoảng mới: \(\frac{1251 + 1500}{2} = 1375 , 5 \approx 1375\).
- So sánh 1320 với 1375. Vì 1320 < 1375, ta bỏ nửa phải (1375 → 1500), chỉ giữ nửa trái (1251 → 1374).
- Lấy số giữa của khoảng mới: \(\frac{1251 + 1374}{2} = 1312 , 5 \approx 1312\).
- So sánh 1320 với 1312. Vì 1320 > 1312, ta bỏ nửa trái, giữ nửa phải (1313 → 1374).
- Lấy số giữa: \(\frac{1313 + 1374}{2} = 1343 , 5 \approx 1343\).
- So sánh 1320 với 1343. Vì 1320 < 1343, ta giữ nửa trái (1313 → 1342).
- Lấy số giữa: \(\frac{1313 + 1342}{2} = 1327 , 5 \approx 1327\).
- So sánh 1320 với 1327. Vì 1320 < 1327, ta giữ nửa trái (1313 → 1326).
- Lấy số giữa: \(\frac{1313 + 1326}{2} = 1319 , 5 \approx 1319\).
- So sánh 1320 với 1319. Vì 1320 > 1319, ta giữ nửa phải (1320 → 1326).
- Lấy số giữa: \(\frac{1320 + 1326}{2} = 1323\).
- So sánh 1320 với 1323. Vì 1320 < 1323, ta giữ nửa trái (1320 → 1322).
- Lấy số giữa: \(\frac{1320 + 1322}{2} = 1321\).
- So sánh 1320 với 1321. Vì 1320 < 1321, ta giữ nửa trái (1320 → 1320).
- Còn lại đúng một số 1320 → tìm thấy chiếc điện thoại cần mua. ✅
[An, Bình, Hòa, Liên, Mai, Phương, Trang, Trúc, Tước] (Tổng cộng có 9 phần tử, đánh số vị trí từ 1 đến 9).a) So sánh số bước thực hiện của hai thuật toán:- Thuật toán tìm kiếm tuần tự: Sẽ kiểm tra lần lượt từ đầu danh sách: bước 1 gặp "An", bước 2 gặp "Bình", bước 3 gặp "Hòa" (Tìm thấy). Số bước thực hiện: 3 bước.
- Thuật toán tìm kiếm nhị phân:
- Bước 1: Tìm phần tử ở giữa danh sách (vị trí số 5 là "Mai"). Vì "Hòa" đứng trước "Mai" trong bảng chữ cái, ta thu hẹp phạm vi về nửa trái
[An, Bình, Hòa, Liên]. - Bước 2: Tìm phần tử ở giữa khoảng mới (vị trí số 2 là "Bình"). Vì "Hòa" đứng sau "Bình", ta thu hẹp phạm vi về nửa phải
[Hòa, Liên]. - Bước 3: Tìm phần tử ở giữa khoảng mới (vị trí số 3 là "Hòa") \(\rightarrow \) Tìm thấy. Số bước thực hiện: 3 bước.
- Bước 1: Tìm phần tử ở giữa danh sách (vị trí số 5 là "Mai"). Vì "Hòa" đứng trước "Mai" trong bảng chữ cái, ta thu hẹp phạm vi về nửa trái
- Kết luận: Trong trường hợp cụ thể này, cả hai thuật toán đều mất 3 bước thực hiện để tìm ra tên "Hòa".
- Phạm vi tìm kiếm ban đầu: Từ vị trí 1 đến 9.
- Bước 1:
- Vị trí giữa là: \(\frac{1 + 9}{2} = 5\) (Tên ở vị trí 5 là "Mai").
- So sánh: "Hòa" đứng trước "Mai" trong bảng chữ cái.
- Thu hẹp phạm vi tìm kiếm sang nửa trái: Từ vị trí 1 đến 4
[An, Bình, Hòa, Liên].
- Bước 2:
- Vị trí giữa là: \(\frac{1 + 4}{2} = 2.5 \approx 2\) (Tên ở vị trí 2 là "Bình").
- So sánh: "Hòa" đứng sau "Bình" trong bảng chữ cái.
- Thu hẹp phạm vi tìm kiếm sang nửa phải: Từ vị trí 3 đến 4
[Hòa, Liên].
- Bước 3:
- Vị trí giữa là: \(\frac{3 + 4}{2} = 3.5 \approx 3\) (Tên ở vị trí 3 là "Hòa").
- So sánh: Trùng khớp với tên cần tìm.
- Kết luận: Tìm thấy khách hàng tên "Hòa" ở vị trí số 3. Thuật toán dừng lại.
2. Câu hỏi của bạn Gia Bảo Bùi: Tìm số 12 và bài toán ExcelBài 1: Vận dụng thuật toán tìm kiếm tuần tự tìm số 12 trong danh sách
[2, 6, 8, 4, 9, 12, 15]Các bước thực hiện bằng ngôn ngữ tự nhiên:- Bước 1: So sánh số cần tìm (12) với phần tử thứ nhất (2). Không bằng nhau.
- Bước 2: So sánh với phần tử thứ hai (6). Không bằng nhau.
- Bước 3: So sánh với phần tử thứ ba (8). Không bằng nhau.
- Bước 4: So sánh với phần tử thứ tư (4). Không bằng nhau.
- Bước 5: So sánh với phần tử thứ năm (9). Không bằng nhau.
- Bước 6: So sánh với phần tử thứ sáu (12). Trùng khớp!
- Kết luận: Tìm thấy số 12 ở vị trí thứ 6 trong danh sách và kết thúc thuật toán.
A2 = 1, A3 = 2, B3 = 3, B4 = 4.- Tại ô
C4có công thức=A2*B3. Giá trị tại ôC4sẽ là: \(1 \times 3 = \mathbf{3}\). - Nếu sao chép công thức từ ô
C4dán vào ôC5(dịch xuống 1 hàng): - Công thức tại ô
C5sẽ tự động tịnh tiến các hàng lên 1 đơn vị:=A3*B4. - Giá trị tại ô
C5sẽ là: \(2 \times 4 = \mathbf{8}\).
- Công thức tại ô
3. Câu hỏi của bạn phương thảo: Sắp xếp và tìm kiếm tên "Thắng"a) Sắp xếp lại danh sách theo thứ tự bảng chữ cái (A \(\rightarrow \) Z):Danh sách ban đầu:
[Châu, Dũng, Hà, Ánh, Bảo, Linh, Thắng, Nhàn, Quyên]- Sau khi sắp xếp:
[Ánh, Bảo, Châu, Dũng, Hà, Linh, Nhàn, Quyên, Thắng](Gồm 9 phần tử, đánh số từ vị trí 1 đến 9).
- Bước 1:
- Vị trí giữa danh sách là: \(\frac{1 + 9}{2} = 5\) (Tên ở vị trí 5 là "Hà").
- So sánh: "Thắng" đứng sau "Hà" trong bảng chữ cái.
- Giữ lại nửa phải: Từ vị trí 6 đến 9
[Linh, Nhàn, Quyên, Thắng].
- Bước 2:
- Vị trí giữa khoảng mới là: \(\frac{6 + 9}{2} = 7.5 \approx 7\) (Tên ở vị trí 7 là "Nhàn").
Chọn \(A\).