以下代碼遍歷列表一次並找到LIS。我不明白爲什麼DP算法應該採用O(n2)。有人可以解釋爲什麼以下LIS算法不是O(n)?
//C
int lis(int *a, int l){
if(l == 0) return 1;
else if(a[l] > a[l - 1]) return 1 + lis(a, l - 1);
else return lis(a, l - 1);
}
int main(){
int a[] = { 10, 22, 9, 33, 21, 50, 41, 60 };
cout << lis(a, sizeof(a)/sizeof(a[0]) - 1);
}
% erlang
lis([_H]) -> 1;
lis([H1, H2 |T]) when H1 > H2 -> 1 + lis([H2|T]);
lis([_H|T]) -> lis(T).
main() -> lis(lists:reverse([ 10, 22, 9, 33, 21, 50, 41, 60 ])).
也許我誤解了一些東西,但爲什麼你認爲你的erlang實現不是O(n)? – 2014-11-21 10:42:40
我的c和erlang代碼的複雜性不一樣嗎? 根據維基百科和http://goo.gl/R1WHrP,這個問題需要O(n2),它可以改進爲O(n logn)。 – 2014-11-21 10:59:34