Разберем кейс РїРѕРёСЃРєР° РІ упорядоченном массиве РїРѕ алгоритму двоичного РїРѕРёСЃРєР° РІ упорядоченном массиве, РІ нашем случае файле. Статья РЅР° нашем сайте: Условие задачи Нужна возможность осуществлять анализ введенного пароля РЅР° то, что РѕРЅ скомпрометирован путем анализа файлов часто используемых паролей. Ртого: Сѓ нас есть введенный пользователем пароль, Рё нам необходимо путем перебора нескольких макетов СЃ часто используемыми паролями, РІ которых РЅР° каждой строке введен пароль РІ нижнем регистре определить совпадает ли введенный пароль СЃ тем, который ввел пользователь СЃ теми паролями, которые есть РІ файле. Если РѕРЅ найден, надо написать, что пароль скомпрометирован. Обращаю внимание, что РјС‹ опускаем то, что регистр может быть РґСЂСѓРіРёРј. Будем введенную строку пользователя переводить РІ нижний регистр Рё проверять только маленькие Р±СѓРєРІС‹. Рто упрощает задачу. Первый вариант решения “РІ лоб“ Р’ самом начале, СЏ попытался использовать РїРѕРёСЃРє “РІ лоб“. Рў.Рµ. берем РїРѕ очереди макеты СЃ паролями Рё строчка, Р·Р° строчкой сравниваем СЃ тем, что ввел пользователь. Нашли - отлично, пароль скомпрометирован, если РЅРµ нашли, то так Рё напишем. Проблема оказалось РІ том, что для ~88000 часто используемых паролей это работает ОЧЕНЬ медленно. РќР° моем компьютере это отрабатывало около 18 секунд. Пользователь РЅРµ захочет ждать такое время. Значит нам нужен РґСЂСѓРіРѕР№ алгоритм. Второй вариант решения: двоичный (бинарный) РїРѕРёСЃРє или дихотомия Дальше, СЏ начал думать, как же можно было Р±С‹ улучшить алгоритм. Р РІСЃРїРѕРјРЅРёР» РїСЂРѕ двоичный РїРѕРёСЃРє. Начнем СЃ определения РёР· РІРёРєРё. Двоичный (бинарный) РїРѕРёСЃРє (также известен как метод деления пополам или дихотомия) — классический алгоритм РїРѕРёСЃРєР° элемента РІ отсортированном массиве (векторе), использующий дробление массива РЅР° половины. Рспользуется РІ информатике, вычислительной математике Рё математическом программировании. Важно, что РІСЃРµ слова наших паролей упорядочены РїРѕ алфавиту. Схематично алгоритм выглядит так: Схема двоичного РїРѕРёСЃРєР° Предположим наше слово начинается РЅР° Р±СѓРєРІСѓ F. 1. Р’ самом начале левой точкой РјС‹ берем Р±СѓРєРІСѓ A, правой Р±СѓРєРІСѓ Z. Центральная точка Сѓ нас M. 2. M нужная нам точка? Если Р±С‹ это была искомая Р±СѓРєРІР°, то РјС‹ ее нашли Рё должны закончить, РЅРѕ нет, это РЅРµ наша точка, продолжаем алгоритм. 3. Р’ каком отрезке может находится нужная нам точка F РІ AM или MZ? 4. Наша искомая точка находится РІ AM, тогда РІ качестве левой точки выбираем Рђ, РІ качестве правой, выбираем M Рё продолжаем, переходя РЅР° шаг 1. Вариантов окончания работы алгоритма всего РґРІР°: либо РјС‹ наткнемся РЅР° эту точку РЅР° очередном шаге Рё нужный элемент найден, либо Сѓ нас РЅРµ останется больше точек Рё это будет означать, что РјС‹ ничего РЅРµ нашли Рё элемент РЅРµ найден.
Hide player controls
Hide resume playing