Я пытаюсь написать рекурсивный алгоритм, который находит самую длинную общую подпоследовательность двух списков, как описано в http://en.wikipedia.org/wiki/Longest_common_subsequence_problem#LCS_function_defined
Похоже, что рекурсия никогда не заканчивается, и я не могу понять, что я делаю неправильно
public static List<ActionType> getLongestSequence(List<ActionType> list1, List<ActionType> list2) {
return getLongestSequence(list1, list2, list1.size(), list2.size());
}
public static List<ActionType> getLongestSequence(List<ActionType> list1, List<ActionType> list2, int list1index, int list2index) {
if (list1index == 0 || list2index == 0) {
return new ArrayList<ActionType>();
}
if (list1.get(list1index-1).equals(list2.get(list2index-1))) {
List<ActionType> retVal = getLongestSequence(list1, list2, list1index-1, list2index-1);
retVal.add(list1.get(list1index-1));
return retVal;
} else {
List<ActionType> ret1 = getLongestSequence(list1, list2, list1index, list2index-1);
List<ActionType> ret2 = getLongestSequence(list1, list2, list1index-1, list2index);
if (ret1.size() > ret2.size()) {
return ret1;
} else {
return ret2;
}
}
}
Любая помощь в выяснении этого приветствуется. Спасибо.
n
иm
это должно занятьO(n*m)
времени. Дляn=m=1000
я бы не ожидал, что это займет больше часа, но трудно сказать, что такое постоянный фактор, без некоторого тестирования. - person Mark Elliot   schedule 20.10.2013