Я бы сохранил эти значения в двух параллельных структурах.Во-первых, есть массив двойных значений, каждое из которых хранит указатель.Затем сохраните все строки в хеш-таблице вместе со вспомогательным целым числом.Идея состоит в том, что указатели в массиве указывают на узлы в хэш-таблице или три, содержащие строку, связанную с двойным числом, в то время как целочисленное значение с каждой строкой хранит индекс двойного в паре с этой строкой.
Чтобы вставить пару строка / двойка в эту структуру, вы добавляете строку в хеш-таблицу, добавляете двойную к массиву, затем сохраняете указатель на новую строку в массиве и индекс двойного в хеш-таблице.Это имеет сложность O (k), где k - длина строки.
Чтобы изменить приоритет, найдите строку в хеш-таблице, а затем получите индекс типа double в массиве.Затем вы можете изменить этот элемент, чтобы изменить связанный с ним приоритет.Это также имеет сложность O (k).
Чтобы отбросить все, кроме верхних пар ключ / значение B, запустите алгоритм выбора в массиве, чтобы поместить верхние элементы B в одну часть массива и оставшиеся Cэлементы в другом.Всякий раз, когда вы выполняете обмен, следуйте указателям из массива в хеш-таблицу и обновляйте индексы элементов, которые вы только что обменяли.Наконец, выполните итерацию по последним элементам C массива, следуйте их указателям обратно в хеш-таблицу и удалите элементы, на которые они указывают, из таблицы.Это занимает ожидаемое время O (n) для выполнения шага выбора или время O (n) в худшем случае с использованием алгоритма медианы медиан, а затем время O (n) для удаления элементов из хеш-таблицы дляожидаемое время выполнения O (n), где n - количество элементов в структуре.
Подводя итог, можно получить O (k) вставку и поиск любой строки, где k - длина строки, иO (n) сохранение лучших элементов, где n - общее количество элементов.