binary_search
Формулировка задачи: Узнать, находится ли данный элемент в отсортированном массиве подобных элементов, для которых задано отношение порядка на множестве. Т.е. имея в наличии два элемента, можно однозначно определить операцию <. Сложность O(log(N)).
Реализация:
- bool binary_search(const vector<int> &mas, const int &value)
- {
- int l = 0, r = mas.size()-1;
- while (l<r)
- {
- int m = (l+r)>>1;
- if (mas[m] < value)
- l = m +1;
- else if (mas[m] > value)
- r = m - 1;
- else
- return true;
- }
- return mas[l] == value;
- }
* This source code was highlighted with Source Code Highlighter.
lower_bound
Формулировка задачи: В отсортированном массиве найти позицию самого левого вхождения заданного элемента. Если элемента в в массиве нет, то вернуть –1. Сложность O(log(N)).
Реализация:
- int lower_bound(const vector<int> &mas, const int &value)
- {
- int l = 0, r = mas.size() - 1;
- while (l < r)
- {
- int m = l + (r - l)/2;
- if (mas[m] >= value)
- r = m;
- else
- l = m + 1;
- }
- return mas[l] == value ? l : -1;
- }
* This source code was highlighted with Source Code Highlighter.
upper_bound
Формулировка задачи: В отсортированном массиве найти позицию самого правого вхождения заданного элемента. Если элемента в массиве нет, то вернуть –1. Сложность O(log(N)).
Реализация:
- int upper_bound (const vector<int> &mas, const int &value)
- {
- int l = 0, r = mas.size() - 1;
- while (l < r)
- {
- int m = r - (r - l)/2;
- if (mas[m] <= value)
- l = m;
- else
- r = m - 1;
- }
- return mas[l] == value ? l : -1;
- }
* This source code was highlighted with Source Code Highlighter.
Предлагаю везде добавить квалификаторы const vector & mas
ОтветитьУдалитьэто было бы неплохо. В обозримом будущем предложу другую реализацию. Более интуитивно понятную
ОтветитьУдалитьПо просьбе трудящихся переписал lower_bound и upper_bound на более интутивнопонятные реализации
ОтветитьУдалить