Предположим, вам предоставлена функция слияния, которая объединит (найдет объединение) два списка L1 и L2 размера s1 и s2 в O (s1 + s2). Каков оптимальный способ слияния k-списков размером s1, s2, ..., sk?Каков оптимальный способ слияния списков k?
Я думаю, что мы должны сначала отсортировать s1, ..., sk и отсортировать первые два списка, которые соответствуют самым низким двум размерам. Когда они объединены, мы находим положение их размера в списке отсортированных размеров и продолжаем процесс до тех пор, пока не получим один список.
У меня возникли проблемы с двумя вещами: 1. действительно ли это оптимально (есть ли другой метод, который вернется быстрее)? 2. как мы анализируем время работы, когда размер списка изменяется при слиянии?
Отличный ответ! Спасибо. Не могли бы вы просто рассказать о том, почему нам нужно только разобраться в весах? Предположим, что отсортированный список весов равен s1, s2, ..., sk. Затем алгоритм будет объединять списки, соответствующие s1 и s2, для создания s12, а отсортированный список теперь будет выглядеть как s12, s3, ..., sk. Но s12 + s3 может быть больше s3 + s4. –
Или это: если наши отсортированные размеры равны s1, s2, ..., sk, соответствующие спискам L1, L2, ... Lk, тогда мы сначала объединяем L1 и L2 в L12, затем L3 и L4 в L34, чтобы получить L12 , L34, ..., Lk-1Lk и просто продолжить эту работу до тех пор, пока нам не останется один список? Если да, что нам делать, когда количество списков нечетное? Например, если мы имеем L1, L2, L3, L4, L5, то итерации выглядят так: L12, L34, L5 -> L1234, L5 -> L12345? –
@BobJonas: Есть два списка: список листьев (который постоянно уменьшается) и список соединений (которые растут). Первоначально соединения пусты. Начнем с s1, s2, s3, s4; -. После первого шага мы имеем '(s1, s2), s3, s4, ...; s12'. (Удаленные элементы в круглых скобках.) Если 's3' и' s4' являются наименьшими ('s12> s4'), тогда мы имеем' (s1, s2, s3, s4), s5, s6, ...; s12 , s34'. В противном случае 's3' и' s12' являются двумя наименьшими, и мы будем иметь '(s1, s2, s3), s4, s5, ...; (s12), s123'.Мы также должны рассмотреть три элемента, чтобы выбрать наименьшие два: самый маленький из каждого списка и ... – rici