Это действительно зависит от вашего определения «редукции».
Стандартный тип сокращения, который обычно обсуждается, — это сопоставление (также снижение). Сведение отображения от проблемы X к проблеме Y выглядит следующим образом:
Имея вход IX для задачи X, преобразуйте его во вход IY для задачи Y. Затем запустите решатель для задачи Y на IY sub> и вывести этот ответ.
При сокращении отображения вы можете сделать ровно один вызов подпрограммы, которая решает проблему Y, и вы должны вывести любой ответ, который вы получите от этой подпрограммы. Например, вы можете уменьшить проблему «четно ли это число?» к проблеме "нечетно ли это число?" прибавляя единицу к числу и выводя, является ли полученное число нечетным.
В качестве примера редукции отображения рассмотрим две проблемы: во-первых, проблема «каждое логическое значение в этом списке истинно?» и, во-вторых, проблема «является ли какое-либо логическое значение в этом списке ложным?» Если у вас есть решатель для второй задачи, вы можете использовать его для решения первой, запустив решатель для второй задачи и выведя противоположный результат: список логических значений содержит некоторый элемент, который является ложным тогда и только тогда, когда он не случай, когда каждый элемент списка истинен. Однако это сокращение не является сокращением отображения, потому что мы меняем результат, полученный подпрограммой.
Часто используется другой тип редукции — Тьюринг-редукция. Сведение Тьюринга от проблемы X к проблеме Y выглядит следующим образом:
Постройте алгоритм, решающий проблему X, предполагая, что существует волшебный черный ящик, который всегда решает проблему Y.
Все редукции отображения являются редукциями Тьюринга, но не наоборот. Приведенное выше сокращение от «все ли правда?» на «что-то ложное» не является сокращением отображения, но это сокращение Тьюринга, потому что вы можете использовать подпрограмму для «что-то ложное?» чтобы узнать, содержит ли список какие-либо ложные значения, а затем может вывести обратное.
Еще одно важное различие между редукциями отображения и редукциями Тьюринга состоит в том, что в редукции Тьюринга вы можете делать несколько вызовов подпрограммы, которая решает проблему Y, а не только один.
Вы можете думать и о быстрой сортировке, и о медиане медиан как об алгоритмах, которые используют разбиение как подпрограмму. В быстрой сортировке эта подпрограмма выполняет всю тяжелую работу, необходимую для сортировки всего, а в медиане медиан она выполняет один из важных шагов по сокращению ввода. Поскольку оба алгоритма выполняют несколько вызовов подпрограммы, вы можете думать о них как о сокращениях в стиле Тьюринга. Быстрая сортировка — это сокращение от сортировки к разделению, а медиана медиан — это сокращение от выбора к разделению.
Надеюсь это поможет!
person
templatetypedef
schedule
15.12.2013