Алгоритмы поиска на JavaScript
Задача поиска связана с нахождением заданного значения, называемого ключом поиска (search key), среди заданного множества. Существует огромное количество алгоритмов поиска, так что есть из чего выбирать. Их сложность варьируется от самых простых алгоритмов поиска методом последовательного сравнения, до чрезвычайно эффективных, но ограниченных алгоритмов бинарного поиска, а также алгоритмов, основанных на представлении базового множества в иной, более подходящей для выполнения поиска форме. Последние из упомянутых здесь алгоритмов имеют особое практическое значение, поскольку применяются в реально действующих приложениях, выполняющих выборку и хранение массивов информации в огромных базах данных.
Для решения задачи поиска также не существует единого алгоритма, который бы наилучшим образом подходил для всех случаев. Некоторые из алгоритмов выполняются быстрее остальных, но для их работы требуется дополнительная оперативная память. Другие выполняются очень быстро, но их можно применять только для предварительно отсортированных массивов, и т.п. В отличие от алгоритмов сортировки в алгоритмах поиска нет проблемы устойчивости, но при их использовании могут возникать другие сложности. В частности, в тех приложениях, где обрабатываемые данные могут часто изменяться, причем количество изменений сравнимо с количеством операций поиска, поиск следует рассматривать в неразрывной связи с двумя другими операциями — добавления элемента в набор данных и удаления из него. В подобных ситуациях необходимо видоизменить структуры данных и алгоритмы так, чтобы достигалось равновесие между требованиями, выдвигаемыми к каждой операции. Кроме того, организация очень больших наборов данных с целью выполнения в них эффективного поиска (а также добавления и удаления элементов) представляет собой чрезвычайно сложную задачу, решение которой особенно важно с точки зрения практического применения.
Линейный поиск на JavaScript
Бинарный (двоичный) поиск на JavaScript
Поиск элемента в отсортированном массиве. Бинарный поиск (binary search) представляет собой в высшей степени эффективный алгоритм для поиска в отсортированном массиве. Он работает путем сравнения искомого ключа t со средним элементом массива A[k] Если они равны, алгоритм прекращает работу. В противном случае та же операция рекурсивно повторяется для первой половины массива, если t<A[k], и для второй, если t>A[k].
Интерполирующий поиск на JavaScript
Поиск подстроки на JavaScript
Формально задачу поиска подстроки (substring search) можно сформулировать следующим образом. Пусть есть некоторый текст str символов с длиной N , и шаблон sub с длиной n (n⩽N) в виде строки. Если для некоторого значения i∈[0;N−n+1) выполняется равенство str[i],…,str[i+n−1]=sub[0],…,sub[n−1] , т.е. если для всех j∈[0;n) справедливо равенство sub[j]=str[i+j], то будем говорить, что шаблон sub входит в текст str со сдвигом i . Задача поиска подстроки состоит в определении сдвига, с которым шаблон sub входит в текст str (или установлении того факта, что текст не содержит подстроки, соответствующей шаблону). Проще говоря, нужно определить индекс i крайнего слева символа первой соответствующей шаблону sub подстроки в тексте str
(например, если str = "Lorem ipsum" и sub = "ips", то i=6 ).
Простейший алгоритм поиска состоит в непосредственной проверке всех возможных смещений. Проверка заключается в последовательном сравнении символов шаблона sub с символами строки str ; при первом же обнаруженном несовпадении символов проверка прекращается и переменная внешнего цикла увеличивается на 1.