2013-11-26 4 views
0

У меня недавно был вопрос с интервью следующим образом: Нам дается список слов, и мы хотим отформатировать их, чтобы максимизировать # возврата каретки, сохраняя # букв на линию в пределах диапазона.Максимизация алгоритма возврата каретки (жадный?)

Например, мы хотим, чтобы диапазон 5 - 10 (включительно) букв в каждой строке одно решение заключается в следующем:

 
hello (5) 
cat (3) 

Другой заключается в следующем:

 
hello cat (9) <- 1 for a space 

Таким образом, первое решение лучше, потому что у нас есть 1 возврат каретки против 0 во втором.

Если слово не подходит, оно должно быть размещено на новой строке. Например:

 
hello (5) 
people (6) 

Наглядно мне это кажется жадной проблемой алгоритма, где мы вернемся, как только мы встретим минимальное письмо за линии ограничения. Однако это кажется слишком простым, и теперь я начинаю сомневаться в себе, но я не могу придумать встречный пример, где жадный не самый лучший.

+0

Почему у вас есть минимальный диапазон (5 в 5-10), если вы позволите «коту» (три буквы) быть в своей собственной линии? – justhalf

+0

Я не считал это ... Я предположил, что последнее слово не под этими ограничениями. Но если это так, то жадные, вероятно, не сработают ... – DillPixel

+1

Я предполагаю, что в диапазоне не должно быть минимума. В противном случае этот случай неразрешимый: «bullfrog ест буйвол». «Ест» не сможет спариваться с любым словом, не нарушая максимум 10 символов. Если вход ограничен, чтобы всегда иметь решение, учитывая условие диапазона. – justhalf

ответ

1

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

Если вам разрешено изменять порядок слов, то это более сложная проблема, и тогда может применяться следующий подход.

Сортировка слов в порядке убывания количества букв.

Присвоить одну линию друг с словами длиной> = 5.

Для слов длины < 5, это проблема обратных несколько бункеров бен подложек, в котором:
Контейнеров имеют минимальную емкость 5 и максимум емкость 10.
Вы должны поместить слова в бункеры таким образом, чтобы количество бункеров было максимально.

Это, по крайней мере, NP полная проблема, но «я думаю» (тем более, что это было задано в интервью), можно подумать о динамической формулировке программирования, которая решает ее в псевдополиномиальное время (например, проблему с рюкзаком) ,

EDIT: IMO жадный алгоритм должен работать в том случае, если максимальная емкость не менее удвоенной минимальной емкости, как в этом случае.

+0

Возможно, я был неясно, но слова должны быть отформатированы по порядку. Если нам даны слова «привет», «мир», «кошка», каретки должны быть размещены так, чтобы этот порядок поддерживался. – DillPixel

+1

@DillPixel В этом случае это простой жадный подход, который даст вам решение, потому что нет причин, по которым вы не поместили бы возврат каретки как можно раньше. –

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