@Homemade

Почти любой алгоритм, можно немного изменить, радикально уменьшив время его работы в лучшем случае. Как?

Начал читать Кормена. Там есть вот такой вот вопрос, но ответа нету. Я предполагаю, что ответ: "Отдельно обработать лучший случай (через if)".
Вероятно, что я ошибаюсь, поэтому задаю этот вопрос вам.
  • Вопрос задан
  • 491 просмотр
Решения вопроса 1
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Да, просто отдельно обработать какой-то случай предподсчитав его. Не обязательно лучший, просто какой-то. В результате этот случай станет лучшим и время его работы будет линейным (надо же сравнить входные данные).

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

Есть, правда спецэффекты, когда можно проверять только часть входных данных. Например для бинпоиска в массиве можно сравнить искомый элемент с первыми двумя, и найти ответ, если искомый элемент лежит где-то между ними.

Но, например, алгоритм суммирования всех чисел в массиве или поиска минимума вы так не ускорите.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Поскольку, лучший случай встречается намного реже других, то можно добавить сразу условие хардкодом, но это "капля в море" и прирост к производительности будет крайне мал.

Думаю, что здесь лучше поможет частотная эвристика с "накоплением знаний".
Т.е., самые частые выходные данные сопоставляются с входными и автоматически добавляются в нужное место алгоритма для предотвращения/обхода всех просчётов (или какой-то одной их части).
Происходит динамическая авто-оптимизация алгоритма "налету", как бы..
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы