Мне непонятно, почему вы думаете, что временная сложность вашего алгоритма равна O (n 4 ); основной l oop повторяется m раз, внутренний l oop повторяет O (n) раз, а тесты i in k
и position in k
в этом внутреннем l oop являются O (m), если реализованы как линейные search или O (log m), если реализовано как бинарный поиск. Это дает временную сложность O (m 2 n) или O (mn log m) соответственно. Они оба лучше, чем O (n 4 ), потому что m ≤ n.
Проблема действительно может быть решена более эффективно. Основная идея состоит в том, чтобы использовать приоритетную очередь для отслеживания индексов текущего m самых маленьких элементов массива. Инициализируйте приоритетную очередь первыми m индексами. Затем для каждого другого индекса вставьте его в очередь приоритетов и затем удалите тот индекс, который имеет значение массива самое большое из очереди приоритетов. Наконец, когда вы достигнете конца массива, опросите индексы из очереди приоритетов, чтобы привести их в порядок.
Длина приоритета всегда не более m + 1, поэтому, если вы используете heap в качестве очереди с приоритетами, затем операции вставки и удаления наибольшего занимают O (log m) времени. Это сделано для (n - m) элементов массива. Начальная стадия вставки m индексов в кучу, и финальная стадия опроса m элементов из кучи, занимает время O (m log m). Это делает общую временную сложность O (m log m + (n - m) log m), что упрощается до O (n log m).