Viết hàm thực hiện tìm kiếm nhị phân nhận hai tham số đầu vào: dãy số a và giá trị x cần tìm.
Câu 26. Thuật toán tìm kiếm nhị phân là tìm kiếm bằng cách:
A. Chia dãy làm hai nửa, loại bỏ nửa dãy chắc chắn không chứa phần tử cần tìm, chỉ tìm kiếm trong nửa dãy còn lại.
B. Chọn phần tử lớn nhất trong dãy chưa sắp xếp còn lại và xếp vào đầu dãy đó
C. Tìm kiếm tuần tự đảm bảo không bỏ sót, cho đến khi tìm thấy hoặc hết dãy và không tìm thấy.
Em hãy thực hiện các yêu cầu sau:
1. Viết mã giả cho thuật toán tìm kiếm nhị phân.
2. Ước lượng số lần thực hiện vòng lặp trong thuật toán tìm kiếm nhị phân.
3. Ước lượng độ phức tạp thời gian của thuật toán tìm kiếm nhị phân.
Sau lần chia đôi đầu tiên, pham vi tìm kiếm còn lại n/2 số, sau khi chia đôi lần thứ hai, dãy còn lại n/4 số, sau khi chia đôi lần thứ dãy còn lại n/8, …sau khi chia đôi lần k dãy còn lại n/2.mũ k. Kết thúc khi 2 mũ k sấp xỉ n.
cho dãy a là dãy gồm N(<=250)số nguyên dương A1...An và số nguyên k hãy tìm kiếm số nguyên k trong dãy a
xác định bài toán
Viết thuật toán tìm kiếm nhị phân cho bài toán
#include <bits/stdc++.h>
using namespace std;
long long i,n,x,k;
int main()
{
cin>>n>>k;
for (i=1; i<=n; i++)
{
cin>>x;
if (x==k) cout<<i<<" ";
}
return 0;
}
Em hãy thực hiện các yêu cầu sau:
a) Viết chương trình phython thực hiện tìm kiếm tuần tự
b) Viết phiên bản tìm kiếm tuần tự thứ hai, dùng vòng lặp for thay cho vòng lặp while (hoặc ngược lại).
c) Viết phiên bản tìm kiếm tuần tự có thêm hai tham số đầu vào lo và hi tương tự như của hàm index. So sánh kết quả với phương thức index của Python.
Tham khảo:
a. Viết chương trình phython thực hiện tìm kiếm tuần tự
def search(arr, n, x):
for i in range (0, n):
if (arr[i] == x):
return i;
return -1;
# Driver Code
arr = [ 2, 3, 4, 10, 40 ];
x = 10;
n = len(arr);
result = search(arr, n, x)
if(result == -1):
print("Element is not present in array")
else:
print("Element is present at index", result);
b. Viết phiên bản tìm kiếm tuần tự thứ hai, dùng vòng lặp for thay cho vòng lặp while (hoặc ngược lại).
def search(arr, n, x):
for i in range (0, n):
if (arr[i] == x):
return i;
return -1;
# Driver Code
arr = [ 2, 3, 4, 10, 40 ];
x = 10;
n = len(arr);
result = search(arr, n, x)
if(result == -1):
print("Element is not present in array")
else:
print("Element is present at index", result);
c. Viết phiên bản tìm kiếm tuần tự có thêm hai tham số đầu vào lo và hi tương tự như của hàm index. So sánh kết quả với phương thức index của phython.
def search(arr, n, x):
for i in range (0, n):
if (arr[i] == x):
return i;
return -1;
# Driver Code
arr = [ 2, 3, 4, 10, 40 ];
x = 10;
n = len(arr);
result = search(arr, n, x)
if(result == -1):
print("Element is not present in array")
else:
print("Element is present at index", result);
Theo em, với dãy đã sắp thứ tự và cho một số x cụ thể
a) Trường hợp nào tìm kiếm tuần tự nhanh hơn tìm kiếm nhị phân?
b) Về trung bình thuật toán tìm kiếm tuần tự hay thuật toán tìm kiếm nhị phân tốt hơn?
a. Ví dụ một bài toán tìm kiếm trong thực tế: Giáo viên muốn tìm tên bạn Chung trong danh sách lớp sau:
Các bước thực hiện thuật toán tìm kiếm nhị phân cho bài toán trên:
- Bước 1: Xét vị trí ở giữa dãy, đó là vị trí số 5
- Vì sau bước 2 đã tìm thấy tên học sinh nên thuật toán kết thúc.
b) Thuật toán tìm kiếm nhị phân
- Thuật toán tìm kiếm nhị phân thu hẹp được phạm vi tìm kiếm chỉ còn tối đa là một nửa sau mỗi lần lặp. Thuật toán chia bài toán thành những bài toán nhỏ hơn giúp tăng hiệu quả tìm kiếm.
Thuật toán tuần tự
- Mô tả thuật toán phải cụ thể, rõ ràng, đầy đủ, đầu vào là gì, đầu ra là gì và chỉ rõ sự kết thúc thuật toán.
- Cần mô tả thuật toán cho tốt thì người máy hay máy tính mới hiểu đúng và thực hiện được.
- Nếu không, kết quả thực hiện thuật toán có thể không như mong đợi.
Cho dãy A = {0, 4, 9, 10, 12,14, 17, 18, 20, 31, 34, 67}. Với thuật toán tìm kiếm nhị phân, cần duyệt bao nhiêu phần tử để tìm ra phân tử có giá trị bằng 34?
Để tìm phần tử có giá trị bằng 34 trong dãy A = {0, 4, 9, 10, 12, 14, 17, 18, 20, 31, 34, 67} bằng thuật toán tìm kiếm tuần tự, ta sẽ duyệt qua từng phần tử của dãy cho đến khi tìm thấy phần tử cần tìm.
Vì phần tử 34 nằm ở vị trí thứ 11 trong dãy, nên số lần duyệt cần thực hiện để tìm ra phần tử này là 11 lần, bao gồm cả phần tử 34.
Vậy, cần duyệt qua 11 phần tử để tìm ra phần tử có giá trị bằng 34 trong dãy A
Cho hàm số f(x) có đạo hàm liên tục trên và thỏa mãn f ( x ) > 0 , ∀ ∈ ℝ . Biết f(0) = 1 và f ' x f x = 2 - 2 x . Tìm các giá trị thực của tham số m để phương trình f(x) = m có hai nghiệm thực phân biệt.
A. m > e
B. 0 < m ≤ 1
C. 0 < m < e
D. 1 < m < e
Đáp án C
Với f x > 0 , ∀ x ∈ ℝ . Xét biểu thức f ' x f x = 2 - 2 x *
Lấy nguyên hàm 2 vế (*), ta được ∫ d f x f x = ∫ 2 - 2 x d x
⇔ ∫ d f x f x = - x 2 + 2 x + C ⇔ ln f x = - x 2 + 2 x + C
Mà f(0) =1 suy ra C = lnf(0) = ln1 = 0. Do đó f x = e - x 2 + 2 x
Xét hàm số f x = e - x 2 + 2 x trên - ∞ ; + ∞ , có f ' x = - 2 x + 2 = 0 ⇔ x = 1
Tính giá trị f 1 = e ; lim x → - ∞ f x = 0 ; lim x → - ∞ f x = 0
Suy ra để phương trình f(x) = m có hai nghiệm thực phân biệt ⇔ 0 < m < e .
Tìm tất cả giá trị của tham số thực m để đường thẳng d : y = x + m cắt đồ thị hàm số y = − x + 1 2 x − 1 tại hai điểm phân biệt A, B.
A. m < 0
B. m ∈ ℝ
C. m > 1
D. m = 5
Đáp án là B.
Phương trình hoàng độ giao điểm của
C & d : x + m 2 x − 1 = − x + 1 ; x ≠ 1 2
⇔ 2 x 2 + 2 m x − m − 1 = 0 (1)
C & d cắt nhau tại hai điểm phân biệt khi và chỉ khi phương trình (1) có hai nghiệm phân biệt và khác 1 2 .
Khi đó: m 2 + 2 m + 2 > 0 − 1 2 ≠ 0 ⇔ m ∈ ℝ .
Tìm giá trị thực của tham số m để đường thẳng d : y = x - m + 2 cắt đồ thị hàm số y = 2 x x - 1 tại hai điểm phân biệt A và B sao cho độ dài AB ngắn nhất.
A. m = - 3
B. m = 3
C. m = - 1
D. m = 1
Xét phương trình hoành độ giao điểm:
Để đường thẳng d cắt (C) tại 2 điểm phân biệt ⇔ p t * có 2 nghiệm phân biệt khác 1.
Gọi x A ; x B là 2 nghiệm phân biệt của (*), áp dụng định lí Vi-ét ta có:
Chọn D.