Главная страница
Навигация по странице:

  • Определение: Правосторонний бинарный поиск

  • Определение: Левосторонний бинарный поиск

  • Эвристика с завершением поиска, при досрочном нахождении искомого элемента

  • Эвристика с запоминанием ответа на предыдущий запрос

  • Динамическое программирование

  • Порядок пересчёта

  • ответы сессия довгалюк 2 семестр. Определение Правосторонний бинарный поиск


    Скачать 3.01 Mb.
    НазваниеОпределение Правосторонний бинарный поиск
    Анкорответы сессия довгалюк 2 семестр
    Дата10.02.2022
    Размер3.01 Mb.
    Формат файлаdocx
    Имя файлаAlgoritmy.docx
    ТипДокументы
    #357616
    страница1 из 11
      1   2   3   4   5   6   7   8   9   10   11

    Принцип работы[править]

    Двоичный поиск заключается в том, что на каждом шаге множество объектов делится на две части и в работе остаётся та часть множества, где находится искомый объект. Или же, в зависимости от постановки задачи, мы можем остановить процесс, когда мы получим первый или же последний индекс вхождения элемента. Последнее условие — это левосторонний/правосторонний двоичный поиск.

    Правосторонний/левосторонний целочисленный двоичный поиск[править]

    Для простоты дальнейших определений будем считать, что a[−1]=−∞a[−1]=−∞ и что a[n]=+∞a[n]=+∞ (массив нумеруется с 00).

    Определение:

    Правосторонний бинарный поиск (англ. rightside binary search) — бинарный поиск, с помощью которого мы ищем maxi∈[−1,n−1]{i∣a[i]⩽x}maxi∈[−1,n−1]{i∣a[i]⩽x}, где aa — массив, а xx — искомый ключ



    Определение:

    Левосторонний бинарный поиск (англ. leftside binary search) — бинарный поиск, с помощью которого мы ищем mini∈[0,n]{i∣a[i]⩾x}mini∈[0,n]{i∣a[i]⩾x}, где aa — массив, а xx — искомый ключ


    Использовав эти два вида двоичного поиска, мы можем найти отрезок позиций [l,r][l,r] таких, что ∀i∈[l,r]:a[i]=x∀i∈[l,r]:a[i]=x и ∀i∉[l,r]:a[i]≠x∀i∉[l,r]:a[i]≠x

    Пример:[править]

    Задан отсортированный массив [1,2,2,2,2,3,5,8,9,11],x=2[1,2,2,2,2,3,5,8,9,11],x=2.

    Правосторонний поиск двойки выдаст в результате 44, в то время как левосторонний выдаст 11 (нумерация с нуля).

    Отсюда следует, что количество подряд идущих двоек равно длине отрезка [1;4][1;4], то есть 44.

    Если искомого элемента в массиве нет, то правосторонний поиск выдаст максимальный элемент, меньший искомого, а левосторонний наоборот, минимальный элемент, больший искомого.

    Алгоритм двоичного поиска[править]

    Идея поиска заключается в том, чтобы брать элемент посередине, между границами, и сравнивать его с искомым. Если искомое больше(в случае правостороннего — не меньше), чем элемент сравнения, то сужаем область поиска так, чтобы новая левая граница была равна индексу середины предыдущей области. В противном случае присваиваем это значение правой границе. Проделываем эту процедуру до тех пор, пока правая граница больше левой более чем на 1

    Несколько слов об эвристиках[править]

    Эвристика с завершением поиска, при досрочном нахождении искомого элемента

    Заметим, что если нам необходимо просто проверить наличие элемента в упорядоченном множестве, то можно использовать любой из правостороннего и левостороннего поиска. При этом будем на каждой итерации проверять "не попали ли мы в элемент, равный искомому", и в случае попадания заканчивать поиск.

    Эвристика с запоминанием ответа на предыдущий запрос

    Пусть дан отсортированный массив чисел, упорядоченных по неубыванию. Также пусть запросы приходят в таком порядке, что каждый следующий не меньше, чем предыдущий. Для ответа на запрос будем использовать левосторонний двоичный поиск.

    Алгоритм может быть определен в рекурсивной и нерекурсивной формах.

    Бинарный поиск также называют поиском методом деления отрезка пополам или дихотомии.

    Количество шагов поиска определится как

    log2n,
    Все эти задачи решаются бинарным поиском за O(logn).
    Динамическое программирование — метод решения задачи путём её разбиения на несколько одинаковых подзадач, рекуррентно связанных между собой. Самым простым примером будут числа Фибоначчи

    Решение задачи динамическим программированием должно содержать следующее:

    · Зависимость элементов динамики друг от друга. Такая зависимость может быть прямо дана в условии (так часто бывает, если это задача на числовые последовательности). В противном случае вы можете попытаться узнать какой-то известный числовой ряд (вроде тех же чисел Фибоначчи), вычислив первые несколько значений вручную. Если вам совсем не повезло — придётся думать

    · Значение начальных состояний. В результате долгого разбиения на подзадачи вам необходимо свести функцию либо к уже известным значениям (как в случае с Фибоначчи — заранее определены первые два члена), либо к задаче, решаемой элементарно
    Чтобы успешно решить задачу динамикой нужно:
    1) Состояние динамики: параметр(ы), однозначно задающие подзадачу.
    2) Значения начальных состояний.
    3) Переходы между состояниями: формула пересчёта.
    4) Порядок пересчёта.
    5) Положение ответа на задачу: иногда это сумма или, например, максимум из значений нескольких состояний.

    Порядок пересчёта
    Существует три порядка пересчёта:
    1) Прямой порядок:
    Состояния последовательно пересчитывается исходя из уже посчитанных.



    2) Обратный порядок:
    Обновляются все состояния, зависящие от текущего состояния.



    3) Ленивая динамика:
    Рекурсивная мемоизированная функция пересчёта динамики. Это что-то вроде поиска в глубину по ацикличному графу состояний, где рёбра — это зависимости между ними.


    Графы

    Поиск в глубину (англ. depth-first search, DFS) – это рекурсивный алгоритм обхода вершин графа. Если метод поиска в ширину производился симметрично (вершины графа просматривались по уровням), то данный метод предполагает продвижение вглубь до тех пор, пока это возможно. Невозможность дальнейшего продвижения, означает, что следующим шагом будет переход на последний, имеющий несколько вариантов движения (один из которых исследован полностью), ранее посещенный узел (вершина).

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


      1   2   3   4   5   6   7   8   9   10   11


    написать администратору сайта