HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <ul><li><a>Определение</a></li>
1 <ul><li><a>Определение</a></li>
2 <li><a>Принцип функционирования</a><ul><li><a>Описание принципа работы</a></li>
2 <li><a>Принцип функционирования</a><ul><li><a>Описание принципа работы</a></li>
3 <li><a>Наглядный пример</a></li>
3 <li><a>Наглядный пример</a></li>
4 </ul></li>
4 </ul></li>
5 <li><a>Реализация в программировании</a></li>
5 <li><a>Реализация в программировании</a></li>
6 <li><a>Несколько слов об эффективности</a></li>
6 <li><a>Несколько слов об эффективности</a></li>
7 <li><a>Вместо заключения</a></li>
7 <li><a>Вместо заключения</a></li>
8 </ul><p>В компьютерной деятельности поиск - одна из наиболее выполняемых операций. Позволяет обнаружить элемент, соответствующий установленным заранее параметрам. Для среднестатистического пользователя процедура выглядит простой: в поисковой строке он задает критерии искомого объекта, а затем воплощает их в жизнь.</p>
8 </ul><p>В компьютерной деятельности поиск - одна из наиболее выполняемых операций. Позволяет обнаружить элемент, соответствующий установленным заранее параметрам. Для среднестатистического пользователя процедура выглядит простой: в поисковой строке он задает критерии искомого объекта, а затем воплощает их в жизнь.</p>
9 <p>В программировании ситуация обстоит иначе. Для поиска можно использовать разнообразные методы сортировки данных. Пример - алгоритм бинарного обнаружения. О нем и пойдет речь далее.</p>
9 <p>В программировании ситуация обстоит иначе. Для поиска можно использовать разнообразные методы сортировки данных. Пример - алгоритм бинарного обнаружения. О нем и пойдет речь далее.</p>
10 <h2>Определение</h2>
10 <h2>Определение</h2>
11 <p>Поиск бинарного типа - простой вариант обнаружения искомого элемента, понятный на интуитивном уровне. Отличается высокой эффективностью. Может быть использовать только в отсортированном массиве информации. Отсюда следует, что перед тем, как активировать алгоритм, иногда требуется предварительная обработка имеющихся электронных материалов.</p>
11 <p>Поиск бинарного типа - простой вариант обнаружения искомого элемента, понятный на интуитивном уровне. Отличается высокой эффективностью. Может быть использовать только в отсортированном массиве информации. Отсюда следует, что перед тем, как активировать алгоритм, иногда требуется предварительная обработка имеющихся электронных материалов.</p>
12 <p>Двоичный поиск - классический вариант обнаружения элемента в массиве (векторе), в котором применяется принцип дробления на половинки. Может быть использован в:</p>
12 <p>Двоичный поиск - классический вариант обнаружения элемента в массиве (векторе), в котором применяется принцип дробления на половинки. Может быть использован в:</p>
13 <ul><li>информатике;</li>
13 <ul><li>информатике;</li>
14 <li>математическом программировании;</li>
14 <li>математическом программировании;</li>
15 <li>математике вычислительного характера.</li>
15 <li>математике вычислительного характера.</li>
16 </ul><p>Такой алгоритм носит название дихотомии или "метод деления пополам".</p>
16 </ul><p>Такой алгоритм носит название дихотомии или "метод деления пополам".</p>
17 <h2>Принцип функционирования</h2>
17 <h2>Принцип функционирования</h2>
18 <p>Рано или поздно почти каждый математик и программист задумываются над тем, как работает алгоритм бинарного поиска заданного элемента. Здесь каждый раз используется принцип "разделяй и властвуй". С его помощью массив будет разделен пополам при проверке, подходит ли элемент массива под искомый.</p>
18 <p>Рано или поздно почти каждый математик и программист задумываются над тем, как работает алгоритм бинарного поиска заданного элемента. Здесь каждый раз используется принцип "разделяй и властвуй". С его помощью массив будет разделен пополам при проверке, подходит ли элемент массива под искомый.</p>
19 <p>При помощи такого подхода желаемое значение обнаруживается достаточно быстро и легко. Сложная задача будет раздроблена на простые линейные операции, в котором мы ищем заданный заранее элемент. Упрощение производится до тех пор, пока поставленная задача не сможет быть решена напрямую.</p>
19 <p>При помощи такого подхода желаемое значение обнаруживается достаточно быстро и легко. Сложная задача будет раздроблена на простые линейные операции, в котором мы ищем заданный заранее элемент. Упрощение производится до тех пор, пока поставленная задача не сможет быть решена напрямую.</p>
20 <h3>Описание принципа работы</h3>
20 <h3>Описание принципа работы</h3>
21 <p>Работает двоичный поиск легко и просто. Дан заранее отсортированный массив информации, где элементы отсортированы по возрастанию. Чтобы обнаружить в нем конкретные данные, потребуется выполнить следующее:</p>
21 <p>Работает двоичный поиск легко и просто. Дан заранее отсортированный массив информации, где элементы отсортированы по возрастанию. Чтобы обнаружить в нем конкретные данные, потребуется выполнить следующее:</p>
22 <ol><li>Найти средний элемент заданного массива информации.</li>
22 <ol><li>Найти средний элемент заданного массива информации.</li>
23 <li>Сравнить полученный объект со значением, которое мы ищем (с так называемым ключом). Если оный меньше среднего элемента, поиск осуществляется в левой половине. В противном случае - в правой.</li>
23 <li>Сравнить полученный объект со значением, которое мы ищем (с так называемым ключом). Если оный меньше среднего элемента, поиск осуществляется в левой половине. В противном случае - в правой.</li>
24 <li>Когда ключ имеет такое же значение, что и средний элемент, происходит возврат индекса оного.</li>
24 <li>Когда ключ имеет такое же значение, что и средний элемент, происходит возврат индекса оного.</li>
25 <li>Продолжать выполнять 1-2 шаги до тех пор, пока не останется один объект.</li>
25 <li>Продолжать выполнять 1-2 шаги до тех пор, пока не останется один объект.</li>
26 <li>Когда программа дойдет до последнего элемента, а ключ так и не был обнаружен, происходит возврат -1.</li>
26 <li>Когда программа дойдет до последнего элемента, а ключ так и не был обнаружен, происходит возврат -1.</li>
27 </ol><p>Для такого линейного поиска рекомендуется рассмотреть наглядный пример из обыденной жизни.</p>
27 </ol><p>Для такого линейного поиска рекомендуется рассмотреть наглядный пример из обыденной жизни.</p>
28 <h3>Наглядный пример</h3>
28 <h3>Наглядный пример</h3>
29 <p>У многих программистов и математиков возникает вопрос относительно того, почему нельзя просто при работе выбранного алгоритма отбрасывать половину текущего диапазона при проверке объекта. Получается следующая картина:</p>
29 <p>У многих программистов и математиков возникает вопрос относительно того, почему нельзя просто при работе выбранного алгоритма отбрасывать половину текущего диапазона при проверке объекта. Получается следующая картина:</p>
30 <ol><li>Пусть будет дан массив: 1, 2, 5, 7, 13, 15, 16, 18, 24, 28, 29.</li>
30 <ol><li>Пусть будет дан массив: 1, 2, 5, 7, 13, 15, 16, 18, 24, 28, 29.</li>
31 <li>Обнаружить необходимо число 18.</li>
31 <li>Обнаружить необходимо число 18.</li>
32 <li>Середина массива - это 15.</li>
32 <li>Середина массива - это 15.</li>
33 <li>18 больше 15, поэтому обнаружение требуется производить в правой части.</li>
33 <li>18 больше 15, поэтому обнаружение требуется производить в правой части.</li>
34 <li>Продолжение операции будет происходить в отношении ряда: 16, 18, 24, 28, 29.</li>
34 <li>Продолжение операции будет происходить в отношении ряда: 16, 18, 24, 28, 29.</li>
35 </ol><p>Теперь по первому разбиению можно продолжать работу с массивом до обнаружения элемента или одного кандидата на ключ:</p>
35 </ol><p>Теперь по первому разбиению можно продолжать работу с массивом до обнаружения элемента или одного кандидата на ключ:</p>
36 <ol><li>Работать предстоит с числовым рядом: 16, 18, 24, 28, 29.</li>
36 <ol><li>Работать предстоит с числовым рядом: 16, 18, 24, 28, 29.</li>
37 <li>Середина - 24.</li>
37 <li>Середина - 24.</li>
38 <li>18 меньше 24, поэтому работать предстоит с левой частью.</li>
38 <li>18 меньше 24, поэтому работать предстоит с левой частью.</li>
39 <li>На выходе получается выбор между 16 и 18.</li>
39 <li>На выходе получается выбор между 16 и 18.</li>
40 <li>18 больше 16. Нужно работать с правым "блоком" массива.</li>
40 <li>18 больше 16. Нужно работать с правым "блоком" массива.</li>
41 <li>18 равно 18. Искомый элемент обнаружен.</li>
41 <li>18 равно 18. Искомый элемент обнаружен.</li>
42 </ol><p>Результат - один возможный кандидат на ключ при поиске. Он соответствует искомому элементу. В приведенном примере для того, чтобы найти правильный ответ, потребовалось не очень много вычислений. Для поставленной зачади использовались 4 сравнительных шага. Они помогли обнаружить элемент в множестве 11 компонентов.</p>
42 </ol><p>Результат - один возможный кандидат на ключ при поиске. Он соответствует искомому элементу. В приведенном примере для того, чтобы найти правильный ответ, потребовалось не очень много вычислений. Для поставленной зачади использовались 4 сравнительных шага. Они помогли обнаружить элемент в множестве 11 компонентов.</p>
43 <h2>Реализация в программировании</h2>
43 <h2>Реализация в программировании</h2>
44 <p>Теперь можно изучить простой код, при помощи которого удастся осуществлять двоичный поиск в программировании. Сделаем пример на языке Java, а точнее - Javascript. Binary Search будет выглядеть так:</p>
44 <p>Теперь можно изучить простой код, при помощи которого удастся осуществлять двоичный поиск в программировании. Сделаем пример на языке Java, а точнее - Javascript. Binary Search будет выглядеть так:</p>
45 function binarySearch(sortedArray, key){ let start = 0; let end = sortedArray.length - 1; while (start &lt;= end) { let middle = Math.floor((start + end) / 2); if (sortedArray[middle] === key) { // found the key return middle; } else if (sortedArray[middle] &lt; key) { // continue searching to the right start = middle + 1; } else { // search searching to the left end = middle - 1; } } // key wasn't found return -1; }<p>Здесь происходит следующее:</p>
45 function binarySearch(sortedArray, key){ let start = 0; let end = sortedArray.length - 1; while (start &lt;= end) { let middle = Math.floor((start + end) / 2); if (sortedArray[middle] === key) { // found the key return middle; } else if (sortedArray[middle] &lt; key) { // continue searching to the right start = middle + 1; } else { // search searching to the left end = middle - 1; } } // key wasn't found return -1; }<p>Здесь происходит следующее:</p>
46 <ol><li>Текущий подмассив составляющих отслеживается через две переменные - start и end.</li>
46 <ol><li>Текущий подмассив составляющих отслеживается через две переменные - start и end.</li>
47 <li>В заданном количестве элементов находим средний.</li>
47 <li>В заданном количестве элементов находим средний.</li>
48 <li>Происходит проверка среднего "компонента" с key.</li>
48 <li>Происходит проверка среднего "компонента" с key.</li>
49 <li>За счет того, что множество информации было отсортировано, допускается отбрасывание половины элементов их него. Достигается это за счет изменения переменных star или end. Все зависит от того, где будет происходить дальнейший поиск. Если у правой границы - end, в противном случае - start.</li>
49 <li>За счет того, что множество информации было отсортировано, допускается отбрасывание половины элементов их него. Достигается это за счет изменения переменных star или end. Все зависит от того, где будет происходить дальнейший поиск. Если у правой границы - end, в противном случае - start.</li>
50 <li>Когда элемент, на который смотрит функция, меньше заданного заранее ключа, нужно скорректировать key на middle +1. Это поможет эффективно отбросить текущий компонент и все объекты, которые меньше него.</li>
50 <li>Когда элемент, на который смотрит функция, меньше заданного заранее ключа, нужно скорректировать key на middle +1. Это поможет эффективно отбросить текущий компонент и все объекты, которые меньше него.</li>
51 </ol><p>Предложенный подход в Java используется в основном для работы с массивами целых чисел. Аналоги алгоритма имеются и в других языках программирования. В C++:</p>
51 </ol><p>Предложенный подход в Java используется в основном для работы с массивами целых чисел. Аналоги алгоритма имеются и в других языках программирования. В C++:</p>
52 <p>В Pascal:</p>
52 <p>В Pascal:</p>
53 <h2>Несколько слов об эффективности</h2>
53 <h2>Несколько слов об эффективности</h2>
54 <p>Бинарный поиск не всегда эффективен. В процессе его работы возникают некоторые сложности. Временная "трудность" составляет O (log2 n), где n выступает количеством компонентов в заданном множестве. Это не такое большое значение. Во время классического линейного поиска имеет место временная сложность O (n).</p>
54 <p>Бинарный поиск не всегда эффективен. В процессе его работы возникают некоторые сложности. Временная "трудность" составляет O (log2 n), где n выступает количеством компонентов в заданном множестве. Это не такое большое значение. Во время классического линейного поиска имеет место временная сложность O (n).</p>
55 <p>Стоит запомнить следующие данные о рассматриваемом методе:</p>
55 <p>Стоит запомнить следующие данные о рассматриваемом методе:</p>
56 <ol><li>Бинарный подход относится к алгоритмам на месте. Работает с исходным множеством значений, не создавая никаких копий в процессе функционирования.</li>
56 <ol><li>Бинарный подход относится к алгоритмам на месте. Работает с исходным множеством значений, не создавая никаких копий в процессе функционирования.</li>
57 <li>Действует исключительно с заранее отсортированными данными.</li>
57 <li>Действует исключительно с заранее отсортированными данными.</li>
58 <li>Сложность сортировки высокой эффективности составляет O (nlogn).</li>
58 <li>Сложность сортировки высокой эффективности составляет O (nlogn).</li>
59 <li>Из вышесказанного следует, что, если процедуру обнаружения выполняют только один раз, рекомендуется применять алгоритмизацию грубой силы (пример - линейный поиск).</li>
59 <li>Из вышесказанного следует, что, если процедуру обнаружения выполняют только один раз, рекомендуется применять алгоритмизацию грубой силы (пример - линейный поиск).</li>
60 </ol><p>Рассмотренный прием обладает высокой эффективностью, если требуется производить повторное обнаружение в крупных множествах информации. В случае с 11 компонентами потребовалось всего 4 шага. Но для того, чтобы искомый объект был найден в множестве из 10 000 000, для проверки использовались бы всего 24 составляющие. Это - 0, 0002% от всего массива информации.</p>
60 </ol><p>Рассмотренный прием обладает высокой эффективностью, если требуется производить повторное обнаружение в крупных множествах информации. В случае с 11 компонентами потребовалось всего 4 шага. Но для того, чтобы искомый объект был найден в множестве из 10 000 000, для проверки использовались бы всего 24 составляющие. Это - 0, 0002% от всего массива информации.</p>
61 <h2>Вместо заключения</h2>
61 <h2>Вместо заключения</h2>
62 <p>Теперь понятно, как работает рассмотренный бинарный поиск на примере с Java. Аналогичный алгоритм встречается во всех языках программирования. Он отличается особой эффективностью в большинстве случаев. Но для того, чтобы он мог нормально функционировать, предстоит перед началом работы с массивом провести его сортировку тем или иным способом.</p>
62 <p>Теперь понятно, как работает рассмотренный бинарный поиск на примере с Java. Аналогичный алгоритм встречается во всех языках программирования. Он отличается особой эффективностью в большинстве случаев. Но для того, чтобы он мог нормально функционировать, предстоит перед началом работы с массивом провести его сортировку тем или иным способом.</p>
63 <p>А для того, чтобы научиться лучше программировать и понимать сложные кодификации, можно посетить специализированные компьютерные курсы. Они:</p>
63 <p>А для того, чтобы научиться лучше программировать и понимать сложные кодификации, можно посетить специализированные компьютерные курсы. Они:</p>
64 <ol><li>Организовываются дистанционно. Можно пользоваться оными в любое удобное пользователю время.</li>
64 <ol><li>Организовываются дистанционно. Можно пользоваться оными в любое удобное пользователю время.</li>
65 <li>Имеют множество направлений. Осваивать допускается как одно из них, так и сразу несколько.</li>
65 <li>Имеют множество направлений. Осваивать допускается как одно из них, так и сразу несколько.</li>
66 <li>Обладают разным уровнем сложности. Есть предложения для новичков и продвинутых программистов.</li>
66 <li>Обладают разным уровнем сложности. Есть предложения для новичков и продвинутых программистов.</li>
67 <li>Предлагают бесценную практику и поддержку хорошими кураторами.</li>
67 <li>Предлагают бесценную практику и поддержку хорошими кураторами.</li>
68 </ol><p>Программы рассчитаны на срок от нескольких месяцев до года. По окончании выдается сертификат установленного образца, подтверждающий знания в выбранном направлении.</p>
68 </ol><p>Программы рассчитаны на срок от нескольких месяцев до года. По окончании выдается сертификат установленного образца, подтверждающий знания в выбранном направлении.</p>
69 <p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a>Otus</a>!</em></p>
69 <p><em>Хотите освоить современную IT-специальность? Огромный выбор курсов по востребованным IT-направлениям есть в <a>Otus</a>!</em></p>
70 <p>Также, возможно, вам будет интересен следующий курс:</p>
70 <p>Также, возможно, вам будет интересен следующий курс:</p>
71 <a></a>
71 <a></a>