Дихотомия. Бин поиск

231
04 марта 2017, 05:20

Имеется массив 1 и 0, размером N.

1 1 1 1 1 0 0 0 0 0 0

Нужно за logN определить место на котором стоит самая правая(последняя единица). Если единиц нет вовсе вывести -1.

В голову пришел бинарный поиск:
- если попали на ноль, идем влево
- если единица пробуем расширится пройдясь правее

Но с написанием кода возникли проблемы (((

Answer 1

Вы можете воспользоваться либо стандартным алгоритмом std::upper_bound с использованием 1 в качестве аргумента, или алгоритмом std::lower_bound с использованием 0 в качестве аргумента.

Например,

#include <iostream>
#include <functional>
#include <iterator>
#include <algorithm>
int main()
{
    int a[] = { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, };
    auto it = std::upper_bound(std::begin(a), std::end(a),
        1, std::greater<int>());
    if (it != std::begin(a))
    {
        std::cout << "The last 1 is at the position "
            << std::distance(std::begin(a), std::prev(it))
            << std::endl;
    }
    else
    {
        std::cout << "There is no 1 in the array" << std::endl;
    }
}

Вывод программы на консоль

The last 1 is at the position 4

Вместо выражения

std::distance(std::begin(a), std::prev(it))

вы можете использовать выражение

std::distance(std::begin(a), it) - 1

И тогда вы получите искомую позицию, если 1 присутствует в массиве или -1, если нет ни одной 1.

Answer 2

Вместо псевдокода приведу javascript

function search(arr) { 
  // стартовый диапазон 
  let start = 0, end = arr.length; 
  do { 
    // середина 
    let middle = Math.floor((end-start)/2)+start; 
 
    if (arr[middle] == 1) { 
      start = middle; // обрезаем половину со старта 
    } else { 
      end = middle;   // обрезаем половину с хвоста 
    } 
  } while(end - start > 1); // остался один элемент 
  return arr[start] == 1 ? start : -1; // нашли? 
} 
 
console.log(search([1,1,1,0,0,0,0,0])); // 2 
console.log(search([1,1,1,1,1,0,0,0])); // 4 
console.log(search([1,0,0,0,0,0,0,0])); // 0 
console.log(search([0,0,0,0,0,0,0,0])); // -1

READ ALSO
ошибка java.lang.NullPointerException

ошибка java.lang.NullPointerException

Доброго времени суток! Учусь работать в среде netbeans IDE 81 на ubuntu

264
signed int vs unsigned int (undefined behaviour ситуации)

signed int vs unsigned int (undefined behaviour ситуации)

Если говорить просто и коротко, то меня интересует: количество и примеры undefined behaviour для каждого из этих типов

317
Получение минут и секунд из полного времени в виде строки

Получение минут и секунд из полного времени в виде строки

Есть функция _tctime которая форматирует число в строку следующего формата:

196
Как грамотно вычесть несколько минут из текущего времени в С++?

Как грамотно вычесть несколько минут из текущего времени в С++?

Уважаемые коллеги! Производственная необходимость просит написать текущее время за минусом 10 минут и у меня не очень-то получаетсяНапомню,...

225