shalimo
@shalimo
1С Программист

Помогите с алгоритмом

Есть упорядоченный массив целых чисел и ещё два целых числа, задающие некоторый интервал. Нужно с помощью алгоритма бинарного поиска определить сколько чисел из массива принадлежат заданному интервалу.
  • Вопрос задан
  • 2493 просмотра
Пригласить эксперта
Ответы на вопрос 3
apangin
@apangin
    static int binarySearch(int[] A, int n) {
        int left = 0;
        int right = A.length;
        if (right == 0 || n > A[right - 1]) {
            return right;
        }

        while (left < right - 1) {
            int mid = (left + right) / 2;
            if (A[mid] <= n) {
                left = mid;
            } else {
                right = mid;
            }
        }
        return A[left] >= n ? left : right;
    }

    int leftIndex = binarySearch(A, left);
    int rightIndex = binarySearch(A, right + 1);
    int countBetweenLeftAndRight = rightIndex - leftIndex;
Ответ написан
Комментировать
Horse
@Horse
Все очень просто. С помощью алгоритма бинарного поиска находите сначало первое число, потом второе.
Разница их индексов и будет искомым количеством. В завимости от точной постановки может нужно будет убрать еденицу.
Подозреваю что язык паскаль. Тогда код поиска будет подобен этому.

{foo — искомая величина. а и б — границы поиска}
procedure Find(foo: integer; a: integer; b: integer);
var c: integer;
begin
if (b-a) > 1 then
begin
c:= (a+b) div 2;
find(foo,a,c);
find(foo,c,b);
end else
begin
if (array_[a] = foo) then Result := a;
if (array_[b] = foo) then Result := b;
end;
end;
Ответ написан
@MikhailEdoshin
Если язык позволяет (C, например), можно несколько ускорить нахождение второго числа после того, как найдено первое, задав для поиска меньший интервал.

Хотя на современных шибко умных процессорах это не обязательно будет быстрее.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы