Я использую подход 5: Merge with Divide And Conquer
для решения проблемы сортировки слиянием K в leetcode< /а>. Алгоритм очень быстрый и занимает около 100 мс. Однако я не понимаю, почему подход reduce
требует гораздо более медленного времени выполнения (4000+ мс).
Вот разница кода:
# reduce
import functools
return functools.reduce(_mergeTwoLists, lists)
# divide and conquer
step = 1
while step < num:
for i in range(0, num - step, step * 2):
lists[i] = _mergeTwoLists(lists[i], lists[i + step])
step *= 2
return lists[0]
Если разделяй и властвуй работает в parallel
, я могу понять, почему разделяй и властвуй быстрее, но я думал, что он все еще должен работать линейно, верно?
Я также пишу еще одну дорогую версию merge
для проверки diff:
def add(a, b):
tmp = 0
for i in range(1, 5000):
tmp += i
return a + b
Время работы этой версии reduce
и divide and conquer
практически идентично.
Есть ли тестовый пример отсортированного списка слияния K, который reduce
не может обработать? Есть ли что-то, чего мне не хватает в разделяй и властвуй?