【Algorithm算法章】递归&&搜索&&回溯&&算法思路总结概括

请添加图片描述


📝前言

本章节是总结学习二叉树,排序算法等等递归问题所总结的,对递归,搜索,回溯的算法进行总结

🌺 递归

🌸 什么是递归

函数自己调用自己的情况

🌸 为什么会用到递归?

本质:解决一个问题,出现相同的子问题

  • [ 主问题] ->相同的子问题
  • [ 子问题] ->相同的子问题

  • 在这里插入图片描述

🌸 如何理解递归?

  • 分为三个阶段
  1. 递归展开的细节图
  2. 二叉树中的题目
  3. 重点:宏观看待递归的过程
  • 不要在意递归的细节展开图
  • 把递归的函数当成一个黑盒
  • 相信这个黑盒一定能完成这个任务

例子展示:

//后序遍历
void dfs(TreeNode* root)
{
	//细节 - 出口
	if (root == nullptr)
		return;

	dfs(root->left);//只需相信dfs这个黑盒能帮我完成遍历左子树任务,不需要关注细节展开图
	dfs(root->right);//只需相信dfs这个黑盒能帮我完成遍历右子树任务,不需要关注细节展开图
	cout << root->val;

}


class Solution {
public:
    void _merger(vector<int>& nums, int left, int right, int* tmp)
    {
        //细节 - 出口
        if (left >= right)
            return;

        int mid = (left + right) / 2;
        _merger(nums, left, mid, tmp);//只需相信给你中间值和需要参数_merge这个黑盒能帮我完成排序左区间,不需要关注细节展开图
        _merger(nums, mid + 1, right, tmp);
		//只需相信给你中间值和需要参数_merge这个黑盒能帮我完成排序右区间,不需要关注细节展开图
		
		//merge操作..
       //    int begin1 = left, end1 = mid;
    //    int begin2 = mid + 1, end2 = right;
    //    int i = left;
    //    while (begin1 <= end1 && begin2 <= end2)
    //    {
    //        if (nums[begin1] <= nums[begin2])
    //        {
    //            tmp[i++] = nums[begin1++];
    //        }
    //        else
    //        {
    //            tmp[i++] = nums[begin2++];
    //        }
    //    }

    //    while (begin1 <= end1)
    //    {
    //        tmp[i++] = nums[begin1++];
    //    }
    //    while (begin2 <= end2)
    //    {
    //        tmp[i++] = nums[begin2++];
    //    }

    //    memcpy(nums.data() + left, tmp + left, (right - left + 1) * sizeof(int));
    //}

    //vector<int> sortArray(vector<int>& nums) {

    //    int* tmp = new int[nums.size()];
    //    _merger(nums, 0, nums.size() - 1, tmp);
    //    delete[] tmp;

    //    return nums;

    //}
 };    

🌸 如何写好一个递归

  • [目的:函数体的设计 ] 先找到相同的子问题
  • [目的:函数体的书写 ] 只关心某一个子问题是如何解决的
  • [ 避免死循环] 注意一下递归函数的出口即可

🌺搜索总结

🌸 深度优先遍历vs深度优先搜索vs宽度优先遍历 vs宽度优先搜索

  • 搜索就是在遍历的时候,访问结点的值,那么**vs就是等同于的意思**
  • 深度优先遍历 vs 深度优先搜索
  • 宽度优先遍历 vs 宽度优先搜索
  • 因此遍历是形式,目的是搜索
    在这里插入图片描述

🌸 搜索vs暴搜关系图

搜索:暴力枚举一遍所有的情况
搜索等同于暴搜:两种方法进行

  • bfs
  • dfs

🌸 拓展搜索问题

将一个问题进行一 一罗列(全排列)出所有的可能组合,然后用树状图的方法来画出决策树
在这里插入图片描述

🌼回溯与剪枝

  1. 回溯算法:(本质是回退)深搜dfs
    回溯算法是一种通过探索所有可能的候选解来解决决策问题的算法。
    它采用试错的思想,在进行决策时,如果当前的选择导致之后无法得到有效的解决方案,则会退回到上一个决策点,并选择另一种选择。

  2. 剪枝:
    剪枝是回溯算法中的一种优化技术,它通过分析当前的局部状态,来提前判断某个解决方案是否可行,不可行就剪掉,好比剪掉一个叶子或者一个子树,从而避免不必要的后续计算。

回溯算法的特点是先尝试并检查解决方案,如果当前解决方案不可行,就回到上一个决策点继续尝试其他的可能性。
在这里插入图片描述

后续文章继续继续总结


🚩总结

请添加图片描述

  • 15
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
图着色回溯算法(Graph Coloring Backtracking Algorithm)是一种经典的求解图的顶点着色问题的算法。它的目标是给定一个图,为每个顶点分配一个颜色,并且保证相邻的顶点具有不同的颜色。 在图着色回溯算法中,我们首先选择一个未被着色的顶点,并尝试为其分配一个颜色。然后,继续递归地为其他未被着色的顶点尝试着色,直到所有顶点都得到了合适的颜色或者发现无法将某个顶点着色为任何颜色。如果发现无法为某个顶点找到合适的颜色,则回溯到前一个顶点,尝试其他颜色。这个过程将会重复进行,直到找到所有顶点的合适着色方案。 时间复杂度是一种用来衡量算法性能的指标。对于图着色回溯算法,时间复杂度取决于图的规模、结构以及算法的具体实现。 在最坏情况下,图着色回溯算法的时间复杂度可以达到指数级,即O(2^n),其中n表示图中顶点的个数。这是因为在最坏情况下,每个顶点都需要尝试所有可能的颜色,从而导致了指数级的时间复杂度。 然而,在实际应用中,我们通常可以做一些优化来减少时间复杂度。例如,可以根据某些启发式规则或图的特殊性质来预先选择顶点的颜色,从而缩小搜索空间。这些优化方法可以显著提高算法的效率,降低时间复杂度。 总的来说,图着色回溯算法的时间复杂度在最坏情况下是指数级的,但在实际应用中可以通过一些优化方法来提高效率。对于大规模的图,可能需要考虑其他更高效的算法来解决顶点着色问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿森要自信

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值