Что нужно сделать с массивом чтобы алгоритмическая сложность поиска элемента была логарифмической

Ответ

Для логарифмической сложности поиска O(log n) массив должен быть отсортирован. Тогда можно использовать бинарный поиск:

function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) return mid;
    if (arr[mid] < target) left = mid + 1;
    else right = mid - 1;
  }
  return -1;
}

const sortedArray = [1, 3, 5, 7, 9];
console.log(binarySearch(sortedArray, 5)); // 2

Ключевые моменты:

  1. Массив должен быть отсортирован (по возрастанию/убыванию)
  2. Бинарный поиск делит массив пополам на каждой итерации
  3. Сложность сортировки O(n log n) выполняется один раз, затем поиск O(log n)

Ответ 18+ 🔞

А, ну ты глянь, классика жанра, блядь! Чтобы искать за O(log n), надо, чтобы массив был как миленький отсортирован, ёпта. Иначе никакой бинарный поиск не взлетит, это ж как пытаться найти чёрную кошку в тёмной комнате, если её там, блядь, нет, да ещё и кошки разбежались кто куда.

Вот смотри, как это работает, если всё по уму:

function binarySearch(arr, target) {
  let left = 0;
  let right = arr.length - 1;

  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) return mid;
    if (arr[mid] < target) left = mid + 1;
    else right = mid - 1;
  }
  return -1;
}

const sortedArray = [1, 3, 5, 7, 9];
console.log(binarySearch(sortedArray, 5)); // 2

Суть в чём, блядь? Берём отсортированный массив, делим его пополам, смотрим — нашёлся элемент или нет. Если нет, то отбрасываем ту половину, где его точно быть не может, и повторяем фокус с оставшейся частью. И так до победного конца, пока либо не найдём, либо не поймём, что его тут нихуя нет.

А теперь главное, что надо запомнить, чтобы не облажаться:

  1. Массив должен быть отсортирован. Это святое, блядь! Иначе алгоритм превратится в тыкву, то есть в полную хуйню, которая ничего не найдёт. Сортировка сама по себе — это O(n log n), но её делают один раз, а потом уже ищут сколько влезет за O(log n).
  2. Бинарный поиск на каждом шагу откусывает половину. Вот в этом и весь прикол, ёпта. Не надо бегать по всем элементам, как курица с отрубленной головой. Делим пополам — и сразу отсекаем кучу ненужного.
  3. Сложность O(log n) — это овердохуища быстро. Особенно когда элементов много. Это как найти иголку в стоге сена, если предварительно разложить всё это сено по алфавиту и номеру, блядь.

Короче, сортируй массив один раз — и потом ищи хоть до посинения, быстро и без нервов. А если не отсортирован — ну, извини, тогда только линейный поиск, O(n), и никаких тебе чудес, в рот меня чих-пых.