Мне нужно найти индексы k наибольших элементов несортированного длины n, array/vector в C++, k < n. Я видел, как использовать nth_element() для поиска k-й статистики, но я не уверен, что использование этого является правильным выбором для моей проблемы, поскольку мне кажется, что мне нужно будет сделать k вызовов nth_statistic, что, я думаю у него будет сложность O (kn), которая может быть такой же хорошей, как она может быть получена? Или есть способ сделать это только в O (n)?индексы k наибольших элементов в массиве unsorted length n
Реализация без nth_element() кажется, что мне придется перебирать весь массив один раз, заполняя список индексов самых больших элементов на каждом шаге.
Есть ли что-нибудь в стандартной библиотеке C++, которая делает это одним лайнером или любым умным способом реализовать это самостоятельно всего за пару строк? В моем конкретном случае k = 3 и n = 6, поэтому эффективность не вызывает большого беспокойства, но было бы неплохо найти чистый и эффективный способ сделать это при любых k и n.
Похоже, что Mark the top N elements of an unsorted array - это, вероятно, самая близкая публикация, которую я могу найти на SO, сообщения есть в Python и PHP.
Вы можете изменить вектор? nth_element будет выполнять частичную сортировку на месте, поэтому он изменяет вектор. – amdn
Вектор может быть изменен, однако конечный результат должен быть индексом (исходного вектора) из k наибольших элементов. – hazelnusse
Это всего лишь алгоритм выбора. Обычно вы будете использовать выбор кучи или быстрый выбор. См. Http://stackoverflow.com/q/7746648/56778 для аналогичного вопроса. Существует ответ с хорошим решением на C++. (using priority_queue) –