Какие знаешь алгоритмы

Ответ

  • Сортировки: быстрая (QuickSort), слиянием (MergeSort), пузырьковая (BubbleSort).
    // QuickSort
    function quickSort(arr) {
      if (arr.length <= 1) return arr;
      const pivot = arr[0];
      const left = [], right = [];
      for (let i = 1; i < arr.length; i++) {
        arr[i] < pivot ? left.push(arr[i]) : right.push(arr[i]);
      }
      return [...quickSort(left), pivot, ...quickSort(right)];
    }
  • Поиск: бинарный (только для отсортированных массивов).
    function binarySearch(arr, target) {
      let left = 0, right = arr.length - 1;
      while (left <= right) {
        const mid = Math.floor((left + right) / 2);
        if (arr[mid] === target) return mid;
        arr[mid] < target ? left = mid + 1 : right = mid - 1;
      }
      return -1;
    }
  • Обход графов: BFS (по уровням), DFS (в глубину).

  • Динамическое программирование: например, числа Фибоначчи с мемоизацией.

Также знаю жадные алгоритмы (например, задача о рюкзаке) и алгоритмы работы с деревьями (обходы, балансировка).

Ответ 18+ 🔞

А, ну вот, опять про алгоритмы спрашивают. Ну ладно, слушай сюда, раз уж такой умный.

Смотри, есть у нас, блядь, сортировки — это как бабы на вечеринке: всех надо расставить по росту, весу или по размеру сиськи, кому что важнее. Самая простая — пузырьковая. Это когда ты, мудак, тупо ходишь по массиву и меняешь местами соседей, если они стоят криво. Работает медленнее, чем я после пятой рюмки, но для мелких данных сойдёт.

А вот быстрая сортировка — это уже, сука, искусство. Берёшь какой-нибудь элемент (pivot), всех, кто меньше него, кидаешь налево, а кто больше — направо. Потом рекурсивно делаешь то же самое с каждой кучей. В итоге всё отсортировано, и ты чувствуешь себя богом. Только вот если опорный элемент выбрать как попало, можно получить вырожденный случай, и тогда алгоритм будет работать долго, как мой дед после инсульта.

// QuickSort
function quickSort(arr) {
  if (arr.length <= 1) return arr;
  const pivot = arr[0];
  const left = [], right = [];
  for (let i = 1; i < arr.length; i++) {
    arr[i] < pivot ? left.push(arr[i]) : right.push(arr[i]);
  }
  return [...quickSort(left), pivot, ...quickSort(right)];
}

Слиянием — тоже норм, стабильный, как алкоголик на пенсии. Делишь массив пополам, сортируешь каждую половинку, а потом сливаешь их в один отсортированный. Никаких неожиданностей, всё предсказуемо, но памяти жрёт, как свинья.

Поиск? Ну, если массив уже отсортирован, то бинарный поиск — это просто песня. Делишь пополам, смотришь — не тот ли элемент? Если нет, то отбрасываешь половину, где его точно нет, и повторяешь. Работает быстрее, чем я на утренней пробежке. Но, блядь, только для отсортированных данных! Иначе нихуя не найдёшь.

function binarySearch(arr, target) {
  let left = 0, right = arr.length - 1;
  while (left <= right) {
    const mid = Math.floor((left + right) / 2);
    if (arr[mid] === target) return mid;
    arr[mid] < target ? left = mid + 1 : right = mid - 1;
  }
  return -1;
}

Графы... Ну, это когда у тебя куча точек, связанных между собой, как родственники на похоронах. BFS — это обход в ширину: идёшь по уровням, сначала всех соседей, потом соседей соседей. Как будто сплетни распространяешь. DFS — в глубину: упорно лезешь в одну ветку, пока не упрёшься в тупик, потом отступаешь. Как будто ищешь ключи в квартире после пьянки.

Динамическое программирование — это когда ты не хочешь делать одно и то же дважды. Типа числа Фибоначчи: если будешь считать каждое число с нуля, то состаришься быстрее, чем дойдёшь до сотого. А так — запоминаешь результаты и используешь их снова. Хитро, блядь, но мозг иногда ломает.

Жадные алгоритмы — это как я в буфете: беру самое вкусное и дорогое, не думая о последствиях. Иногда работает, иногда получается пиздец. Задача о рюкзаке — классика: набиваешь рюкзак самым ценным, пока есть место. Но не всегда это оптимально, иногда надо взять что-то менее ценное, но больше по количеству.

Деревья... Ну, это структура, где у каждого элемента есть родитель и дети, как в нормальной семье, только без скандалов. Обходы: можно идти сверху вниз, снизу вверх или как-то ещё. Балансировка — чтобы дерево не превратилось в длинную палку, которая работает медленнее, чем бюрократ в пятницу.

Вот, вкратце, вся эта хуйня. Если что-то непонятно — спрашивай, но только по делу, а то у меня терпения, блядь, ноль.