Кучи кажутся очень подходящими, и кажется, что вы делаете это неправильно.
Скажем, вам нужны верхние x элементов (как это x соотносится с n, кстати?)
Что вы делаете, так это помещаете все в максимальную кучу и получаете верхний x.
Вместо этого я предлагаю вам использовать минимальную кучу ровно x элементов.
Первые x элементов, которые вы вставляете в кучу.
Следующий входящий элемент вы сравниваете с min, что можно сделать очень быстро (O(1) раз) в куче. Если меньше, вы просто игнорируете входящий элемент.
Если входящий элемент больше min, вы увеличиваете min до входящего элемента и просеиваете его в кучу. В худшем случае это должно быть время logx.
После этого (за время nlogx) вы можете извлечь элементы из кучи в отсортированном порядке за время O(xlogx).
В зависимости от того, каковы ваши данные (и насколько мал x), использование этого решения с минимальной кучей может быть очень быстрым.
Если вы действительно хотите, чтобы вставки были сверхбыстрыми и не очень заботились о поиске, вы также можете сделать следующее.
Вставьте элементы в вектор (массив с амортизированным временем вставки O (1)) в том порядке, в котором они появляются.
Используйте алгоритм выбора, чтобы найти x-й по величине элемент (за время O (n), но константы могут быть большими). Скажи, что это число С.
Теперь пройдитесь по массиву, сравнивая каждый элемент с S, и выберите элементы размером с S.
Если x имеет разумный размер и сравним с n (например, n/2 или что-то в этом роде), это может сработать нормально, но если x мал по сравнению с n, я бы предложил использовать мини-кучу.
person
Community
schedule
14.07.2010