Я представляю проблему, которую показал мой профессор в классе, с моим O (n * log (n)) решение:Извлечение 2 чисел n раз и возврат обратно в O (n) вместо 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 (п)?
EDIT:
Говоря: «извлечения двух минимальных элементов x,y
из списка и представить их», я имею в виду printf("%d,%d" , x,y)
, где x
и y
являются наименьшие элементы в текущем списке.
Просто, чтобы убедиться, что это ясно: вы хотите, чтобы уменьшить массив к одному элементу, каждый шаг удаления 2 минимальных элементов и инъекционного назад их сумму, и вы хотите сделать это в O (N) времени? – cheeken
@cheeken: Это правильно! – ron
Знаете ли вы что-нибудь о размерах номеров в списке? Гарантированы ли они в каком-то диапазоне? – templatetypedef