【分治法】

news2024/11/23 10:43:20

目录

  • 知识框架
  • No.1 分治法基本思想
  • No.2 合并排序
  • No.3 快速排序
    • 一、基本思想
    • 三、效率分析
    • 四、快速排序不稳定例子
  • No.4 二叉树遍历及其相关特性
    • 一、基本概念
    • 二、中序遍历
    • 三、前序遍历
    • 四、二叉树的高度计算(高度不是深度)

知识框架

No.1 分治法基本思想

  1. 将规模为N的问题分解为k个规模较小的子问题,使这些子问题相互独立可分别求解,再将k个子问题的解合并成原问题的解。如子问题的规模仍很大,则反复分解直到问题小到可直接求解为止。
  2. 在分治法中,子问题的解法通常与原问题相同,自然导致递归过程
  3. 总的来说就是:将求出的小规模的问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解。(均分
  4. 分治法的设计思想是:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。

步骤:

  1. 将问题的实例划分为同一个问题的几个较小的实例,最好拥有同样的规模
  2. 对这些较小实例的求解(一般使用递归方法,但在问题规模足够小的时候,有时也会使用一些其他方法)。
  3. 如果必要的话,合并这些较小问题的解,以得到原始问题的解。

分治法一定能降低复杂度?获取高效率?

并不是分治法在所有情况下都能降低复杂度和提高效率。分治法的关键在于将原问题划分成更小的子问题,然后将子问题独立地解决,最后将子问题的解合并起来得到原问题的解。如果子问题存在重复计算或合并开销过大等问题,分治法可能不如其他算法效率高。

另外,分治法的时间复杂度与子问题的规模有关,因此在某些情况下子问题的规模较小时,分治法并不能使问题得到更好的解决。因此,正确使用分治法需要根据具体问题的特点选择合适的算法。

No.2 合并排序

也就是将将n个元素排成非递减顺序。

主要思想: 若n为1,算法终止;否则,将n个待排元素分割成k(k=2)个大致相等子集合A、B,对每一个子集合分别递归排序,再将排好序的 子集归并为一个集合。

所以:首先是 进行 划分 然后 再是 合并。;先将整个集合 划分均分到1,然后两两合并;、如图1所示

合并算法:拿2389 和 1457 合并

从两个序列的头部开始合并:相当于每次合并都是下面这样的步骤。如图2所示。

2与1比较,1被移到结果序列;
2与4比较,2被移入结果序列;
4与3比较,3被放入结果序列;
4和8比较,4被放入结果序列;
8和5比较;5被放入结果序列;
8和7比较;7被放入结果序列;

第一个序列剩下的8和9按顺序放入结果序列。

在这里插入图片描述

						图1 :此图是表示整个的排序的过程。

在这里插入图片描述

							图2:表示合并排序中的合并步骤

代码如下:

// 归并排序(C++-递归版)
template<typename T>
void merge_sort_recursive(T arr[], T reg[], int start, int end) {
    if (start >= end)
        return;
    int len = end - start, mid = (len >> 1) + start;
    int start1 = start, end1 = mid;
    int start2 = mid + 1, end2 = end;
    merge_sort_recursive(arr, reg, start1, end1);
    merge_sort_recursive(arr, reg, start2, end2);
    int k = start;
    while (start1 <= end1 && start2 <= end2)
        reg[k++] = arr[start1] < arr[start2] ? arr[start1++] : arr[start2++];
    while (start1 <= end1)
        reg[k++] = arr[start1++];
    while (start2 <= end2)
        reg[k++] = arr[start2++];
    for (k = start; k <= end; k++)
        arr[k] = reg[k];
}

// merge_sort
template<typename T>
void merge_sort(T arr[], const int len) {
    T reg[len];
    merge_sort_recursive(arr, reg, 0, len - 1);
}

算法效率:

平均时间复杂度:O(nlogn)
最佳时间复杂度:O(n)
最差时间复杂度:O(nlogn)
空间复杂度:O(n)
排序方式:In-place
稳定性:稳定

No.3 快速排序

一、基本思想

对于输入A[0… n-1],按以下三个步骤进行排序:

  1. 分区:取A中的一个元素为中心点(pivot) 将A[0…n-1]划分成3段: A[0…s-1], A[s ], A[s+1…n-1], 使得
    A[0…s-1]中任一元素<=A[s],
    A[s+1…n-1]中任一元素 >=A[s]; 下标s 在划分过程中确定。
  2. 递归求解:递归调用快速排序法分别对A[0…s-1]和A[s+1…n-1]排序。
  3. 合并:合并A[0…s-1], A[s], A[s+1…n-1]为A[0…n-1]

算法步骤:

三、效率分析

基本操作:比较
最优情况下: 所有分裂点均处中部

最坏情况下:所有分裂点均处于极端

在进行了n+1次比较(ij指针交叉)后建立了分区,还会对数组进行排序,继续到最后一个子数组A[n-2…n-1]。总比较次数为:

最坏时间复杂度:O(n^2)
平均时间复杂度:O(nlogn)
辅助空间:O(logn)
稳定性:不稳定

四、快速排序不稳定例子

{6、7、5、2、5、8} 此为初始序列,那么按照快速排序的算法是不稳定的。

No.4 二叉树遍历及其相关特性

一、基本概念

所谓二叉树的遍历指的是遵循某一种次序来访问二叉树上的所有结点,使得树中每一个结点被访问了一次且只访问一次。

由于二叉树是一种非线性结构,树中的结点可能有不止一个的直接后继结点,所以遍历前必须先规定访问的次序。

二、中序遍历

二叉树的中序遍历算法比较简单,使用递归的策略。在遍历以前首先确定遍历的树是否为空,如果为空,则直接返回;否则中序遍历的算法步骤如下:

  1. 对左子树L执行中序遍历算法
  2. 对左子树L执行中序遍历算法
  3. 对右子树R执行中序遍历算法

三、前序遍历

有了上面的中序遍历的过程,前序遍历也是类似的。在遍历以前首先确定遍历的树是否为空,如果为空,则直接返回;否则前序遍历的算法步骤如下:

  1. 访问输出根结点V的值;
  2. 对左子树L执行前序遍历算法
  3. 对右子树R执行前序遍历算法

四、二叉树的高度计算(高度不是深度)

题目:

//输入一棵二叉树T
//输出二叉树的高度
//二叉树高度定义:叶子到树根的最长路径

//如果就是返回 两边哪个大的加本层的。
if T ==NULL return -1;
else return max{H(L),H(R)}+1;


H(T)=1+max{H(2),H(6)}
            =1+1+max{H(3),H(4)}
            =1+1+1+H(5)
            =1+1+1+1+(-1)     (深度-1)??
            =3

//二叉树高度定义:叶子到树根的最长路径

//如果就是返回 两边哪个大的加本层的。
if T ==NULL return -1;
else return max{H(L),H(R)}+1;


H(T)=1+max{H(2),H(6)}
            =1+1+max{H(3),H(4)}
            =1+1+1+H(5)
            =1+1+1+1+(-1)     (深度-1)??
            =3

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

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

相关文章

Spring MVC:常用参数(注解)的使用和参数绑定的验证

Spring MVC&#xff1a;常用参数&#xff08;注解&#xff09;的使用和参数绑定的验证 一、学习资源二、基础源码三、实验结果3.1 Spring MVC常用参数Controller和RequestMappingRequestMappingRequestParamPathVariableCookie ValueRequestHeader 3.2 Spring MVC参数绑定3.2.1…

一路对标顶级产品,奇遇XR为何仍不见起色?

临近6月&#xff0c;再度遇冷的XR行业&#xff0c;又让很多人充满期待。外界普遍认为&#xff0c;基于苹果酝酿多年的MR头显产品&#xff0c;将于6月举行的WWDC 2023全球开发者大会正式亮相&#xff0c;XR行业或将迎来“iPhone时刻”。 在一派期待中&#xff0c;一家国内XR企业…

代码审计之PHP基础铺垫

目录 1、标记 2、注释 3、输出语句 4、关键字 5、常量的定义与使用 6、预定义常量 7、变量的赋值&#xff08;传参赋值与引用赋值&#xff09; 8、可变变量 9、双引号和单引号的区别 10、heredoc结构和nowdoc结构 11、其他符号 1、标记 <?php 和 ?> 是PHP标…

第十一届蓝桥杯青少组省赛Python中/高级组编程题真题,包含答案解析

第十一届蓝桥杯青少组省赛Python中/高级组编程题真题 编程实现 第一题&#xff1a; 输入一个字符串&#xff0c;如果该字符串以er、Iy或者ing后缀结尾的&#xff0c;则删除该字符串后缀&#xff0c;并输出删除后的字符串&#xff0c;否者将原字符串输出。 输入描述 输入一个…

零知识证明:应用和具体用例

零知识证明&#xff08;Zero-Knowledge Proofs&#xff0c;ZKPs&#xff09;是应用密码学中令人兴奋的突破&#xff0c;将在各个行业中解锁新的用例&#xff0c;从 Web3 到供应链再到物联网。通过在不揭示信息的情况下验证其真实性&#xff0c;ZKPs 可以增强数字系统的隐私、安…

【Unity-UGUI控件全面解析】| Slider 滑动条组件详解

🎬【Unity-UGUI控件全面解析】| Slider 滑动条组件详解一、组件介绍二、组件属性面板三、代码操作组件四、组件常用方法示例4.1 充当 进度条控制灯光亮度4.2 模拟 血条 使用💯总结🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CS…

【Spring全家桶系列】面向切面编程AOP

⭐️前面的话⭐️ 本文已经收录到《Spring框架全家桶系列》专栏&#xff0c;本文将介绍面向切面编程的思想和相关概念&#xff0c;附加一个小案例。 &#x1f4d2;博客主页&#xff1a;未见花闻的博客主页 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&a…

基于Kubernetes集群构建大中型企业CICD应用平台(2)--code阶段工具gitlab安装

这里我们为gitlab服务器准备一台虚拟机&#xff1a;192.168.19.6-gitlab服务器 在code阶段&#xff0c;我们需要将不同版本的代码存储到一个仓库中&#xff0c;常见的版本控制工具就是SVN或者Git&#xff0c;这里我们采用Git作为版本控制工具&#xff0c;GitLab作为远程仓库。…

django常用命令/vue-cli图形化界面创建方式/vueo-cli命令行创建方式/若依框架/elementui

django常用命令 django-admin.exe startproject mysite python .\manage.py startapp app01 python manage.py makemigrations python manage.py migrate python manage.py runserver python manage.py runserver 0.0.0.0:8000 from django.shortcuts import render,Http…

【Linux学习】多线程——同步 | 条件变量 | 基于阻塞队列的生产者消费者模型

多线程——同步 | 条件变量 | 基于阻塞队列的生成者消费者模型 &#x1f3d3;生产者消费者模型&#x1f3f8;同步概念&#x1f3f8;生产者消费者模型的特点 &#x1f3d3;同步的应用&#x1f3f8;条件变量&#x1f3f8;条件变量接口 &#x1f3d3;基于阻塞队列的生产者消费者模…

文心一言 VS chatgpt (16)-- 算法导论4.1 1~2题

一、当A的所有元素均为负数时&#xff0c;FIND-MAXIMUM-SUBARRAY返回什么? 文心一言&#xff1a; 当A的所有元素均为负数时&#xff0c;FIND-MAXIMUM-SUBARRAY返回-1。 这是因为在二进制中&#xff0c;当所有元素均为负数时&#xff0c;A的每个元素都对应一个负数&#xff…

基于Kubernetes集群构建大中型企业CICD应用平台(4)--Operate阶段工具

还是在192.168.19.7-CentOS-7.6-jenkins-new这台服务器上进行操作 部署过程&#xff0c;会采用Docker进行部署&#xff0c;暂时只安装Docker即可&#xff0c;后续还需安装Kubenetes 4.1 Docker安装 准备测试环境&生产环境 下载Docker依赖组件 # yum -y install yum-uti…

vue+express+mysql做一个简单前后端交互,从数据库中读取数据渲染到页面

1.下载上次的包 npm I &#xff0c;同时下载新的包 axios 2.打开数据库服务器&#xff0c;同时使用新建数据库一样&#xff0c;数据包名 3.新建一个项目 4.全局注册axios 5.新建一个server文件夹&#xff08;里面在建一个index.js的主文件&#xff09;用来放我们后端写的东西 …

设计模式——单一职责模式之桥模式

文章目录 前言一、“单一职责” 模式二、Bridge 桥模式1、动机2、模式定义3、伪代码示例4、结构 总结 前言 一、“单一职责” 模式 在软件组件的设计中&#xff0c;如果责任划分的不清晰&#xff0c;使用继承得到的结果往往是随着需求的变化&#xff0c;子类急剧膨胀&#xff…

【C++STL】map/set源码封装简单分析

文章目录 一. 问题的抛出二. 红黑树的实现三. map/set实现四. 分析五. KeyOfValue仿函数结束语 一. 问题的抛出 我们知道C的STL中map和set的底层都是红黑树。 但是仔细思考一下&#xff0c;map是存储键值对&#xff0c;也就是Key_Value模型 而set是Key的模型 那么STL中的红黑树…

apisdk-starter自动装配的思路与应用

apisdk-starter整体思路 首先定义开发者定义的开放接口声明为原始类&#xff0c;javassist生成的类是增强类。 使用springboot的EnableAutoConfiguration和Import触发Spring扫描组件扫描原始类&#xff0c;得到所有BeanDefinition拓展FactoryBean&#xff0c;构造函数的参数为…

力扣算题Day20

98.验证二叉搜索树(了解二叉树的性质,才是编写此道题代码的基础) 做题伤着了&#xff1a;这道题我做的时候&#xff0c;看到别人写的代码很长&#xff0c;懒得看&#xff0c;直接干。自己编写代码&#xff0c;没有了解平衡二叉树的性质&#xff0c;然后出现了下图[0,-1]、[0]的…

落地页设计的营销心理学(一)

营销落地页的作用&#xff0c;是为了促进目标用户转化。但如何提升转化率&#xff0c;这就需要我们了解用户在浏览落地页行为背后的动机、心理活动是什么&#xff0c;才能更好地制定营销策略。 营销心理学是指应用心理学原理来解释、预测和影响人们购买决策的一门学科。在落地页…

Goby 漏洞更新 |华视私云-CDN直播加速服务器默认口令漏洞

漏洞名称&#xff1a;华视私云-CDN直播加速服务器默认口令漏洞 English Name&#xff1a;Sinovision Cloud CDN live default passwd CVSS core: 6.5 影响资产数&#xff1a;737 漏洞描述&#xff1a; 华视私云-CDN直播加速服务器是一款用于CDN直播加速的服务器。华视私云…

Restormer Efficient Transformer for High-Resolution Image Restoration论文代码运行记录

文章目录 Restormer代码训练和测试运行记录文章及代码地址1. 所需环境2. 配置环境3. 安装gdrive以便下载数据集4. 放置权重文件5. 运行Demo运行单图像散焦去模糊训练、测试 Restormer代码训练和测试运行记录 文章及代码地址 文章名称&#xff1a;Restormer: Efficient Transf…