数据结构及算法

分治法

顾名思义分治法的思想就是分而治之,将原有大的问题进行拆分,拆分成若干个与原问题结构相同、形式相同、互相独立、规模较小的子问题,递归的解决这些子问题,然后再将各个子问题进行合并得到原问题的解。

对原问题的要求

分治法的使用对原问题有所要求。

原问题规模缩小到一定程度就可以容易解决

原问题可以分解为若干个规模较小的相同问题

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

该问题所分解出的各个子问题是相互独立的

分治法应用-递归

递归就是在运行的过程中调用自己

例:

下表中第0项的值为1;第1项的值为2;第2项的值为第0项+第1项;第3项的值为第1项+第2项;以此类推。

第几项0123456
数值123581321

 可以写为

int F(int n)
{
    if (n=0)    return 1;
    if (n=1)    return 2;
    if (n>1)    return F(n-1)+F(n-2);
}

 此时如果想要输出第6项则计算方式是:

 因此在程序中是

先用 if (n>1) return F(n-1)+F(n-2); 
将F(6)分为了F(5) + F(4);

再次调用 if (n>1) return F(n-1)+F(n-2);
将F(5)分为了F(4) + F(3);F(4)分为了F(3) + F(2);

以此类推,直到将其分解为可以直接返回的F(1)或F(0)
运行过程中不断调用自身此为递归

分治法应用-二分法

Search(L,a,b,x)  //L表示待查数组,a表示数组L初始下标,b表示数组L结束下标,x表示需要查找的值
{
    if(a>b)    return (-1);  //a>b表示一直查找到数组L的最后或最前都未找到需要查找的值
    else{
        m=(a+b)/2;  //首先取数组L中间下标对应的值进行查找
        if(x==L[m])    return(m);  //如果中间值恰巧为需查找的值则直接返回
        else if(x>[m])  //如果需要查找的值>中间值
            return (Search(L,m+1,b,x);  
            //将下标为m+1的作为初始下标a继续调用查找函数查找数组L的后半段

        else
            return(Search(L,a,m-1,x));  
        //如果需要查找的值≤中间值,则将下标为m-1的作为结束下标b继续调用查找函数查找数组L的前半段

        }
}

 

 

 

 回溯法

回溯法是一种深度优先的搜索法,一条分支走到底,无法再深入了然后回溯一步再深入。

回溯法可以走完一个问题的所有解,也可以达到结果之后不继续进行。如果一个问题的求解过程中需要进行逐步试探,例如迷宫问题,一般可以考虑回溯法

贪心法

顾名思义贪心法就是每次都贪图最好的东西,一般可以快速得到满意的解,但是最终的结果不一定是最优解。

经典背包问题,如图所示,背包容量只有70,物品1、2、3为整体不可拆分且每个物品只有一个,如果使用贪心法进行选择,那么每次都会选择单价最高的,首选物品1,再选物品2是一个比较满意的解,但不是最优解,最优解是先选物品2,再选物品3。

此类问题需注意题目要求,物品只有一个还是多个,物品是否可以拆分等。如果有多个物品则最优解为:

 判断一个问题是不是贪心法的主要条件是查看是否每一步选择的都是最优但是结果不一定是最优。

 动态规划法

动态规划法与分治法类似,也是将大问题拆分成小问题,解决小问题得出结果最后再合并得到大问题结果,但是动态规划法拆分成的小问题并不完全独立,可能存在关联,所以需要一张表把问题与结果对应记录下来,因此动态规划法的显著特征是具有查表操作。

  • 12
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 数据结构算法八股文是指在面试中常被问到的一些关于数据结构算法的基础知识问题。其中包括递归算法和非递归算法的区别和应用场景。递归算法是通过利用重复结构来简洁地解决问题,但需要跟踪每个嵌套调用的状态的活动记录,因此在计算机内存成本高时,可以将递归算法转换为非递归算法,通常使用堆栈结构来实现。\[1\]基数排序是一种要求数据可以划分成高低位,并且位之间有递进关系的排序算法,每一位的数据范围不能太大,需要借助桶排序或计数排序来完成每一位的排序工作。\[2\]\[3\]在实际应用中,快速排序、堆排序和归并排序也有各自的应用场景。 #### 引用[.reference_title] - *1* [数据结构算法总结(八股文)](https://blog.csdn.net/qq_37207042/article/details/119462193)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [数据结构算法的八股文自述(持续更新)](https://blog.csdn.net/qq_39350172/article/details/116244240)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值