Вещественный двоичный поиск — различия между версиями
|  (→Источники) |  (→Способы закончить поиск) | ||
| Строка 11: | Строка 11: | ||
| == Способы закончить поиск == | == Способы закончить поиск == | ||
| {| class="wikitable" | {| class="wikitable" | ||
| − | ! Способы || Плюсы || Минусы   | + | ! Способы || Плюсы || Минусы || Оценка на число итераций | 
| |- | |- | ||
| − | | 1) Окончание, когда рассматриваемый отрезок станет меньше заданного эпсилон. || Заданная точность найденного значения. || Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел | + | | 1) Окончание, когда рассматриваемый отрезок станет меньше заданного эпсилон (= <tex> \varepsilon </tex>). || Заданная точность найденного значения. || Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел, у которых есть точность. При больших значениях функции длина отрезка может никогда не уменьшиться до заданного значения. || В данном случае нам нужно рассмотреть <tex> (L-R)/\varepsilon </tex> чисел => примерное число итераций <tex> log((L-R)/\varepsilon) </tex>. | 
| |- | |- | ||
| − | | 2) Окончание, когда значение функции на концах отрезках различается менее, чем на заданное эпсилон. || Значение функции от найденного значения имеет заданную точность. || а) Возможна большая погрешность, если функция будет очень медленно возрастать. <br> б) Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел | + | | 2) Окончание, когда значение функции на концах отрезках различается менее, чем на заданное эпсилон (= <tex> \varepsilon </tex>). || Значение функции от найденного значения имеет заданную точность. || а) Возможна большая погрешность, если функция будет очень медленно возрастать. <br> б) Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел, у которых есть точность. При быстром возрастании значений функции мы можем не найти такие границы, что значение на них различается менее, чем на заданное <tex> \varepsilon </tex>. || Аналогичная с первым случаем логика, примерное число итераций <tex> log((f(L)-f(R))/\varepsilon) </tex>. | 
| |- | |- | ||
| − | | 3) «Абсолютно точный поиск» <br> Окончание, когда границы отрезка — два соседних по представлению значения в типе данных. Утверждается, что два числа — соседние, если середина их отрезка совпадает или с левой, или с правой границей. || Максимально возможная точность найденного значения. || Возможно плохое поведение, если искомый аргумент равен  | + | | 3) «Абсолютно точный поиск» <br> Окончание, когда границы отрезка — два соседних по представлению значения в типе данных. Утверждается, что два числа — соседние, если середина их отрезка совпадает или с левой, или с правой границей. || Максимально возможная точность найденного значения. || Возможно плохое поведение, если искомый аргумент равен нулю. || При работе с числами с плавающей точкой количество итераций зависит от плотности чисел на данном отрезке. При работе с числами фиксированной точности     (= <tex>\varepsilon</tex>) количество итераций аналогично первому и второму случаю равно <tex> log((L-R)/\varepsilon) </tex>. | 
| |- | |- | ||
| − | | 4) «Итеративный способ» <br> Выполнение конечного числа итераций. || У способа фиксированная погрешность. || Довольно плохая точность, если границы отрезка находятся на большом расстоянии. | + | | 4) «Итеративный способ» <br> Выполнение конечного числа итераций. || У способа фиксированная погрешность. || Довольно плохая точность, если границы отрезка находятся на большом расстоянии. || Выполняется заданное количество итераций. | 
| |} | |} | ||
Версия 07:37, 10 июня 2014
Вещественный двоичный поиск — алгоритм поиска аргумента для заданного значения монотонной вещественной функции.
Содержание
Формулировка задачи
Пусть нам задана монотонная функция. Необходимо найти значение аргумента этой функции, в которой она принимает определенное значение .
Решение задачи
Применим идею двоичного поиска. Выберем такие границы, где значение функции точно больше и точно меньше заданного значения. Выберем значение в середине этого отрезка. Если оно меньше, чем заданное, то сместим левую границу в середину отрезка. В противном случае сместим правую границу. Далее повторим процесс сужения границ. Встает вопрос, когда остановиться. Есть несколько способов сделать это.
Способы закончить поиск
| Способы | Плюсы | Минусы | Оценка на число итераций | 
|---|---|---|---|
| 1) Окончание, когда рассматриваемый отрезок станет меньше заданного эпсилон (= ). | Заданная точность найденного значения. | Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел, у которых есть точность. При больших значениях функции длина отрезка может никогда не уменьшиться до заданного значения. | В данном случае нам нужно рассмотреть чисел => примерное число итераций . | 
| 2) Окончание, когда значение функции на концах отрезках различается менее, чем на заданное эпсилон (= ). | Значение функции от найденного значения имеет заданную точность. | а) Возможна большая погрешность, если функция будет очень медленно возрастать. б) Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел, у которых есть точность. При быстром возрастании значений функции мы можем не найти такие границы, что значение на них различается менее, чем на заданное . | Аналогичная с первым случаем логика, примерное число итераций . | 
| 3) «Абсолютно точный поиск» Окончание, когда границы отрезка — два соседних по представлению значения в типе данных. Утверждается, что два числа — соседние, если середина их отрезка совпадает или с левой, или с правой границей. | Максимально возможная точность найденного значения. | Возможно плохое поведение, если искомый аргумент равен нулю. | При работе с числами с плавающей точкой количество итераций зависит от плотности чисел на данном отрезке. При работе с числами фиксированной точности (= ) количество итераций аналогично первому и второму случаю равно . | 
| 4) «Итеративный способ» Выполнение конечного числа итераций. | У способа фиксированная погрешность. | Довольно плохая точность, если границы отрезка находятся на большом расстоянии. | Выполняется заданное количество итераций. | 
Выбор границы отрезка для поиска
Для начала найдем правую границу. Выберем произвольную положительную точку (например ). Будем удваивать ее до тех пор, пока значение функции в этой точке меньше заданного. Для того, чтобы найти левую границу выберем произвольную отрицательную точку (например ). Будем удваивать ее до тех пор, пока значение в ней будет больше заданного значения.
Псевдокод
findLeft(c): 
    x = -1
    while f(x) > c 
        x = x * 2
    return x 
findRight(c):
    x = 1
    while f(x) < c
        x = x * 2
    return x
binSearch(c):
    left = findLeft(с)
    right = findRight(с)
    while left < right - eps                           //Здесь можно использовать другое условие выхода
        mid = (left + right) / 2
        if f(mid) == c                                 //**
            return mid                                 //**
        else if f(mid) < c
            left = mid
        else
            right = mid
    return l
Примеры использования
- Классической задачей на вещественный двоичный поиск является задача поиска корня -ой степени из числа : . При нижней границей для поиска будет , а верхней — .
- Если функция нестрого монотонна, то, убрав из приведенного выше алгоритма строки, отмеченные , мы получим алгоритм, который будет находить такой, что и .
Замечания
- Необходимо отметить, то функция должна быть строго монотонна, если мы ищем конкретный корень и он единственный. Нестрого монотонна, если нам необходимо найти самый левый (правый) аргумент. Если же функция не монотонна, то данный алгоритм не найдет искомый аргумент, либо найдет аргумент, но он не будет единственным.
- Важным отличием от целочисленного поиска является то, что мы передвигаем границу ровно в середину отрезка (), а не со смещением внутрь отрезка ().

