1. Какова будет временная сложность цикла while
? (Я думаю O (k log n)).
O ( k log n ) правильно.
2. Следует ли считать O (k log n) выше, чем O (n) для целей этого вопроса? Есть ли порог, где он переключается?
Вы не можете этого допустить. k может быть в любом месте от 0 до n -1, что означает, что k log n может быть в любом месте от 0 до n log n .
3. Какова будет общая временная сложность этого кода? Это будет O (n)?
O ( n log n ), потому что это стоимость сборки кучи.
Возможно построить кучу за O ( n ) времени, но ваш код этого не делает; если это произойдет, ваша общая сложность будет O ( n + k log n ) или, что эквивалентно, O (МАКС. ( n , k log n )).
4. Если еще не O (n), есть ли способ решить это в O (n), используя класс PriorityQueue?
Нет. Существует алгоритмов выбора в худшем случае O ( n ), но они немного сложны и не используют PriorityQueue
.
Для самых быстрых решений на основе PriorityQueue
потребуется O (MAX ( n , n log MIN ( k , *) 1088 * n - k ))) время. (Ключ заключается в том, чтобы во время итерации сохранять в куче только самые маленькие элементы k или самые большие элементы n - k и использовать max-heap, если k достаточно большой, чтобы это стоило того.)