Я написал функцию для поиска самой длинной общей подпоследовательности (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 и т. Д.
Спасибо!