Я только что закончил кодирование некоторых классических алгоритмов разделяй и властвуй, и я придумал следующий вопрос: (больше для любопытства)Действительно ли побеждает ли разделение и завоевание против увеличения объема памяти?
Следует признать, что во многих случаях, разделяй и властвуй алгоритм быстрее, чем традиционный алгоритм; например, в Fast Fourier Transform, это улучшает сложность от N^2 до Nlog2N. Однако через кодирование я узнал, что из-за «деления» у нас больше подзадач, а это значит, что мы должны создавать больше контейнеров и дополнительно выделять больше памяти на подзадачу. Подумайте об этом, в сортировке merge мы должны создать левый и правый массивы в каждой рекурсии, а в Fast Fourier Transform нам нужно создать нечетный и четный массив в каждой рекурсии. Это означает, что мы должны выделять больше памяти во время алгоритма.
Итак, на мой вопрос, на самом деле, например, в C++, действительно ли такие алгоритмы, как divide-and-conquer, действительно выигрывают, когда нам также нужно увеличить сложность в распределении памяти? (Или выделение памяти не будет занимать время выполнения, а стоимость равна нулю?)
Спасибо, что помогли мне!
Во многих случаях сокращение времени, которое требуется для работы функции, требует сопоставимого увеличения использования памяти. Вы можете уменьшить время, которое алгоритм пер- ветинга занимает, например, путем хранения многих простых чисел в памяти. – abiessu
В программировании вам часто приходится выбирать между быстрым или тонким ресурсом, вы очень редко можете выбрать оба. (И, к сожалению, очень легко найти программы, в которых ни одна из альтернатив не была выбрана.) –
Не все подходы с разделением и завоеванием требуют больше памяти, во многих случаях операции могут выполняться на месте. Конечно, есть случаи, когда требуется дополнительная или желательная дополнительная память (вы можете сделать шаг слияния в mergesort, не приобретая дополнительной памяти, но производительность будет хуже. –