Я написал функцию для поиска самой длинной общей подпоследовательности (LCS). Например, для двух последовательностей символов BANANA и ATANA он возвращает AANA. Реализация является наивной неэффективной адаптацией рекурсивного алгоритма, но не имеет отношения к цели этого вопроса.
def LCS[T](a: Seq[T], b: Seq[T]): Seq[T] = {
if (a.isEmpty || b.isEmpty)
Seq.empty
else if (a.head == b.head)
a.head +: LCS(a.tail, b.tail)
else {
val case1 = LCS(a.tail, b)
val case2 = LCS(a, b.tail)
if (case1.length > case2.length) case1 else case2
}
}
Я хочу провести рефакторинг этой функции самым общим способом. Текущая реализация работает для любых типов входных последовательностей, но всегда возвращает коллекцию типа List [T]. Я хочу добиться следующего поведения:
LCS(List('B','A','N','A','N','A'), List('A','T','A','N','A')) -> List('A','A','N','A') LCS(Vector('B','A','N','A','N','A'), Vector('A','T','A','N','A')) -> Vector('A','A','N','A') ...and so on for all other Seqs...
Было бы замечательно, если бы LCS также мог обрабатывать String s и Array s:
LCS("BANANA", "ATANA") -> "AANA" LCS(Array('B','A','N','A','N','A'), Array('A','T','A','N','A')) -> Array('A','A','N','A')
Я считаю, что с помощью общей библиотеки коллекций Scala 2.8 можно выполнить хотя бы первое требование. Будем рады увидеть "тяжелую" технику, такую как высший полиморфизм, классы типов, CanBuildFrom и так далее.
Спасибо!