#include <bits/stdc++.h>
using namespace std;
// Tìm kiếm tuần tự / tìm kiếm tuyến tính (Linear Search)
// Tìm kiếm nhị phân (Binary Search)
/*
Ví dụ bài toán
- Nhập vào dãy a có n chữ số tự nhiên, tìm xem x có trong dãy a hay không
*/
int n, x;
int a[1000];
void LinearSearch(int a[], int n, int x) // Tìm kiếm tuyến tính
{
for(int i = 0 ; i < n ; i ++)
if(a[i] == x)
{
cout << "yes";
return ; // quay lại lên trên (bỏ toàn bộ code dưới nó nếu nó thực thi và kết thúc chương trình)
}
cout << "no";
} // độ phức tạp thời gian: O(n) --> tức bỏ vào 1 tỷ phần tử thì chạy 1 tỷ lần (không tệ 8/10)
void BinarySearch(int a[], int n, int x) // Tìm kiếm nhị phân O(log2n)
{
int l = 0, r = n - 1;
while(l <= r)
{
int mid = (l + r) / 2;
if(a[mid] < x)l = mid + 1;
else if(a[mid] > x)r = mid - 1;
else if(a[mid] == x)
{
cout << "yes";
return ;
}
}
cout << "no";
} // Độ phức tạp thời gian: O(log2n)
int main()
{
cin >> n >> x;
for(int i = 0 ; i < n ; i ++)cin >> a[i];
LinearSearch(a, n, x);
cout << endl;
BinarySearch(a, n, x);
}
/*
Lưu ý: Trong bài toán tìm kiếm nhị phân, đầu vào phải là một dãy tăng dần
mid = (l + r) / 2
Tức là vị trí của mid bị ảnh hưởng bởi 2 biến số l và r
l = 0, r = 10;
mid = (0 + 10) / 2
mid = 5
--> dịch qua phải: thay đổi giá trị l (cận trái): l = mid + 1;
--> dịch qua trái: thay đổi giá trị r (cận phải): r = mid - 1;
- l = 0, r = 4 (mid - 1)
- mid = (l + r) / 2 = 2
- l = 3, r = 4
- mid = (l + r) / 2 = 3
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgovLyBUw6xtIGtp4bq/bSB0deG6p24gdOG7sSAvIHTDrG0ga2nhur9tIHR1eeG6v24gdMOtbmggKExpbmVhciBTZWFyY2gpCi8vIFTDrG0ga2nhur9tIG5o4buLIHBow6JuIChCaW5hcnkgU2VhcmNoKQovKgpWw60gZOG7pSBiw6BpIHRvw6FuCi0gTmjhuq1wIHbDoG8gZMOjeSBhIGPDsyBuIGNo4buvIHPhu5EgdOG7sSBuaGnDqm4sIHTDrG0geGVtIHggY8OzIHRyb25nIGTDo3kgYSBoYXkga2jDtG5nCiovCgppbnQgbiwgeDsKaW50IGFbMTAwMF07Cgp2b2lkIExpbmVhclNlYXJjaChpbnQgYVtdLCBpbnQgbiwgaW50IHgpIC8vIFTDrG0ga2nhur9tIHR1eeG6v24gdMOtbmgKewogICAgZm9yKGludCBpID0gMCA7IGkgPCBuIDsgaSArKykKICAgICAgICBpZihhW2ldID09IHgpIAogICAgICAgIHsKICAgICAgICAgICAgY291dCA8PCAieWVzIjsKICAgICAgICAgICAgcmV0dXJuIDsgLy8gcXVheSBs4bqhaSBsw6puIHRyw6puIChi4buPIHRvw6BuIGLhu5kgY29kZSBkxrDhu5tpIG7DsyBu4bq/dSBuw7MgdGjhu7FjIHRoaSB2w6Aga+G6v3QgdGjDumMgY2jGsMahbmcgdHLDrG5oKQogICAgICAgIH0KICAgIGNvdXQgPDwgIm5vIjsKfSAvLyDEkeG7mSBwaOG7qWMgdOG6oXAgdGjhu51pIGdpYW46IE8obikgLS0+IHThu6ljIGLhu48gdsOgbyAxIHThu7cgcGjhuqduIHThu60gdGjDrCBjaOG6oXkgMSB04bu3IGzhuqduIChraMO0bmcgdOG7hyA4LzEwKQoKdm9pZCBCaW5hcnlTZWFyY2goaW50IGFbXSwgaW50IG4sIGludCB4KSAvLyBUw6xtIGtp4bq/bSBuaOG7iyBwaMOibiBPKGxvZzJuKQp7CiAgICBpbnQgbCA9IDAsIHIgPSBuIC0gMTsKICAgIHdoaWxlKGwgPD0gcikKICAgIHsKICAgICAgICBpbnQgbWlkID0gKGwgKyByKSAvIDI7CiAgICAgICAgaWYoYVttaWRdIDwgeClsID0gbWlkICsgMTsKICAgICAgICBlbHNlIGlmKGFbbWlkXSA+IHgpciA9IG1pZCAtIDE7CiAgICAgICAgZWxzZSBpZihhW21pZF0gPT0geCkKICAgICAgICB7CiAgICAgICAgICAgIGNvdXQgPDwgInllcyI7CiAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgfQogICAgfQogICAgY291dCA8PCAibm8iOwp9IC8vIMSQ4buZIHBo4bupYyB04bqhcCB0aOG7nWkgZ2lhbjogTyhsb2cybikKCgppbnQgbWFpbigpCnsKICAgIGNpbiA+PiBuID4+IHg7CiAgICBmb3IoaW50IGkgPSAwIDsgaSA8IG4gOyBpICsrKWNpbiA+PiBhW2ldOwogICAgTGluZWFyU2VhcmNoKGEsIG4sIHgpOwogICAgY291dCA8PCBlbmRsOwogICAgQmluYXJ5U2VhcmNoKGEsIG4sIHgpOwp9CgovKgpMxrB1IMO9OiBUcm9uZyBiw6BpIHRvw6FuIHTDrG0ga2nhur9tIG5o4buLIHBow6JuLCDEkeG6p3UgdsOgbyBwaOG6o2kgbMOgIG3hu5l0IGTDo3kgdMSDbmcgZOG6p24KbWlkID0gKGwgKyByKSAvIDIKClThu6ljIGzDoCB24buLIHRyw60gY+G7p2EgbWlkIGLhu4sg4bqjbmggaMaw4bufbmcgYuG7n2kgMiBiaeG6v24gc+G7kSBsIHbDoCByCmwgPSAwLCByID0gMTA7Cm1pZCA9ICgwICsgMTApIC8gMgptaWQgPSA1CgotLT4gZOG7i2NoIHF1YSBwaOG6o2k6IHRoYXkgxJHhu5VpIGdpw6EgdHLhu4sgbCAoY+G6rW4gdHLDoWkpOiBsID0gbWlkICsgMTsKLS0+IGThu4tjaCBxdWEgdHLDoWk6IHRoYXkgxJHhu5VpIGdpw6EgdHLhu4sgciAoY+G6rW4gcGjhuqNpKTogciA9IG1pZCAtIDE7CgotIGwgPSAwLCByID0gNCAobWlkIC0gMSkKLSBtaWQgPSAobCArIHIpIC8gMiA9IDIKCi0gbCA9IDMsIHIgPSA0Ci0gbWlkID0gKGwgKyByKSAvIDIgPSAzCgoqLw==