2015-10-11 10 views
2

Я застрял в этой проблеме. Может кто-то, пожалуйста, помогите мне решить это?Сортировка различных строк

Нам даны n отсортированных линий людей с длиной l1, l2, ..., ln. Строки отсортированы по высоте. Мы хотим объединить все строки в одну отсортированную строку. Мы можем объединить 2 строки за раз, что требует времени, которое пропорционально количеству людей в обеих линиях.

Создайте алгоритм, в котором мы можем выбрать лучший порядок для объединения всех строк в течение как можно меньшего количества времени.

+2

Это не очевидно для меня, как MST связан с этим. Не могли бы вы уточнить? –

+0

Вы объединяете только 'l1' и' l2' каждую итерацию или можете выбрать любую пару? после того, как вы объедините их, вы можете изменить порядок линий? – svs

+0

@AsadSaeeduddin Я думаю, что мы можем сделать граф с линиями в виде вершин, а количество людей в 2 строках должно быть объединено как расстояние между этими двумя вершинами. – CsIsFun

ответ

3

Рассмотрим жадный алгоритм:

while line number > 1: 
    take the shortest two lines li, lj 
    merge them 

Является ли это оптимальным решением? Вы видите, что следующие факты верны:

  • , если вы знаете, дерево слияния (то есть дерево, которое говорит вам, что были объединены пары линий и когда (глубже элемент объединены первым и дерево читаются слева направо)), мы видим, что оптимальным решением является тот, в котором линии с малой длиной имеют большую глубину. Мы можем начинать с листьев, заполняя дерево, снизу вверх, с длиной линий, отсортированной в порядке возрастания.
  • , что означает наименьшие две линии на листьях
  • изменяющих порядок листа не меняется оптимальное решение
  • мы можем изменить порядок наименьшие линии, чтобы быть первым двух Лифс Итак, мы нашли оптимальное решение в который мы выбираем, объединяют две линии с наименьшей длиной. По индукции мы можем продолжать это.

Вы можете реализовать этот алгоритм с использованием очереди с минимальным приоритетом.

initialize min-priority queue q  
insert all line lengths in q 
ans = 0 
while q > 1: 
    a = q.pop() 
    b = q.pop() 
    ans += a+b 
    q.push(a+b) 
return ans 
+0

Это хорошо! Благодарю. Я пытаюсь думать о другом подходе, кроме жадного алгоритма. Есть ли у вас какие-либо идеи? – CsIsFun

+0

@CsIsFun почему вам нужен другой подход? этот подход дает вам оптимальное решение, и у него очень хорошая временная сложность. – svs

+0

Мне просто интересно. Но это хорошо. Является ли сложность времени O (n) для вашего алгоритма? – CsIsFun

Смежные вопросы