Дайте k отсортированным перевернутым спискам, я хочу, чтобы эффективный алгоритм получил объединение этих k-списков? Каждый перевернутый список является массивом только для чтения в памяти, каждый список содержит целое число в отсортированном порядке. результат будет сохранен в предопределенном массиве, который достаточно велик. Есть ли какой-либо алгоритм лучше, чем слияние k-way?Объединение перевернутых списков
ответ
K-Way слияние оптимально. Он имеет O(log(k)*n)
ops [где n
- количество элементов во всех списках, объединенных].
Легко видеть, что это не может быть сделано лучше, - как уже упоминалось @jpalecek, в противном случае вы можете сортировать любой массив лучше тогда O(nlogn)
путем разделения его на куски [перевернутые индексы] размера 1.
- Примечание: Этот ответ предполагает, что важно, чтобы инвертированные индексы [результирующий массив] будут отсортированы. Это предположение верно для большинства приложений , в которых используются инвертированные индексы, особенно в области информации-поиска . Эта функция [отсортированные индексы] позволяет элегантное и быстрое пересечение индексов.
- Примечание: стандартное слияние k-way позволяет дублировать, вам нужно будет убедиться, что если элемент отображается в двух списках, он будет добавлен только один раз [легко сделать это, просто проверив последний элемент в целевой массив перед добавлением].
Не будет ли слияния k-way иметь хотя бы 'O (log (k) * n)' сложность времени, а не 'O (n)'? В противном случае вы можете отсортировать любой массив в 'O (n)' (принимая каждый элемент как один список). – jpalecek
@jpalecek: Вы абсолютно правы, я понятия не имею, что заставило меня написать это абсурдное утверждение [Угадай, что я нахожусь «k» как константа, и это явно не здесь]. Editted. – amit
Если вам не нужен результирующий массив для сортировки, лучшим подходом будет использование хеш-таблицы, чтобы отметить, какой из элементов вы видели. Таким образом, вы можете получить O(n)
(n
- общее количество элементов).
Что-то вдоль линий (Perl):
my %seen;
@merged = grep { exists $seen{$_} ? 0 : ($seen{$_} = 1) } (map {(@$_)} @inputs);
инвертированные индексы сортируются по умолчанию - результат не будет инвертированным индексом. – amit
- 1. Объединение двух списков списков
- 2. Объединение списков
- 3. Объединение/Объединение двух списков Erlang
- 4. Объединение списков списков вместе R
- 5. Объединение списков списков в прологе
- 6. Объединение двух списков списков - побитовое
- 7. Объединение связанных списков итеративно
- 8. Объединение списков в один
- 9. Объединение очень больших списков
- 10. Python: Объединение списков
- 11. Объединение двух родовых списков
- 12. Объединение двух связанных списков
- 13. Объединение списков в векторе
- 14. Объединение списков как строк
- 15. Объединение связанных списков
- 16. объединение списков кортежей
- 17. Быстрое объединение списков
- 18. Объединение 2 списков, Python
- 19. SML: Объединение двух списков
- 20. Объединение отсортированных списков
- 21. Объединение двух списков Python
- 22. Объединение списков разных объектов
- 23. Объединение списков в R
- 24. Объединение двух списков вместе
- 25. LINQ - объединение нескольких списков
- 26. C++ | Объединение списков ссылок
- 27. Haskell эффективное объединение списков
- 28. Объединение списков в R
- 29. Haskell Объединение нескольких списков
- 30. Объединение списков в LINQ
Каких значений содержатся в списке, и что это значит быть перевернутым? – sizzzzlerz
(1) Обратите внимание, что k-way merge не будет делать этого, так как могут быть обман между элементами, которые необходимо удалить. (2) Как реализованы инвертированные индексы? массив? дерево B +? – amit
@amit сортированный массив. –