Двоичный поиск, чтобы найти самый большой элемент, меньший или равный другому элементу - PullRequest
1 голос
/ 18 апреля 2020

Я стремлюсь к функции бинарного поиска, которая задает элемент в векторе, ищет элемент, который находится ближе всего к этому элементу, но все же меньше или равен ему. Однако мой код приводит к мусорным числам. Вот мой код:

int close(vector<int> r, vector<int> g, int pos){
    int lastpos = 0;
    int mid = int((r.size())/2);
    while(mid>=1){
        if(r[lastpos+mid]>g[pos]){}
        else{
            lastpos += mid;
            if(r[lastpos+1]>g[pos] || r[lastpos]==r[r.size()-1]){
                return r[lastpos];
            }
        }
        mid/=2;
    }
    return r[0];
}

Например, если я вызываю функцию с помощью (r, g, 1) и мне дается, что g [1] = 3, а вектор r содержит {1 , 3, 4}, эта функция установит середину на 3/2, но округлит ее до целого числа, то есть единицы. Последняя позиция (lastpos) по умолчанию установлена ​​в 0. Теперь моя функция проверит, если r [lastpos + mid]> g [pos] или 3> 3. Это не потому, что они равны. Теперь моя функция перейдет к условию else и добавит mid к lastpos. Теперь lastpos = 1. Теперь он проверит, если r [lastpos + 1]> g [pos], чтобы увидеть, является ли это минимальное значение, которое ближе всего и меньше или равно g [1]. Поскольку следующий элемент равен 4, а 4 больше 3, он вернет 3.

Однако, если lastpos является конечным элементом, он просто вернет конечный элемент, поскольку больше нет чисел для проверки. ,

Исключения : Если в векторе r нет такого элемента, который меньше или равен элементу в векторе g, он вернет первый элемент в векторе r.

Примечание : эти векторы отсортированы

...