代码随想录刷题Day52

组合总和

如题,这道题的回溯三要素比较直接,循环遍历时候剪枝不会太复杂。

  • 终止条件:和为target,或者超出target就终止
  • 返回值和参数:void,需要一个数记录遍历时起始的位置startIndex(先对candidates数组升序排序,从而保证枚举过程有序进行)
  • 当层处理逻辑:
    • 循环遍历从startIndex到让path的和不小于target的值为止,
    • 当前值放入path中,path_sum加上该数
    • 回溯下一层,
    • path把当前值pop出来,path_sum减去该值

代码如下(执行用时击败5.54%,消耗内存击败4.95%):

class Solution {
private:
vector<int> path;
int path_sum;
vector<vector<int>> ans;
void backtrack(vector<int> candidates,int target,int startIndex){
    if(path_sum>=target){
        if(path_sum==target){
            ans.push_back(path);
        }
        return;
    }
    int len = candidates.size();
    for(int i = startIndex;i<len;i++){
        path.push_back(candidates[i]);
        path_sum += candidates[i];
        backtrack(candidates,target,i);
        path_sum -= candidates[i];
        path.pop_back();
    }
    
}
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        path_sum = 0;
        backtrack(candidates,target,0);
        return ans;
    }
};

这份代码直接这样写的效率比较低,对比代码随想录的优化方法,回溯“剪枝”放在递归调用上(执行用时击败100.0%,消耗内存击败27.56%):

class Solution {
private:
vector<int> path;
int path_sum;
vector<vector<int>> ans;
void backtrack(vector<int> candidates,int target,int startIndex){
        if(path_sum==target){
            ans.push_back(path);
            return;
        }
    int len = candidates.size();
    for(int i = startIndex;i<len;i++){
        path.push_back(candidates[i]);
        path_sum += candidates[i];
        if(path_sum<=target) backtrack(candidates,target,i);        //在递归调用前,先剪枝
        path_sum -= candidates[i];
        path.pop_back();
    }
    
}
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        sort(candidates.begin(),candidates.end());
        path_sum = 0;
        backtrack(candidates,target,0);
        return ans;
    }
};

提前在函数调用前判断是否需要递归调用,从而省去调用函数的消耗。

这道题,和之前的优化角度不一样,前面的回溯题优化主要是在研究如何剪枝,这一道题,没有太多可以剪枝的部分,就在函数调用次数尽可能少方面下功夫。

内容概要:本文围绕基于支持向量机的电力短期负荷预测方法展开基于支持向量机的电力短期负荷预测方法研究——最小二乘支持向量机、标准粒子群算法支持向量机与改进粒子群算法支持向量机的对比分析(Matlab代码实现)研究,重点对比分析了三种方法:最小二乘支持向量机(LSSVM)、标准粒子群算法优化的支持向量机(PSO-SVM)以及改进粒子群算法优化的支持向量机(IPSO-SVM)。文章详细介绍了各模型的构建过程与优化机制,并通过Matlab代码实现对电力负荷数据进行预测,评估不同方法在预测精度、收敛速度和稳定性方面的性能差异。研究旨在为电力系统调度提供高精度的短期负荷预测方案,提升电网运行效率与可靠性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的科研人员、电气工程及相关专业的研究生或高年级本科生;对机器学习在能源领域应用感兴趣的技术人员。; 使用场景及目标:①应用于电力系统短期负荷预测的实际建模与仿真;②比较不同优化算法对支持向量机预测性能的影响;③为相关课研究提供可复现的代码参考和技术路线支持。; 阅读建议:建议读者结合文中提供的Matlab代码,深入理解每种支持向量机模型的参数设置与优化流程,动手实践以掌握算法细节,并可通过更换数据集进一步验证模型泛化能力。
【源码免费下载链接】:https://renmaiwang.cn/s/qaiji 18、MapReduce的计数器与通过MapReduce读取_写入数据库示例网址: input files to process”表示处理的总输入文件数量,“number of splits”指示文件被分割成多少个块进行处理,“Running job”显示作业的状态等。自定义计数器则是开发者根据实际需求创建的,用于跟踪特定任务的特定指标。开发者可以在Mapper或Reducer类中增加自定义计数器,然后在代码中增加计数器的值。这样,当作业完成后,可以通过查看计数器的值来分析程序的行为和性能。接下来,我们将讨论如何通过MapReduce与数据库交互,尤其是MySQL数据库。在大数据场景下,有时需要将MapReduce处理的结果存储到关系型数据库中,或者从数据库中读取数据进行处理。Hadoop提供了JDBC(Java Database Connectivity)接口,使得MapReduce作业能够与数据库进行连接和操作。要实现MapReduce读取数据库,首先需要在Mapper类中加载数据库驱动并建立连接。然后,可以在map()方法中使用SQL查询获取所需数据。在Reduce阶段,可以对数据进行进一步处理和聚合,最后将结果写入到数据库中。对于写入数据库,通常在Reducer类的reduce()方法或cleanup()方法中进行,将处理后的数据转换为适合数据库存储的格式,然后通过JDBC API执行插入、更新或删除等操作。需要注意的是,由于MapReduce作业可能涉及大量的数据写入,因此需要考虑数据库的并发处理能力和性能优化策略。总结一下,MapReduce的计数器提供了强大的监控和调试能力,而通过MapReduce与数据库的交互则扩展了大数据处理的应用场景。开发者可以根据需求利用计数器来优化作业
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值