<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
		<id>http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.66.186.45&amp;*</id>
		<title>Викиконспекты - Вклад участника [ru]</title>
		<link rel="self" type="application/atom+xml" href="http://neerc.ifmo.ru/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=178.66.186.45&amp;*"/>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/178.66.186.45"/>
		<updated>2026-05-05T10:10:03Z</updated>
		<subtitle>Вклад участника</subtitle>
		<generator>MediaWiki 1.30.0</generator>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA&amp;diff=37290</id>
		<title>Вещественный двоичный поиск</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA&amp;diff=37290"/>
				<updated>2014-05-23T19:55:37Z</updated>
		
		<summary type="html">&lt;p&gt;178.66.186.45: /* Способы закончить поиск */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Вещественный двоичный поиск''' {{---}} алгоритм поиска аргумента для заданного значения монотонной вещественной функции.&lt;br /&gt;
&lt;br /&gt;
== Формулировка задачи == &lt;br /&gt;
Пусть нам задана монотонная функция. Необходимо найти значение аргумента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; этой функции, в которой она принимает определенное значение &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Function.png]]&lt;br /&gt;
&lt;br /&gt;
== Решение задачи ==&lt;br /&gt;
Применим идею двоичного поиска. Выберем такие границы, где значение функции точно больше и точно меньше заданного значения. Выберем значение в середине этого отрезка. Если оно меньше, чем заданное, то сместим левую границу в середину отрезка. В противном случае сместим правую границу. Далее повторим процесс сужения границ. Встает вопрос, когда остановиться. Есть несколько способов сделать это.&lt;br /&gt;
&lt;br /&gt;
== Способы закончить поиск ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Способы || Плюсы || Минусы &lt;br /&gt;
|-&lt;br /&gt;
| 1) Окончание, когда рассматриваемый отрезок станет меньше заданного эпсилон. || Заданная точность найденного значения. || Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел. У чисел есть точность. Соответственно, при больших значениях функции длина отрезка может никогда не уменьшиться до заданного значения.&lt;br /&gt;
|-&lt;br /&gt;
| 2) Окончание, когда значение функции на концах отрезках различается менее, чем на заданное эпсилон. || Значение функции от найденного значения имеет заданную точность. || а) Возможна большая погрешность, если функция будет очень медленно возрастать. &amp;lt;br&amp;gt; б) Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел. У чисел есть точность. Соответственно, при быстром возрастании значений функции мы можем не найти такие границы, что значение на них различается менее, чем на заданное эпсилон. &lt;br /&gt;
|-&lt;br /&gt;
| 3) «Абсолютно точный поиск» &amp;lt;br&amp;gt; Окончание, когда границы отрезка — два соседних по представлению значения в типе данных. Утверждается, что два числа — соседние, если середина их отрезка совпадает или с левой, или с правой границей. || Максимально возможная точность найденного значения. || Возможно плохое поведение, если искомый аргумент равен 0.&lt;br /&gt;
|-&lt;br /&gt;
| 4) «Итеративный способ» &amp;lt;br&amp;gt; Выполнение конечного числа итераций. || У способа фиксированная погрешность. || Довольно плохая точность, если границы отрезка находятся на большом расстоянии.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Выбор границы отрезка для поиска==&lt;br /&gt;
Для начала найдем правую границу. Выберем произвольную положительную точку (например &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;). Будем удваивать ее до тех пор, пока значение функции в этой точке меньше заданного. Для того, чтобы найти левую границу выберем произвольную отрицательную точку (например &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt;). Будем удваивать ее до тех пор, пока значение в ней будет больше заданного значения.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
findLeft(c) &lt;br /&gt;
    x = -1;&lt;br /&gt;
    while f(x) &amp;gt; c &lt;br /&gt;
        x = x * 2;&lt;br /&gt;
    return x; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
findRight(c)&lt;br /&gt;
    x = 1;&lt;br /&gt;
    while f(x) &amp;lt; c&lt;br /&gt;
        x = x * 2;&lt;br /&gt;
    return x;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binSearch(c)&lt;br /&gt;
    left = findLeft(с);&lt;br /&gt;
    right = findRight(с);&lt;br /&gt;
    while left &amp;lt; right - eps                           //Здесь можно использовать другое условие выхода&lt;br /&gt;
        mid = (left + right) / 2;&lt;br /&gt;
        if f(mid) == c                                 //**&lt;br /&gt;
            return mid;                                //**&lt;br /&gt;
        else if f(mid) &amp;lt; c&lt;br /&gt;
            left = mid;&lt;br /&gt;
        else&lt;br /&gt;
            right = mid;&lt;br /&gt;
    return l;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Примеры использования ==&lt;br /&gt;
* Классической задачей на вещественный двоичный поиск является задача поиска корня &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-ой степени из числа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\sqrt[n]{x}&amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;x \ge 1&amp;lt;/tex&amp;gt; нижней границей для поиска будет &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, а верхней {{---}} &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Если функция нестрого монотонна, то, убрав из приведенного выше алгоритма строки, отмеченные &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;, мы получим алгоритм, который будет находить &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;f(x) = c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f(x - \epsilon) &amp;lt; c&amp;lt;/tex&amp;gt;. &lt;br /&gt;
== Замечания ==&lt;br /&gt;
* Необходимо отметить, то функция должна быть строго монотонна, если мы ищем конкретный корень и он единственный. Нестрого монотонна, если нам необходимо найти самый левый (правый) аргумент. Если же функция не монотонна, то данный алгоритм не найдет искомый аргумент, либо найдет аргумент, но он не будет единственным. &lt;br /&gt;
* Важным отличием от целочисленного поиска является то, что мы передвигаем границу ровно в середину отрезка (&amp;lt;tex&amp;gt;left = mid&amp;lt;/tex&amp;gt;), а не со смещением внутрь отрезка (&amp;lt;tex&amp;gt;left = mid + 1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
== Источники == &lt;br /&gt;
* [http://www.intuit.ru/department/algorithms/basicalgos/2/ Интернет университет, лекция сортировка и поиск]&lt;/div&gt;</summary>
		<author><name>178.66.186.45</name></author>	</entry>

	<entry>
		<id>http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA&amp;diff=37289</id>
		<title>Вещественный двоичный поиск</title>
		<link rel="alternate" type="text/html" href="http://neerc.ifmo.ru/wiki/index.php?title=%D0%92%D0%B5%D1%89%D0%B5%D1%81%D1%82%D0%B2%D0%B5%D0%BD%D0%BD%D1%8B%D0%B9_%D0%B4%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B9_%D0%BF%D0%BE%D0%B8%D1%81%D0%BA&amp;diff=37289"/>
				<updated>2014-05-23T19:54:56Z</updated>
		
		<summary type="html">&lt;p&gt;178.66.186.45: /* Способы закончить поиск */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;'''Вещественный двоичный поиск''' {{---}} алгоритм поиска аргумента для заданного значения монотонной вещественной функции.&lt;br /&gt;
&lt;br /&gt;
== Формулировка задачи == &lt;br /&gt;
Пусть нам задана монотонная функция. Необходимо найти значение аргумента &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; этой функции, в которой она принимает определенное значение &amp;lt;tex&amp;gt;C&amp;lt;/tex&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
[[Файл:Function.png]]&lt;br /&gt;
&lt;br /&gt;
== Решение задачи ==&lt;br /&gt;
Применим идею двоичного поиска. Выберем такие границы, где значение функции точно больше и точно меньше заданного значения. Выберем значение в середине этого отрезка. Если оно меньше, чем заданное, то сместим левую границу в середину отрезка. В противном случае сместим правую границу. Далее повторим процесс сужения границ. Встает вопрос, когда остановиться. Есть несколько способов сделать это.&lt;br /&gt;
&lt;br /&gt;
== Способы закончить поиск ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Способы || Плюсы || Минусы &lt;br /&gt;
|-&lt;br /&gt;
| 1) Окончание, когда рассматриваемый отрезок станет меньше заданного эпсилон. || Заданная точность найденного значения. || Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел. У чисел есть точность. Соответственно, при больших значениях функции длина отрезка может никогда не уменьшиться до заданного значения.&lt;br /&gt;
|-&lt;br /&gt;
| 2) Окончание, когда значение функции на концах отрезках различается менее, чем на заданное эпсилон. || Значение функции от найденного значения имеет заданную точность. || а) Возможна большая погрешность, если функция будет очень медленно возрастать. &amp;lt;br&amp;gt; б) Алгоритм может зациклиться. В компьютере мы работаем с конечным числом вещественных чисел. У чисел есть точность. Соответственно, при быстром возрастании значений функции мы можем не найти такие границы, что значение на них различается менее, чем на заданное эпсилон &lt;br /&gt;
|-&lt;br /&gt;
| 3) «Абсолютно точный поиск» &amp;lt;br&amp;gt; Окончание, когда границы отрезка — два соседних по представлению значения в типе данных. Утверждается, что два числа — соседние, если середина их отрезка совпадает или с левой, или с правой границей. || Максимально возможная точность найденного значения. || Возможно плохое поведение, если искомый аргумент равен 0.&lt;br /&gt;
|-&lt;br /&gt;
| 4) «Итеративный способ» &amp;lt;br&amp;gt; Выполнение конечного числа итераций. || У способа фиксированная погрешность. || Довольно плохая точность, если границы отрезка находятся на большом расстоянии.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Выбор границы отрезка для поиска==&lt;br /&gt;
Для начала найдем правую границу. Выберем произвольную положительную точку (например &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;). Будем удваивать ее до тех пор, пока значение функции в этой точке меньше заданного. Для того, чтобы найти левую границу выберем произвольную отрицательную точку (например &amp;lt;tex&amp;gt;-1&amp;lt;/tex&amp;gt;). Будем удваивать ее до тех пор, пока значение в ней будет больше заданного значения.&lt;br /&gt;
&lt;br /&gt;
== Псевдокод ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
findLeft(c) &lt;br /&gt;
    x = -1;&lt;br /&gt;
    while f(x) &amp;gt; c &lt;br /&gt;
        x = x * 2;&lt;br /&gt;
    return x; &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
findRight(c)&lt;br /&gt;
    x = 1;&lt;br /&gt;
    while f(x) &amp;lt; c&lt;br /&gt;
        x = x * 2;&lt;br /&gt;
    return x;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
binSearch(c)&lt;br /&gt;
    left = findLeft(с);&lt;br /&gt;
    right = findRight(с);&lt;br /&gt;
    while left &amp;lt; right - eps                           //Здесь можно использовать другое условие выхода&lt;br /&gt;
        mid = (left + right) / 2;&lt;br /&gt;
        if f(mid) == c                                 //**&lt;br /&gt;
            return mid;                                //**&lt;br /&gt;
        else if f(mid) &amp;lt; c&lt;br /&gt;
            left = mid;&lt;br /&gt;
        else&lt;br /&gt;
            right = mid;&lt;br /&gt;
    return l;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
== Примеры использования ==&lt;br /&gt;
* Классической задачей на вещественный двоичный поиск является задача поиска корня &amp;lt;tex&amp;gt;n&amp;lt;/tex&amp;gt;-ой степени из числа &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;: &amp;lt;tex&amp;gt;\sqrt[n]{x}&amp;lt;/tex&amp;gt;. При &amp;lt;tex&amp;gt;x \ge 1&amp;lt;/tex&amp;gt; нижней границей для поиска будет &amp;lt;tex&amp;gt;1&amp;lt;/tex&amp;gt;, а верхней {{---}} &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt;.&lt;br /&gt;
* Если функция нестрого монотонна, то, убрав из приведенного выше алгоритма строки, отмеченные &amp;lt;tex&amp;gt;(**)&amp;lt;/tex&amp;gt;, мы получим алгоритм, который будет находить &amp;lt;tex&amp;gt;x&amp;lt;/tex&amp;gt; такой, что &amp;lt;tex&amp;gt;f(x) = c&amp;lt;/tex&amp;gt; и &amp;lt;tex&amp;gt;f(x - \epsilon) &amp;lt; c&amp;lt;/tex&amp;gt;. &lt;br /&gt;
== Замечания ==&lt;br /&gt;
* Необходимо отметить, то функция должна быть строго монотонна, если мы ищем конкретный корень и он единственный. Нестрого монотонна, если нам необходимо найти самый левый (правый) аргумент. Если же функция не монотонна, то данный алгоритм не найдет искомый аргумент, либо найдет аргумент, но он не будет единственным. &lt;br /&gt;
* Важным отличием от целочисленного поиска является то, что мы передвигаем границу ровно в середину отрезка (&amp;lt;tex&amp;gt;left = mid&amp;lt;/tex&amp;gt;), а не со смещением внутрь отрезка (&amp;lt;tex&amp;gt;left = mid + 1&amp;lt;/tex&amp;gt;). &lt;br /&gt;
== Источники == &lt;br /&gt;
* [http://www.intuit.ru/department/algorithms/basicalgos/2/ Интернет университет, лекция сортировка и поиск]&lt;/div&gt;</summary>
		<author><name>178.66.186.45</name></author>	</entry>

	</feed>