Ответ Виллема Ван Онсема хорошо описывает случай, когда множество запросов будет выполнено для одного и того же массива, поэтому стоит сначала потратить O (n log n) для сортировки массива. Мой ответ не имеет прямого отношения к «несортированным массивам», но существует распространенное заблуждение, что массивы либо являются несортированными, либо были отсортированы , и я думаю, что стоит обратить внимание на это неправильное представление в на случай, если это поможет читателям.
Чтобы быть ясным, я не предполагаю, что у вас есть это конкретное заблуждение; но я думаю, что некоторые люди с таким заблуждением прочитают ваш вопрос и ответы на него.
Слово "отсортировано" немного вводит в заблуждение. Поскольку «сортированный» - это глагол прошедшего времени, он звучит так, как будто алгоритм сортировки использовался для упорядочения данных. Но то, как ученые-компьютерщики используют слово «отсортировано», означает, что массив имеет порядок , не подразумевая, что ранее он был не в порядке.
Поэтому, когда мы говорим бинарный поиск может использоваться только в «отсортированном массиве», это не означает, что для «сортировки» массива потребовалось O (n log n) времени. Множество данных, естественно, в порядке, без необходимости выполнять какую-либо работу по их сортировке. Несколько примеров:
- Предположим, у меня есть несортированный массив чисел, и я хочу создать массив сумм с префиксом , который содержит кумулятивные суммы, начиная с начала оригинала. массив. Если в исходном массиве нет отрицательных чисел, то кумулятивные суммы, естественно, будут в порядке возрастания.
- Предположим, у меня есть последовательность с некоторыми специальными элементами, и я хочу выполнить запросы, где, учитывая индекс, запрос находит первый специальный элемент после этого индекса. Было бы полезно иметь список индексов в последовательности, в которой встречаются специальные элементы; естественный способ найти эти индексы - найти их в порядке возрастания.
- Предположим, мне нужен массив первых
n
простых чисел или всех простых чисел, меньших или равных n
. Почти любой алгоритм, который решает любую проблему, будет генерировать простые числа в возрастающем порядке.
Так что во многих случаях мы можем применять бинарный поиск, не тратя O (n log n) времени на сортировку последовательности это нужно искать.