递归与分治策略

发布于:2022-12-22 ⋅ 阅读:(489) ⋅ 点赞:(0)

目录

一、递归的概念

二、分治法的基本思想

三、分治策略范例

(1)二分搜索

(2)大整数乘法

(3)Strassen矩阵乘法

(4)棋盘覆盖

(5)合并排序和快速排序

(6)线性时间选择

(7)最接近点对问题

(8)循环赛日程表


一、递归的概念

递归算法:直接或间接地调用自身的算法

递归函数:用自身函数给出定义的函数

(边界条件、递归方程)

//例题1:阶乘函数
int factorial(int n)
{
  if(n==0)
    return 1;
  return n*factorial(n-1);
}
//例题2:Fibonacci数列
int fibonacci(int n)
{
   if(n<=1)
     return 1;
   return fibonacci(n-1)+fibonacci(n-2);
}
//例题3:排列问题
template<class Type>
void Perm(Type list[], int k, int m)
{
    if (k == m)
    {
        for (int i = 0; i <= m; i++)
        {
            cout << list[i];
        }
        cout << endl;
    }
    else
    {
        for (int i = k; i <= m; i++)
        {
            Swap(list[k], list[i]);
            Perm(list, k + 1, m);
            Swap(list[k], list[i]);
        }
    }
}
template<class Type>
inline void Swap(Type& a, Type& b)
{
    Type temp = a;
    a = b;
    b = temp;
}
//例题4:整数划分问题
int q(int n, int m)
{
    if ((n < 1) || (m < 1))
        return 0;
    if ((n==1) || (m==1))
        return 1;
    if (n < m)
        return q(n, n);
    if (n==m)
        return q(n, m-1)+1;
    return q(n, m - 1) + q(n - m, m);

}
//例题5:Hanoi问题
void hanoi(int n, int a, int b, int c)
{
    if (n > 0)
    {
        hanoi(n - 1, a, c, b);
        move(a, b);
        hanoi(n - 1, c, b, a);
    }
}

二、分治法的基本思想

设计思想:将一个难以直接解决的大问题分割成一些规模较小的相同问题,各个击破,分而治之。

适用条件:

1、该问题的规模缩小到一定的程度就可以容易地解决

2、该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质。

3、利用该问题分解出的子问题的解可以合并为该问题的解;

4、该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。

递归式:

T(N) = a*T(N / b) + O (N^d)

条件 时间复杂度
log(b,a) < d O(N ^ d)
log(b,a) > d O(N ^ log(b,a))
log(b,a) = d O((N^d) * logN)

三、分治策略范例

(1)二分搜索

(2)大整数乘法

(3)Strassen矩阵乘法

(4)棋盘覆盖

(5)合并排序和快速排序

(6)线性时间选择

(7)最接近点对问题

(8)循环赛日程表

本文含有隐藏内容,请 开通VIP 后查看

网站公告

今日签到

点亮在社区的每一天
去签到