Рубрики

Функции бинарного поиска в C ++ STL (binary_search, lower_bound и upper_bound)

Бинарный поиск является важным компонентом в конкурентном программировании или любом алгоритмическом соревновании, поскольку знание стенографических функций сокращает время их кодирования. Этот поиск работает только тогда, когда контейнер отсортирован . Связанные функции обсуждаются ниже.

1.binary_search (start_ptr, end_ptr, num) : эта функция возвращает логическое значение true, если элемент присутствует в контейнере, иначе возвращает значение false.

// C ++ код для демонстрации работы binary_search ()

  
#include<bits/stdc++.h> 

using namespace std;

  

int main()

{

    // инициализируем вектор целых чисел

    vector<int> arr = {10, 15, 20, 25, 30, 35};

      

    // использование двоичного_поиска для проверки существования 15

    if (binary_search(arr.begin(), arr.end(), 15))

       cout << "15 exists in vector";

    else 

       cout << "15 does not exist";

       

    cout << endl;

      

    // использование двоичного_поиска для проверки существования 23

    if (binary_search(arr.begin(), arr.end(), 23))

         cout << "23 exists in vector";

    else 

         cout << "23 does not exist";

       

    cout << endl;    

}

Выход:

15 exists in vector
23 does not exist

2. lower_bound (start_ptr, end_ptr, num) : возвращает указатель на « позицию num », если контейнер содержит 1 вхождение num. Возвращает указатель на « первую позицию num », если контейнер содержит несколько вхождений num. Возвращает указатель на « позицию следующего большего числа, чем num », если контейнер не содержит вхождения num. Вычитая указатель на 1-ю позицию, т.е. vect.begin () возвращает фактический индекс.

// C ++ код для демонстрации работы lower_bound ()
#include<bits/stdc++.h> 

using namespace std;

  

int main()

{

    // инициализируем вектор целых чисел

    // для одного случая

    vector<int> arr1 = {10, 15, 20, 25, 30, 35};

      

    // инициализируем вектор целых чисел

    // для нескольких случаев

    vector<int> arr2 = {10, 15, 20, 20, 25, 30, 35};

      

    // инициализируем вектор целых чисел

    // без происшествий

    vector<int> arr3 = {10, 15, 25, 30, 35};    

      

    // использование lower_bound () для проверки существования 20

    // единичное вхождение

    // печатает 2

    cout << "The position of 20 using lower_bound "

            " (in single occurrence case) : ";

    cout << lower_bound(arr1.begin(), arr1.end(), 20) 

            - arr1.begin();

       

    cout << endl;

      

    // использование lower_bound () для проверки существования 20

    // множественное вхождение

    // печатает 2

    cout << "The position of 20 using lower_bound "

             "(in multiple occurrence case) : ";

    cout << lower_bound(arr2.begin(), arr2.end(), 20) 

            - arr2.begin();

       

    cout << endl;

       

    // использование lower_bound () для проверки существования 20

    // нет вхождения

    // печатает 2 (индекс следующего выше)

    cout << "The position of 20 using lower_bound "

             "(in no occurrence case) : ";

    cout << lower_bound(arr3.begin(), arr3.end(), 20) 

            - arr3.begin();

       

    cout << endl;    

}

Выход:

The position of 20 using lower_bound (in single occurrence case) : 2
The position of 20 using lower_bound (in multiple occurrence case) : 2
The position of 20 using lower_bound (in no occurrence case) : 2

3. upper_bound (start_ptr, end_ptr, num) : возвращает указатель на « позицию следующего большего числа, чем num », если контейнер содержит 1 вхождение num. Возвращает указатель на « первую позицию следующего более высокого числа, чем последнее вхождение num », если контейнер содержит несколько вхождений num. Возвращает указатель на « позицию следующего большего числа, чем num », если контейнер не содержит вхождения num. Вычитая указатель на 1-ю позицию, т.е. vect.begin () возвращает фактический индекс.

// C ++ код для демонстрации работы upper_bound ()
#include<bits/stdc++.h> 

using namespace std;

  

int main()

{

    // инициализируем вектор целых чисел

    // для одного случая

    vector<int> arr1 = {10, 15, 20, 25, 30, 35};

      

    // инициализируем вектор целых чисел

    // для нескольких случаев

    vector<int> arr2 = {10, 15, 20, 20, 25, 30, 35};

      

    // инициализируем вектор целых чисел

    // без происшествий

    vector<int> arr3 = {10, 15, 25, 30, 35};

      

      

    // использование upper_bound () для проверки существования 20

    // единичное вхождение

    // печатает 3

    cout << "The position of 20 using upper_bound"

           " (in single occurrence case) : ";

    cout << upper_bound(arr1.begin(), arr1.end(), 20)

            - arr1.begin();

       

    cout << endl;

      

    // использование upper_bound () для проверки существования 20

    // множественное вхождение

    // печатает 4

    cout << "The position of 20 using upper_bound "

             "(in multiple occurrence case) : ";

    cout << upper_bound(arr2.begin(), arr2.end(), 20) 

            - arr2.begin();

       

    cout << endl;

       

    // использование upper_bound () для проверки существования 20

    // нет вхождения

    // печатает 2 (индекс следующего выше)

    cout << "The position of 20 using upper_bound"

            " (in no occurrence case) : ";

    cout << upper_bound(arr3.begin(), arr3.end(), 20) 

           - arr3.begin();

       

    cout << endl;    

}

Выход:

The position of 20 using upper_bound (in single occurrence case) : 3
The position of 20 using upper_bound (in multiple occurrence case) : 4
The position of 20 using upper_bound (in no occurrence case) : 2

Эта статья предоставлена Манджитом Сингхом (HBD.N) . Если вы как GeeksforGeeks и хотели бы внести свой вклад, вы также можете написать статью с помощью contribute.geeksforgeeks.org или по почте статьи contribute@geeksforgeeks.org. Смотрите свою статью, появляющуюся на главной странице GeeksforGeeks, и помогите другим вундеркиндам.

Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Функции бинарного поиска в C ++ STL (binary_search, lower_bound и upper_bound)

0.00 (0%) 0 votes