算法设计与分析复习02:分而治之算法

news2024/9/24 3:19:06

算法设计与分析复习02:分而治之算法

文章目录

  • 算法设计与分析复习02:分而治之算法
    • 复习重点
    • 分而治之算法
      • 全排列递归算法
      • 矩阵乘法的Strassen算法
      • 棋盘覆盖
      • 线性时间选择

复习重点

在这里插入图片描述

分而治之算法

全排列递归算法

在这里插入图片描述在这里插入图片描述

#include<vector>
#include<iostream>
using namespace std;
class Solution {
    vector<int> vis;
    void backtrace(vector<vector<int>>&res,vector<int>&nums,int first,int len, vector<int>& perm) {
        if (first == len) {
            res.push_back(perm);
        }
        else {
            for (int i = 0; i < len; i++) {
                if (vis[i])continue;
                perm.emplace_back(nums[i]);
                vis[i] = 1;
                backtrace(res, nums, first + 1, len, perm);
                vis[i] = 0;
                perm.pop_back();
            }
        }
    }
public:
    vector<vector<int>> permute(vector<int>& nums) {
        vector<vector<int>>res;
        vector<int> perm;
        vis.resize(nums.size());
        backtrace(res, nums, 0, nums.size(), perm);
        return res;
    }
};
int main() {
    Solution solution;
    vector<int> v = { 1,2,3 };
    vector<vector<int>> res = solution.permute(v);
    for (auto it = res.begin(); it != res.end(); it++) {
        for (auto it1 = it->begin(); it1 != it->end(); it1++) {
            cout << *it1 << " ";
        }
        cout << endl;
    }
    return 0;
}

矩阵乘法的Strassen算法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
[Strassen算法步骤](详解矩阵乘法中的Strassen算法 - 知乎 (zhihu.com))

算法分析:
T ( n ) = { O ( 1 ) n=1 7 T ( n 2 ) + O ( n 2 ) n>1 T(n)=\left\{ \begin{matrix} O(1)& \text{n=1} \\ 7T(\frac{n}{2})+O(n^2)& \text{n>1} \end{matrix} \right. T(n)={O(1)7T(2n)+O(n2)n=1n>1
主方法求得算法复杂度为:
n l o g 2 7 n^{log_{2}{7}} nlog27

棋盘覆盖

棋盘覆盖问题看下面这张图,由于要求期盼规模为
2 k × 2 k 2^k\times2^k 2k×2k
有一定的局限性,但是是理解递归与分治的好问题,只看下面这张图:
在这里插入图片描述
每一个块对称选择。

线性时间选择

主要思想:利用快排,进行部分排序,不断缩小范围。
核心代码:
在这里插入图片描述
全部代码:

#include<vector>
#include<iostream>
#include<algorithm>
#include<queue>

using namespace std;

class Solution {
    struct num_mid {
        int pos;
        int num;
        bool operator<(const num_mid nm) {
            return this->num < nm.num;
        }
        num_mid(int p, int n) :pos(p), num(n) {}
    };
    int Partition(vector<int>& Vector, const int low, const int high) {
        //数据表类的共有函数
        int pivotpos;
        int pivot; //基准元素
        if (high - low > 5) {
            vector<num_mid>tmp;
            for (int i = low; i <= high - 4; i += 5) {
                sort(Vector.begin() + i, Vector.begin() + i + 4);
                tmp.push_back(num_mid(i + 2, Vector[i + 2]));
            }
            sort(tmp.begin(), tmp.end());
            pivotpos = low;
            pivot = Vector[tmp[tmp.size() / 2].pos];
            swap(Vector[low], Vector[tmp[tmp.size() / 2].pos]);
        }
        else {
            sort(Vector.begin() + low, Vector.begin() + high);
            pivotpos = low;
            pivot = Vector[(low + high) / 2]; //基准元素
            swap(Vector[low], Vector[(low + high) / 2]);
        }
        for (int i = low + 1; i <= high; i++)
            //检测整个序列, 进行划分
            if (Vector[i] < pivot) {
                pivotpos++;
                if (pivotpos != i)
                    swap(Vector[pivotpos], Vector[i]);
            } //小于基准的交换到左侧去
        Vector[low] = Vector[pivotpos];
        Vector[pivotpos] = pivot;
        //将基准元素就位
        return pivotpos; //返回基准元素位置
    }

    int QuickSort(vector<int>& L,
        const int left, const int right, int k) {
        //对元素Vector[left], ..., Vector[right]进行排序, 
        //pivot=L.Vector[left]是基准元素, 排序结束后它的
        //位置在pivotPos, 把参加排序的序列分成两部分,
        //左边元素的排序码都小于或等于它, 右边都大于它
        if (left < right) { //元素序列长度大于1时
            int res;
            int pivotpos = Partition(L, left, right); //划分
            if (pivotpos > k)
                res = QuickSort(L, left, pivotpos - 1, k);
            else if (pivotpos < k)
                res = QuickSort(L, pivotpos + 1, right, k);
            else
                return L[pivotpos];
            return res;
        }
        else
            return L[left];
    }
public:
    int findKthLargest(vector<int>& nums, int k) {
        int res = QuickSort(nums, 0, nums.size() - 1, nums.size() - k);
        return res;
    }
};

int main() {
    vector<int> v = { 3,2,3,1,2,4,5,5,6 };
    int res = QuickSort(v, 0, v.size() - 1, v.size() - 4);
    cout << res;    
}

时间复杂度分析:假设,基本实现二分,线性选择支点的时间复杂度为 O ( n ) O(n) O(n),递归的时间复杂度如下:
T ( n ) = T ( n 2 ) + O ( n ) T(n)=T(\frac{n}{2})+O(n) T(n)=T(2n)+O(n)
依据主定理,时间复杂度为 O ( n ) O(n) O(n)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

await如何优雅的捕获异常?

传统方式 try { const res await getUser(id) }catch(err){console.log(err) } await让我们使用异步方式开发的代码简便不少&#xff0c;但是每次使用如果都用try..catch来捕获异常反而埋没了它的优势。 [ err, user ] await to(UserModel.findById(1)); 如果我们使用await…

CSS var() 自定义的属性值和使用

声明全局 CSS 变量 :root{<自定义属性名>: <自定义属性值>; }自定义属性名必需以 -- 开头。 :root :root 这个 CSS 伪类匹配文档树的根元素。对于 HTML 来说&#xff0c;:root 表示 <html> 元素&#xff0c;除了优先级更高之外&#xff0c;与 html 选择器…

【Docker】构建自定义镜像

文章目录1. 镜像制作的两种方法2. Commit构建自定义镜像3. Dockerfile构建镜像4. 镜像的分层结构5. Dockerfile基础指令6. Java服务器镜像构建7. Nginx镜像构建8. Redis镜像构建9. 快速部署MySQL并初始化1. 镜像制作的两种方法 基于Docker Commit制作镜像基于Dockerfile制作镜…

WIKO+鸿蒙生态:海外品牌中国化的新范式

想要理解快速变化的科技行业&#xff0c;往往要锚定一些标杆型企业&#xff0c;它们的风吹草动&#xff0c;可能就是行业接下来的地动山摇。就像互联网绕不过BAT&#xff0c;手机行业的趋势也少不了鸿蒙的消息。最近&#xff0c;有一件鸿蒙生态的新闻是比较特别的。我们报道过很…

java反射基础

Java反射机制提供的功能 在运行时判断任意一个对象所属的类 在运行时构造任意一个类的对象 在运行时判断任意一个类所具有的成员变量和方法 在运行时获取泛型信息 在运行时调用任意一个对象的成员变量和方法 在运行时处理注解 生成动态代理 Java反射优点和缺点 优点: …

Linux free命令详解,Linux查看内存使用情况

「作者主页」&#xff1a;士别三日wyx 「作者简介」&#xff1a;CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 free一、常用操作二、字段解释1、free和available的区别&#xff1f;2、交换分区的作用&#xff1f;三、内存使用情况分析技巧四、原理&…

人脸识别检测项目实战

文章目录 一、项目介绍 二、环境配置 三、项目知识储备 导入图片灰度转换 修改图片尺寸的大小矩形检测框图绘制 人脸检测识别 多个人脸检测效果对人脸视频进行检测数据集录入训练数据人脸识别过程 项目介绍 人脸识别在现代化中应用较为广泛&#xff0c;比如人脸考勤系统等&…

Python爬虫——Scrapy 的基本使用

Scrapy 框架中创建项目、查看配置信息&#xff0c;以及运行爬虫程序都是通过指令完成。 常用指令如下所示&#xff1a; 指令格式说明startprojectscrapy startproject <项目名>创建新项目genspiderscrapy genspider <爬虫文件名> <访问的域名>新建爬虫文件…

torchnet package (1)

torchnet torchnet用于torch的代码复用和模块化编程框架,主要包含四个类 Dataset: 以不同的方式对数据进行预处理.Engine: 训练/测试机器学习方法Meter评估方法性能Log日志. Documentation torchnet的调用 local tnt require ‘torchnet’ tnt.Dataset() torchnet提供了多…

VueJs中的reactive函数

前言一个基本类型的数据,想要变成响应式数据,那么需要通过ref函数包裹,而如果是一个对象的话,那么需要使用reactive函数reactive可将对象变成响应式将一个对象类型的数据变为响应式,如果是基本数据类型,那用refconst 代理对象 reactive(被代理对象)接收一个对象(或数组),返回一…

一个DevOps/SRE/运维的2022年碎碎语

人们常说&#xff1a;情商高的人会说话。实际上他们的意思是对人说人话&#xff0c;对鬼说鬼话&#xff0c;这样的人才有前途。很长时间里&#xff0c;我一直以为我无法理解他们为什么要推崇心口不一。后来&#xff0c;我知道了。我不是不理解。我只是不服气。这样的”不服气“…

box-shadow 高阶玩法:纯 CSS 画蒙娜丽莎和粒子星空

想必写过 CSS 的同学都用过 box-shadow&#xff0c;它可以给元素设置阴影&#xff0c;增加立体效果。 比如说这样&#xff1a; 但它能做的可不只是阴影&#xff0c;还可以用来做出很多有趣的效果&#xff1a; 比如画蒙娜丽莎&#xff1a; 画星空&#xff1a; 这些效果都是 bo…

尚医通-医院查询接口-上传科室接口(十九)

目录 &#xff08;1&#xff09;医院查询接口-功能实现 &#xff08;2&#xff09;上传科室接口-功能实现 &#xff08;1&#xff09;医院查询接口-功能实现 接口文档&#xff1a; 4.4.查询医院 医院信息 4.4.1.提交地址 http://localhost/api/hosp/hospital/show 在ApiC…

《东晋门阀政治》

《东晋门阀政治》 关于作者 田余庆&#xff0c;北京大学历史系教授&#xff0c;国务院古 籍整理出版规划小组成员&#xff0c;是魏晋南北朝 政治史专家。他在学术界拥有重要的地位&#xff0c;参加编著的《中国史纲要》曾获国家 教委特等奖。著有《秦汉魏晋史探微》 《拓跋史…

ubuntu 22.04上vim-plug插件管理器,相关插件与ROS2的安装

前言 最近&#xff0c;新配置了一版虚拟机&#xff0c;因为学校已经配置好环境的虚拟机忘了带回来&#xff0c;我还想系统的学习一下ROS&#xff0c;并将其用于机械臂的控制&#xff0c;因此用了新的方式配置了vim&#xff0c;并将树莓派raspberry buster系统配置上了ROS1的环…

Flink系列Table API和SQL之:滚动窗口、滑动窗口、累计窗口、分组聚合

Flink系列Table API和SQL之&#xff1a;窗口一、窗口(Window)二、分组窗口(Group Window)三、窗口表值函数(Windowing TVFs)1.滚动窗口(TUMBLE)2.滑动窗口(HOP)3.累计窗口(CUMULATE)四、分组聚合五、分组聚合实现代码六、分组窗口聚合代码实现七、窗口聚合&#xff1a;滚动窗口…

【SCL】博图SCL应用之音乐喷泉

使用Scl语言编写博图应用&#xff1a;音乐喷泉 文章目录 目录 一、音乐喷泉 1.控制要求 2.I/O分配 3.编写程序 4.效果和完整代码 二、装配流水线模拟控制&#xff08;练习&#xff09; 1.控制要求 2.场景 前言 承接上文&#xff0c;这里写一下上一篇的练习题 音乐喷泉应用案…

使用Typora+PicGo+SM.MS实现本地博客图片自动上传

使用TyporaPicGoSM.MS实现本地博客图片自动上传 Typora&#xff1a;一款Markdown 编辑器 PicGo: 一个用于快速上传图片并获取图片 URL 链接的工具. SM.MS: 一个图床网站&#xff0c;注册后有5G免费空间 为什么要让本地图片自动上传 对于一个随时随刻都有可能在文章中贴代码的计…

快来领取你的JavaScript正则表达式速查表

如果我们想对字符串进行相关&#xff08;增、删、改、查、检索&#xff09;操作&#xff0c;就可以用接下来的正则表达式实现 什么是正则表达式 正则表达式是用于匹配字符串中字符组合的模式正则表达式通常被用来检索、替换那些符合某个模式&#xff08;规则&#xff09;的文本…

家装中,你最后悔的事是什么?上海极家装修公司简介!

家装中&#xff0c;你最后悔的事是什么&#xff1f;上海极家装修公司简介&#xff01;接触过很多业主&#xff0c;就没有不后悔的!至于原因&#xff0c;因为总会出现各种“考虑不周”&#xff0c;有些真的是失之毫厘差之千里&#xff01; 下面上海极家装修公司简介&#xff01;…