数据结构与算法
学习链接
绪论
迭代与递归
减而治之 decrease conquer
cpp
void reverse(int* A, int lo, int hi)
// 递归版
if (lo < hi) {
std::swap(A[lo], A[hi]);
reverse(A, lo + 1, hi - 1);
}
// 迭代原始
next:
if (lo < hi) {
std::swap(A[lo], A[hi]);
lo++;
hi--;
goto next;
}
// 迭代精简
while (lo < hi) {
std::swap(A[lo++], A[hi--]);
}
cpp
int sum(int A[], int n) {
return (n < 1) ? 0 : sum(A, n - 1) + A[n - 1];
}
分而治之 divide conquer
cpp
int sum(int A[], int lo, int hi) {
if (lo == hi)
return A[lo];
int mi = (lo + hi) >> 1;
return sum(A, lo, mi) + sum(A, mi + 1, hi);
}
Master Theorem
分治策略对应的递推式,通常(尽管不总是)形如:
(原问题被分为 a 个规模均为 n/b 的子任务;任务的划分、解的合并耗时 f(n))
若
- kd-search:
若
- binary search:
- mergesort:
- STL mergesort:
若
- quick select(average case):
动态规划
Kent Beck
make it work, make it right, make it fast.
fib() 递归
cpp
int fib(n) {
return (2 > n) ? n : fib(n - 1) + fib(n - 2);
}