разделите и завоюйте и рекурсия

Интересно, побеждает ли метод деления и, всегда делят проблему на подпроблемы того же типа? Тем же типом я подразумеваю, что можно реализовать его с помощью функции с рекурсией. Может разделить и завоевать всегда быть реализованным рекурсией?

Спасибо!

11
задан Tim 12 February 2010 в 05:02
поделиться

3 ответа

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

См. статью в Википедии для получения дополнительной информации.

15
ответ дан 3 December 2019 в 04:32
поделиться

Алгоритм "разделяй и властвуй" по определению является алгоритмом, который может быть решен с помощью рекурсии. Поэтому ответ - да.

6
ответ дан 3 December 2019 в 04:32
поделиться

В каждой из форм можно сохранить один и тот же нонс. Проще всего связать nonce с идентификатором сеанса, чтобы эти формы работали только в этом сеансе.

Вы захотите затруднить злоумышленникам поиск идентификаторов сеансов и создание собственных неисков. Таким образом, одним из способов решения этой проблемы является использование HMAC-SHA256 (или т.п.) для хеширования идентификатора сеанса, используя ключ, который вы не раскрываете общественности.

(Очевидно, что если злоумышленник может получить фактический идентификатор сеанса, он уже может выполнить захват сеанса. Так что это не то, о чем я говорю, а скорее возможность злоумышленника создать сценарий (который работает на компьютере жертвы), который может каким-то образом захватить идентификатор сеанса и использовать его для динамической генерации URL с предварительно заполненным nonce.)


ETA: Достаточно ли этого подхода самостоятельно, зависит от того, как долго вы ожидаете, что ваши типичные сеансы продлятся. Если пользователи обычно используют длительные сеансы длительностью более нескольких часов, вам потребуется что-то более сложное.

Один из подходов заключается в создании нового нонса для каждой формы, который содержит отметку времени, а также хэш (отметка времени. sessionid) (где хэш является некоторым вариантом HMAC, как описано выше, для предотвращения подделки, и . - конкатенация строк). Затем вы проверяете nonce:

  1. , проверяя временную метку, чтобы убедиться, что nonce достаточно свежий (это зависит от вашей политики, но несколько часов являются типичными)
  2. Затем, вычисляя хэш на основе временной метки и идентификатора сеанса, и сравнивая с nonce, чтобы проверить, что nonce аутентичен

Если проверка nonce не пройдена, вы хотите отобразить новую форму, предварительно заполненную отправкой пользователя (чтобы если им понадобился целый день, чтобы написать свой пост, они не потеряли всю свою тяжелую работу), а также свежий нонс. После этого пользователь может сразу же выполнить повторную отправку.

-121--3159607-

Идея, лежащая в основе свойств, заключается в том, что, даже если вы не намерены менять их сейчас или позже, mabye может потребоваться каким-то непредвиденным образом. Допустим, нужно поменять геттер, чтобы сделать какой-то расчет, или протоколирование. Возможно, потребуется добавить обработку исключений. Много потенциальных причин.

Рассмотрим также семантику. если T1 является типом значения, а не ссылочным типом, то при обращении к obj.Item1 возвращается копия _Item1 в получателе, а при доступе к Item1 без получателя не извлекается копия. Это означает, что, хотя Item1 может быть неизменяемым внутри, возвращаемый объект типа значения не является. Я не могу придумать причину, почему это было бы хорошей вещью, но это разница.

-121--1308728-

Обычно, да! Сортировка слиянием является его примером. Вот анимированная версия .

1
ответ дан 3 December 2019 в 04:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: