Я представляю задачу, которую мой профессор показал в классе, с моим решением O(n*log(n)):
Дан список из n
чисел, которые нам нужны выполнить следующие n-1
раз:
x,y
из списка и представить ихz
, где z = x+y
z
обратно в списокПредложить структуру данных и алгоритм для O(n*log(n))
и O(n)
Решение:
Мы будем использовать минимальную кучу:
Однократное создание кучи займет O(n). После этого извлечение двух минимальных элементов займет O (log (n)). Помещение z
в кучу потребует O(log(n)).
Выполнение описанного выше n-1
раз потребует O(n*log(n)), поскольку:
O(n)+O(n∙(logn+logn ))=O(n)+O(n∙logn )=O(n∙logn )
Но как я могу сделать это за O(n)?
РЕДАКТИРОВАТЬ:
Говоря: «извлеките два минимальных элемента x, y
из списка и представьте их », я имею в виду printf("%d ,%d" , x,y)
, где x
и y
— наименьшие элементы в текущем списке.