【算法学习】减治 · 分治 · 变治(一)

简介: 【算法学习】减治 · 分治 · 变治


减治 · 分治 · 变治


好久不见,这里依旧是代班的工人~


微信图片_20220422145119.jpg


可能不是很想。。。emmm。。。没关系。。。


最近越学越发觉自己懂得好少。。。


但是最近又好忙好忙。。。


不过如今你们看到了这篇文章,说明我还是挺过来了!鼓掌~

(虽然不知道能不能挺过下周)


那么,趁着我还活着,这次还是带来基础算法的知识


秉持着大神来回顾,小白来学习的原则


让我们开始这期的学习吧!


目录


01.减治法

02.分治法

03.变治法




01

减  治  法

decrease-and-conquer method



普卢塔克说,萨特斯为了告诉他的士兵坚忍和智慧比蛮力更重要的道理,把两匹马带到他们面前,然后让两个人拔光马的尾毛。一个人是魁梧的大力士,他用力地拔了又拔,但一点效果也没有;另一个人是一个精美的、长相矫捷的裁缝,他微笑着,每次拔掉一根毛,很快就把尾巴拔得光秃秃的。

——E. Cobham Brewer,《惯用语和寓言词典》,1898



减治法(decrease-and-conquer method)

减治法采取划分后选择计算的思想,利用一个问题和同样较小规模的问题之间的某种关系进行划分。我们先确立这种关系,然后既可以从顶至下,也可以从底至上地来运用该关系,将大问题分解成小问题来解决,像是层层嵌套。在实际解决的过程中只针对部分子问题进行求解。

 

减治法有3种主要的变种:

1.减去一个常量 (decrease by a constant)

2.减去一个常数因子(decrease by a constant factor)

3.减去的规模是可变的(variable size decrease)

 

1.减去一个常量 (decrease by a constant)

 

在减常量变种中,我们每次从问题规模中减去一个规模相同的常量。(一般来说,这个常量等于一)微信图片_20220422145123.png

(CSDN盗图,别介意~)


函数f(n) = a^n的求解过程就是一个栗子:

微信图片_20220422145125.jpg

在这里,虽然算法的时间复杂度和蛮力法一致,但是体现的思想却不一样。

 

其他的栗子还有:

深度优先、广度优先查找,拓扑排序等。这里对拓扑排序稍加介绍。


拓扑排序是指:对一个有向无环图G进行排序,将G中所有顶点排成一个一维线性序列,使得图中任意一对顶点u和v,若边(u,v)∈E(G),则u在线性序列中出现在v之前(起点在终点之前)。

 

运用减治法思想的步骤:

1.在有向图中选一个没有前驱的顶点,输出;

2.删除所有和它有关的边;

3.重复上述两步,直至所有顶点输出。

(每次我们只减去常量1,因此当有多个点没有前驱时,只需要随意挑选一个点输出)

 

比如这样一个图:

微信图片_20220422145128.png

再比如这样一个图(其实是同一个图啦):

微信图片_20220422145130.png


我们最终会得到这样的序列:

v6—>v1—>v4—>v3—>v5—>v2;

当然,类似这样的序列也是正确的:

v1—>v6—>v4—>v3—>v5—>v2;

v1—>v3—>v6—>v4—>v5—>v2。。。

这里是要强调选择的随机性。这完全由代码决定。


没什么大问题,下面就到了激动人心的代码环节:


//拓扑排序:寻找图中入度为0的顶点作为即将遍历的顶点,遍历完后,将此顶点从图中删除
    #include <iostream>
    using namespace std;
    int adjMatrix[105][105];//参数adjMatrix:邻接矩阵
    int source [105];    // 参数source:给出图的每个顶点的入度值
    int n,m;  //给出图的顶点、边个数
    void getSourceSort( )
{
        int count = 0;                  //用于计算当前遍历的顶点个数 
        bool judge = true;
        while(judge)
    {
            for(int i = 1;i <= n;i++)
      {
                if(source[i] == 0) //当第i个顶点入度为0时,遍历该顶点
        {                
                    count++;
          if (count<n)cout<<i<<" --> ";
                    if(count==n)cout<<i;
                    source[i] = -1;                  //代表第i个顶点已被遍历
                    for(int j = 1;j <= n;j++)   //寻找第i个顶点的出度顶点
          {
                        if(adjMatrix[i][j] == 1)
                            source[j] -= 1;          //第j个顶点的入度减1 
                    }
                }
            }
            if(count == n)
               judge = false;
        }
    }
    //返回给出图每个顶点的入度值
    void getSource( )
{
        for(int i = 1;i <= n;i++) //若邻接矩阵中第i列含有k个1,则在该列的节点的入度为k,即source[i] = k 
    {          
            int count = 0;
            for(int j = 1;j <= n;j++)
      {
                if(adjMatrix[j][i] == 1)
                    count++;
            }
            source[i] = count;
        }
    }
    int main()
{
  int a,b;
  cin>>n>>m;
    for(int i = 1;i <= n;i++)  //初始化邻接矩阵 
        for(int j = 1;j <= n;j++)
            adjMatrix[i][j] =0;
    for(int i = 1;i <= m;i++)
    {
       cin>>a>>b;
       adjMatrix[a][b] = 1;
    }
    getSource();
    getSourceSort( );
    return 0;
}

微信图片_20220422145235.png


相关文章
|
23天前
|
存储 算法 安全
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
数据结构与算法系列学习之串的定义和基本操作、串的储存结构、基本操作的实现、朴素模式匹配算法、KMP算法等代码举例及图解说明;【含常见的报错问题及其对应的解决方法】你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
2024重生之回溯数据结构与算法系列学习之串(12)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丟脸好嘛?】
|
14天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
31 2
|
19天前
|
机器学习/深度学习 人工智能 自然语言处理
【EMNLP2024】基于多轮课程学习的大语言模型蒸馏算法 TAPIR
阿里云人工智能平台 PAI 与复旦大学王鹏教授团队合作,在自然语言处理顶级会议 EMNLP 2024 上发表论文《Distilling Instruction-following Abilities of Large Language Models with Task-aware Curriculum Planning》。
|
23天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习(8)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
23天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
23天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法
|
23天前
|
算法 安全 NoSQL
2024重生之回溯数据结构与算法系列学习之栈和队列精题汇总(10)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第3章之IKUN和I原达人之数据结构与算法系列学习栈与队列精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
23天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之王道第2.3章节之线性表精题汇总二(5)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
IKU达人之数据结构与算法系列学习×单双链表精题详解、数据结构、C++、排序算法、java 、动态规划 你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
30天前
|
算法 安全 数据安全/隐私保护
基于game-based算法的动态频谱访问matlab仿真
本算法展示了在认知无线电网络中,通过游戏理论优化动态频谱访问,提高频谱利用率和物理层安全性。程序运行效果包括负载因子、传输功率、信噪比对用户效用和保密率的影响分析。软件版本:Matlab 2022a。完整代码包含详细中文注释和操作视频。
|
7天前
|
算法 数据安全/隐私保护 索引
OFDM系统PAPR算法的MATLAB仿真,对比SLM,PTS以及CAF,对比不同傅里叶变换长度
本项目展示了在MATLAB 2022a环境下,通过选择映射(SLM)与相位截断星座图(PTS)技术有效降低OFDM系统中PAPR的算法实现。包括无水印的算法运行效果预览、核心程序及详尽的中文注释,附带操作步骤视频,适合研究与教学使用。