分治策略的实现

目录

前言

 分治策略的应用

最大子数组问题

矩阵乘法问题

求解递归式的三种方法

代入法求递归式

用递归树求递归式

主方法求递归式


前言

分治三个步骤:

分解:分解原问题为子问题,这些子问题为原问题的较小规模的问题。

解决:递归地解决这些子问题,如果规模小到一定程度,则直接得出答案。

合并:合并上述解决地子问题地解,得出最终解。

递归情况:当子问题规模比较大时,成为递归情况;

基本情况:当子问题规模不需要递归,已经触底时,此时称作基本情况。

递归式:刻画算法的运行时间的等式或者不等式,如归并排序中的最坏情况下的时间复杂

 分治策略的应用

最大子数组问题

最大子数组:一个数组中的非空连续的数组元素和最大的集合成为最大子数组。

a[4] = {-1,-2,3,4};

数组a的子数组有{-1},{-2},{3},{4},{-1,-2},{-2,3},{3,4},{-1,-2,3},

{-2,3,4},{-1,-2,3,4}.

其中{3,4}子数组的和为7,是这些数组中和最大的子数组。

代码:

#include "stdio.h"
#define MAXSIZE 100
#define MINNUM -10000
int *find_cross_max_subarray(int A[MAXSIZE], int low, int mid, int high);
int *find_maxium_subarray(int a[MAXSIZE], int low, int high);
int *max(int *x, int *y, int *z);
int result[3] = {0};

void main() {
    int A[6] = {-1,3,-2,5,-4, 6};
    find_maxium_subarray(A, 0, 5);
    printf("%d, %d, %d", result[0], result[1], result[2]);
}

int *find_cross_max_subarray(int A[MAXSIZE], int low, int mid, int high) {

    int sum = 0;
    int max_sum = 0;
    result[0] = MINNUM;
    for (int i = mid + 1; i <= high; i++)
    {
        sum = sum + A[i];
        if(result[0] < sum) {
            result[0] = sum;
            result[2] = i;
        }

    }
    max_sum = result[0];
    result[0] = MINNUM;
    sum = 0;
    for (int i = mid; i >= 0; i--)
    {
        sum = sum + A[i];
        if(result[0] < sum) {
            result[0] = sum;
            result[1] = i;
        }
    }
    result[0] = max_sum + result[0];
    return result;
}

int *find_maxium_subarray(int a[MAXSIZE], int low, int high) {
    if(low == high) {
        result[0] = a[low];
        result[1] = low;
        result[2] = high;
        return result;
    }
    int mid = (low+high)/2;
    //int right_res[3] = {0};
    //int left_res[3] = {0};

    int *left_res = find_maxium_subarray(a, low, mid);
    int *right_res = find_maxium_subarray(a, mid+1, high);
    int *cross_res = find_cross_max_subarray(a, low, mid, high);

    return max(left_res, right_res, cross_res);

}

int *max(int *x, int *y, int *z) {
 
    int *max = x;
 
    if(x[0] > y[0]) {
 
        max = x;
    } else{
 
        max = y;
 
    }
 
    if (z[0] > max[0]) {
        max = z;
    }
 
    return max;
}

 输出结果:

时间复杂度:O(n*lgn); 

矩阵乘法问题

前提:由于矩阵需要能够被分解成4个子矩阵运算,所以Strassen算法的前提条件式矩阵的长和宽n是2的幂函数。

代码:

#include "stdio.h"
#define MAXSIZE 4

void multiply_matrix(int a[MAXSIZE][MAXSIZE], int b[MAXSIZE][MAXSIZE], int c[MAXSIZE][MAXSIZE], int n, int i, int j);
int n = MAXSIZE;
void main() {
    int a[MAXSIZE][MAXSIZE] = {
        {1,2,3,4},
        {1,2,3,4},
        {1,2,3,4},
        {1,2,3,4}
    };
    int b[MAXSIZE][MAXSIZE] = {
        {1,1,1,1},
        {1,1,1,1},
        {1,1,1,1},
        {1,1,1,1}
    };
    int c[MAXSIZE][MAXSIZE] = {0};
    multiply_matrix(a, b, c, n, 0, 0);
}

void multiply_matrix(int a[MAXSIZE][MAXSIZE], int b[MAXSIZE][MAXSIZE], int c[MAXSIZE][MAXSIZE], int n, int i, int j) {
    int length = n/2;
    if(n == 1) {
        c[i][j] = a[i][j]*b[i][j];
    } else {
        multiply_matrix(a, b, c, length, i, j);
        multiply_matrix(a, b, c, length, i, j + length);
        multiply_matrix(a, b, c, length, i + length, j);
        multiply_matrix(a, b, c, length, i + length, j + length);
    }
    
}

求解递归式的三种方法

代入法:猜测一个边界,用数学归纳法证明这个边界的正确性;

递归树法:将递归式转化为一棵树,其结点表示不同层次的递归调用产生的代价,然后采用边界和技术求解递归式。

主方法:可求解如下递归式的界:

 递归式的技术细节:

代入法求递归式

  1. 猜测解的形式;
  2. 使用数学归纳法证明解中常数,并证明解是正确的。

用递归树求递归式

猜测解的形式有时候会比较棘手,所以可以通过递归树的方法来需求解的形式。

主方法求递归式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/672305.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis——基本命令

概念&#xff1a; Redis(REmote Dlctionary Server) 是用 C语言开发的一个开源的高性能键值对(key-value) 数据库 特征&#xff1a; 1. 数据间没有必然的关联关系 2. 内部采用单线程机制进行工作 3. 高性能 4. 多数据类型支持 字符串类型 string 列表类型 …

新 Google 邮箱注册的美区Appleid 账户被停用如何解冻?

什么条件触发美区账号被停用&#xff1f; 如何触发的被停用&#xff0c;我猜是因为新账户没有进行安全认证&#xff0c;在新机器手机上登陆&#xff0c;下载app导致的。 如何解冻美区 Appleid 账户&#xff1f; 打苹果服务支持电话&#xff1a;4006668800 苹果员工会非常耐心…

ios 新安装app收不到fcm推送

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

Charles的安装和web端抓包配置

1.Charles的安装 通过官网下载&#xff1a;https://www.charlesproxy.com/download/&#xff0c;我之前下载的是4.6.2版本&#xff0c;下载成功后点击安装包&#xff0c;点击下一步下一步即可安装成功。 ​​ ​ 安装成功后打开charles页面如下所示。 ​ 2.乱码问题解决 打开…

【Docker学习】docker pull详细说明

docker pull是我们经常用到的一个命令。我们使用一些官方镜像&#xff0c;如MySql、Nginx等都需要用docker pull下载。不过不用的话&#xff0c;也可以。比如使用docker run&#xff0c;要是找不到镜像&#xff0c;会自动下载。 命令&#xff1a; docker image pull 描述&am…

插入排序以及希尔排序; 先学会插入,希尔会更简单喔

1.前言 首先肯定是要学会插入排序再学习希尔排序会更简单&#xff0c;因为代码部分有很多相似之处&#xff1b;如果你觉得你很强&#xff0c;可以直接看希尔排序的讲解。哈哈哈&#xff01;&#xff0c;每天进步一点点&#xff0c;和昨天的自己比 2.插入排序 让我们先来看看…

【Hive SQL 每日一题】统计每月用户购买商品的种类分布

文章目录 测试数据需求说明需求实现 测试数据 -- 创建 orders 表 DROP TABLE IF EXISTS orders; CREATE TABLE orders (order_id INT,user_id INT,product_id INT,order_date STRING );-- 插入 orders 数据 INSERT INTO orders VALUES (101, 1, 1001, 2023-01-01), (102, 1, 1…

pycharm简易使用码云gitee

文章目录 参考文献官网地址安装插件第一个选项报错了不可&#xff0c;第二个选项&#xff0c;可以了新库上传到主分支&#xff0c;push改进实验新建分支&#xff0c;上传为新分支&#xff1a;做另一种改进&#xff0c;选择回退主分支&#xff0c;另建一个分支 使用对于一个新项…

SQL158 每类视频近一个月的转发量/率

描述 用户-视频互动表tb_user_video_log iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id110120012021-10-01 10:00:002021-10-01 10:00:20011NULL210220012021-10-01 10:00:002021-10-01 10:00:15001NULL310320012021-10-01 11:00:502021-10-01 11:01…

Python 基于机器学习模型的车牌检测和识别系统 有GUI界面 【含Python源码 MX_004期】

一、系统介绍 车牌的检测和识别技术在现代社会中的应用场景可谓十分广泛&#xff0c;不仅涉及交通管理领域&#xff0c;还延伸至社区安保等多个方面。例如&#xff0c;在交通违章管理中&#xff0c;通过车牌追踪可以有效追踪违章车辆&#xff0c;维护交通秩序&#xff1b;在小区…

【UML用户指南】-05-对基本结构建模-类

在UML中&#xff0c;所有的事物都被建模为类。类是对词汇表中一些事物的抽象。类不是个体对象&#xff0c;而是描述一些对象的一个完整集合。 强调抽象的最重要的部分&#xff1a;名称、属性和操作 类 &#xff08;class&#xff09;是对一组具有相同属性、操作、关系和语义的对…

JVM垃圾收集器和内存分配策略

概述 Java内存运行时数据区的程序计数器、虚拟机栈、本地方法栈3个区域会随着线程而产生&#xff0c;随线程而消失。这几个区域分配多少内存时在类结构确定下来即已知的&#xff0c;在这几个区域内就不需要过多考虑如何回收内存的问题&#xff0c;当方法结束或者线程结束时&am…

第三届大湾区算力大会丨暴雨开启数字未来新篇

5月30-31日&#xff0c;韶关市迎来主题为“算启新篇智创未来”的第三届粤港澳大湾区(广东)算力产业大会暨第二届中国算力网大会&#xff0c;活动由广东省人民政府主办&#xff0c;广东省政数局、韶关市人民政府共同承办。暴雨信息作为算力产业发展的重要构建者受邀赴会&#xf…

【C++进阶】深入STL之string:模拟实现走进C++字符串的世界

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C模板入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之string &#x1f4d2;1. string…

力扣575. 分糖果

题目&#xff1a; Alice 有 n 枚糖&#xff0c;其中第 i 枚糖的类型为 candyType[i] 。Alice 注意到她的体重正在增长&#xff0c;所以前去拜访了一位医生。 医生建议 Alice 要少摄入糖分&#xff0c;只吃掉她所有糖的 n / 2 即可&#xff08;n 是一个偶数&#xff09;。Alic…

Java中连接Mongodb进行操作

文章目录 1.引入Java驱动依赖2.快速开始2.1 先在monsh连接建立collection2.2 java中快速开始2.3 Insert a Document2.4 Update a Document2.5 Find a Document2.6 Delete a Document 1.引入Java驱动依赖 注意&#xff1a;启动服务的时候需要加ip绑定 需要引入依赖 <dependen…

Java的数据库编程-----JDBC

目录 一.JDBC概念&使用条件&#xff1a; 二.mysql-connector驱动包的下载与导入&#xff1a; 三.JDBC编程&#xff1a; 使用JDBC编程的主要五个步骤&#xff1a; 完整流程1&#xff08;更新update&#xff09;&#xff1a; 完整流程2(查询query)&#xff1a; 一.JDB…

FS212E 系列PD协议

PD快充协议芯片FS212EL、FS212EH可以智能的识别插入的手机类型&#xff0c;选择最为合适的协议应对手机快充需要。兼容多类USB Type-C协议&#xff0c;包括TypeC协议、TypeC PD2.0、TypeC PD3.0、TypeC PD3.2等协议。集成OPTO输出&#xff0c;通过电阻直驱反馈光耦。FS212E 的调…

【STL】C++ queue队列(包含优先级队列) 基本使用

目录 一 queue 1 常见构造 1 空容器构造函数 2. 使用指定容器构造 3 拷贝构造函数 2 empty 3 size 4 front && back 5 push && pop 6 emplace 7 swap 二 优先级队列( priority_queue) 1 常见构造 2 其他操作 3 大堆和小堆 1. 大小堆切换 2 自…

961题库 北航计算机 MIPS基础选择题 附答案 选择题形式

有题目和答案&#xff0c;没有解析&#xff0c;不懂的题问大模型即可&#xff0c;无偿分享。 第1组 习题 MIPS处理器五级流水线中&#xff0c;涉及DRAM的是 A. 取指阶段 B. 译码阶段 C. 执行阶段 D. 访存阶段 MIPS处理器五级流水线中&#xff0c;R型指令保存结果的阶段是 A.…