Алгоритм разделяй и властвуй

В этом руководстве вы узнаете, как работает алгоритм «разделяй и властвуй». Мы также сравним подход «разделяй и властвуй» с другими подходами для решения рекурсивной проблемы.

Алгоритм разделяй и властвуй стратегия решения большой проблемы путем

  1. разбиение проблемы на более мелкие подзадачи
  2. решение подзадач и
  3. объединяя их, чтобы получить желаемый результат.

Чтобы использовать алгоритм «разделяй и властвуй», используется рекурсия . Узнайте о рекурсии на разных языках программирования:

  • Рекурсия в Java
  • Рекурсия в Python
  • Рекурсия в C ++

Как работают алгоритмы «разделяй и властвуй»?

Вот шаги:

  1. Разделить : разделите данную проблему на подзадачи с помощью рекурсии.
  2. Победить : рекурсивно решать более мелкие подзадачи. Если подзадача достаточно мала, решите ее напрямую.
  3. Объединить: объединить решения подзадач, которые являются частью рекурсивного процесса, для решения актуальной проблемы.

Давайте разберемся с этой концепцией на примере.

Здесь мы будем отсортировать массив, используя подход «разделяй и властвуй» (то есть сортировка слиянием).

  1. Пусть данный массив будет: Массив для сортировки слиянием
  2. Разделите массив на две половины. Разделите массив на две части.
    Снова разделите каждую часть рекурсивно на две половины, пока не получите отдельные элементы. Разделите массив на более мелкие части
  3. Теперь объедините отдельные элементы в отсортированном виде. Здесь побеждайте и соединяйте шаги бок о бок. Объедините подчасти

Сложность времени

Сложность алгоритма «разделяй и властвуй» рассчитывается с помощью основной теоремы.

T (n) = aT (n / b) + f (n), где n = размер входных данных, a = количество подзадач в рекурсии, n / b = размер каждой подзадачи. Предполагается, что все подзадачи имеют одинаковый размер. f (n) = стоимость работы, выполненной вне рекурсивного вызова, которая включает стоимость разделения проблемы и стоимость объединения решений.

Давайте рассмотрим пример, чтобы найти временную сложность рекурсивной задачи.

Для сортировки слиянием уравнение можно записать как:

 T (n) = aT (n / b) + f (n) = 2T (n / 2) + O (n) Где, a = 2 (каждый раз проблема делится на 2 подзадачи) n / b = n / 2 (размер каждой подзадачи составляет половину входных данных) f (n) = время, затраченное на разделение задачи и слияние подзадач T (n / 2) = O (n log n) (Чтобы понять это, обратитесь к основная теорема.) Теперь T (n) = 2T (n log n) + O (n) ≈ O (n log n) 

Разделяй и властвуй против динамического подхода

Подход «разделяй и властвуй» делит проблему на более мелкие подзадачи; эти подзадачи в дальнейшем решаются рекурсивно. Результат каждой подзадачи не сохраняется для использования в будущем, тогда как при динамическом подходе результат каждой подзадачи сохраняется для использования в будущем.

Используйте подход «разделяй и властвуй», когда одна и та же подзадача не решается несколько раз. Используйте динамический подход, если результат подзадачи будет использоваться несколько раз в будущем.

Давайте разберемся в этом на примере. Предположим, мы пытаемся найти ряд Фибоначчи. Потом,

Подход «разделяй и властвуй»:

 fib (n) Если n <2, вернуть 1 Else, вернуть f (n - 1) + f (n -2) 

Динамический подход:

 mem = () fib (n) Если n в памяти: вернуть mem (n) else, Если n <2, f = 1 else, f = f (n - 1) + f (n -2) mem (n) = f возврат f 

При динамическом подходе mem хранит результат каждой подзадачи.

Преимущества алгоритма разделяй и властвуй

  • Сложность умножения двух матриц с использованием наивного метода составляет O (n 3 ), тогда как при использовании подхода «разделяй и властвуй» (т. Е. Умножения матриц Штрассена) составляет O (n 2,8074 ). Этот подход также упрощает другие проблемы, такие как Ханойская башня.
  • Этот подход подходит для многопроцессорных систем.
  • Он эффективно использует кеши памяти.

Разделяй и властвуй приложения

  • Бинарный поиск
  • Сортировка слиянием
  • Быстрая сортировка
  • Умножение матриц Штрассена
  • Алгоритм Карацубы

Интересные статьи...