Skip to content

数据结构与算法 ​

学习链接

绪论 ​

迭代与递归 ​

减而治之 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

分治策略对应的递推式,通常(尽管不总是)形如: T(n)=a⋅T(n/b)+O(f(n))
(原问题被分为 a 个规模均为 n/b 的子任务;任务的划分、解的合并耗时 f(n))

若 f(n)=O(nlogba−ϵ) ,则 T(n)=Θ(nlogba)

  • kd-search: T(n)=2⋅T(n/4)+O(1)=O(n)

若 f(n)=Θ(nlogba⋅logkn) ,则 T(n)=Θ(nlogba⋅logk+1n)

  • binary search: T(n)=1⋅T(n/2)+O(1)=O(logn)
  • mergesort: T(n)=2⋅T(n/2)+O(n)=O(n⋅logn)
  • STL mergesort: T(n)=2⋅T(n/2)+O(n⋅logn)=O(n⋅log2n)

若 f(n)=Ω(nlogba+ϵ) ,则 T(n)=Θ(f(n))

  • quick select(average case): T(n)=1⋅T(n/2)+O(n)=O(n)

动态规划 ​

Kent Beck

make it work, make it right, make it fast.

fib() 递归

fib(n)=fib(n−1)+fib(n−2):0,1,1,2,3,5,8,...

cpp
int fib(n) {
    return (2 > n) ? n : fib(n - 1) + fib(n - 2);
}

吃好喝好 快乐地活下去