分治算法(Divide and Conquer)

news2024/9/23 13:24:59
本文已收录于专栏
《算法合集》

一、简单释义

1、分治算法

  字面上的解释是“分而治之”,就是把一个复杂的问题拆分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并

2、算法目的

  通过将直接得到结果非常困难的事情,不断拆分子问题,执行起来容易且简单

3、算法思想

  将一个大的任务拆分成若干个小的任务逐个解决来完成拆分之前总任务的效果。

二、核心思想

  • –将问题分解为规模更小的子问题;
  • –将这些规模更小的子问题逐个击破;
  • –将已解决的子问题合并,最终得出“母”问题的解;

三、图形展示

​​​​​​​​​​​​在这里插入图片描述
  我们要查找2所在的位置,首先将原始数组折中缩小范围,找打了5和我们要查找的值不一致,然后在判断我们要查找的值是大于5还是小于5。如果是大于5则往后面查找,反之往前面找。2比5小所以我们就需要往前面找。然后我们将5前面的元素继续折中,找到了1(向下取整)。以此类推在进行比较。最后剩下2和3了在折中就找到2了。最终2在数组中下标为2的位置上,查找了3次。

四、代码实现

/**
 * @BelongsProject: demo
 * @BelongsPackage: com.wzl.Algorithm.Partition
 * @Author: Wuzilong
 * @Description: 分治算法
 * @CreateTime: 2023-04-26 09:27
 * @Version: 1.0
 */

public class Client {
    public static int rank(int value,int[] numberArr,int start,int end){
        if(start >end){
            return -1;
        }
        int key=start+(end-start)/2;
        if(value<numberArr[key]){
            return rank(value,numberArr,start,key-1);
        }else if(value>numberArr[key]){
            return rank(value,numberArr,key+1,end);
        }else{
            return key;
        }
    }
    public static void main(String[] args) {
        int numberArr[]={0,1,2,3,5,6,7,8,9};
        System.out.println("元素所在的位置是"+rank(2,numberArr,0,numberArr.length-1));
    }
}

运行结果
在这里插入图片描述

五、算法描述

1、问题描述

  给定一个n个元素的数组,数组下标从0开始,采用分治法获取数组中的某个元素的下标。

2、算法过程

整个算法过程分为以下几步:
  1)对数据进行折中处理,获取折中元素:数组的长度-1(数组最大值的下标)/2
  2)判断折中元素与我们要获取的值得关系:等于直接返回 大于向前继续折中查找 小于向后继续折中查找 以此类推。
  3)折中不为0需要向下取整:例如5/2=2.5 则取下标为2的元素为折中元素

六、算法分析

1、时间复杂度

  假使总共有n个元素,那么二分后每次查找的区间大小就是n,n/2,n/4,…,n/2^k(接下来操作元素的剩余个数),其中k就是递归的次数。
  最坏的情况下是K次二分之后,每个区间的大小为1,找到想要的元素令n/2^k=1,可得k=log2n,(是以2为底,n的对数),所以时间复杂度可以表示O()=O(logn).
  最好的情况下是第一次就找到了,所以时间复杂度为O(1)

2、空间复杂度

  算法的空间复杂度并不是计算实际占用的空间,而是计算整个算法的辅助空间单元的个数由于辅助空间是常数级别的,所以空间复杂度是O(1)。

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

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

相关文章

什么是FAQ页面?如何设计一个优秀的FAQ页面?

随着互联网技术的迅猛发展&#xff0c;越来越多的企业开始将在线客户支持服务作为一种重要的业务方式&#xff0c;以提供更好的服务体验。然而&#xff0c;在线客户支持服务除了提供实时的沟通方式外&#xff0c;一个功能齐全、易于使用的FAQ页面也是必不可少的&#xff0c;这可…

Go 语言进阶与依赖管理

作者&#xff1a;非妃是公主 专栏&#xff1a;《Golang》 博客主页&#xff1a;https://blog.csdn.net/myf_666 个性签&#xff1a;顺境不惰&#xff0c;逆境不馁&#xff0c;以心制境&#xff0c;万事可成。——曾国藩 文章目录 一、语言进阶1. 并发和并行2. 协程(Goroutine…

软件or硬件?硬件的前途到底在哪里?

一、硬件明明比软件更难&#xff0c;国内的硬件技术也不如软件&#xff0c;为什么硬件工程师待遇还不如软件&#xff1f; 1、不需要太高层次的硬件设计&#xff0c;比如大部分小家电企业&#xff0c;简单的电子产品企业&#xff0c;单片机简单外围设计就够了&#xff0c;单片机…

java网络编程——NIO架构

目录 1.什么是NIO 2.NIO结构 3.基于NIO下的聊天系统实现 4.Netty 1.什么是NIO NIO&#xff1a;java non-blocking IO&#xff0c;同步非阻塞IO。 BIO是阻塞IO&#xff0c;即每一个事件都需要分配一个进程给他&#xff0c;如果客户端没有连接上&#xff0c;则一直阻塞等待…

Java基础--->并发部分(1)

文章目录 线程基本概念线程的创建方式线程调度-------常用的方法线程的生命周期和状态并发编程的根本原因Java内存模型(JMM)多线程核心的根本问题volatile关键字保障原子性synchronized和ReentrantLock的区别 线程基本概念 ​ 进程是程序的一次执行过程&#xff0c;是系统运行程…

【Linux】1.4 基本权限

文章目录 一、shell 命令以及运行原理二、Linux 权限的概念三、Linux 权限管理01.文件类型和访问权限&#xff08;事物属性&#xff09;02.文件访问的分类&#xff08;人&#xff09;①用户分类②角色划分 03.文件权限值的表现方法04.文件访问权限的相关设置方法&#xff08;a.…

STC8H8K64U单片机-看门狗配置与讲解

1、看门狗寄存器讲解 &#xff08;bit7&#xff09;WDT_FLAG&#xff1a;看门狗溢出标志&#xff0c;看门狗发生溢出时&#xff0c;硬件自动将此位置1&#xff0c;需要软件清零 &#xff08;bit5&#xff09;EN_WDT&#xff1a;看门狗使能位 0&#x…

被优化了怎么办?他苦学仨月拿到11koffer

网上有个段子叫做“生活就是起起落落落落落落”。人生在世&#xff0c;本就不易&#xff0c;再加上最近大环境影响&#xff0c;各行各业都在内卷&#xff0c;身为芸芸众生的一员&#xff0c;我们也难免受到影响&#xff0c;面临福利裁剪、降薪、甚至被优化的风险。 大环境我们…

面了20家大厂,发现这样介绍项目经验,显得项目很牛...

我在刚刚开始面试的时候&#xff0c;也遇到了这个问题&#xff0c;也是我第一个思考的问题&#xff0c;如何介绍自己的项目&#xff0c;既可以比较全面的让面试官了解这个项目&#xff0c;同时&#xff0c;也不会让面试官觉得废话太多。经过这么多的面试&#xff0c;我发现&…

JavaWeb+JSP+路径问题+跳转(HTML|Servlet|JSP)|这一篇就够了(超详细)

&#x1f648;作者简介&#xff1a;练习时长两年半的Java up主 &#x1f649;个人主页&#xff1a;老茶icon &#x1f64a; ps:点赞&#x1f44d;是免费的&#xff0c;却可以让写博客的作者开兴好久好久&#x1f60e; &#x1f4da;系列专栏&#xff1a;Java全栈&#xff0c;计…

ChatGPT真能取代程序员吗,看看它怎么解释SQL注入漏洞的问题

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;Beerus|慕课网讲师 背景 本周在《Web安全渗透测试》课程的QQ群中&#xff0c;有同学提问了一个关于网上一个关于SQL注入…

大淘宝技术斩获NTIRE 2023视频质量评价比赛冠军(内含夺冠方案)

近日&#xff0c;CVPR NTIRE 2023 Quality Assessment of Video Enhancement Challenge比赛结果公布&#xff0c;来自大淘宝音视频技术团队的同学组成「TB-VQA」队伍&#xff0c;从37支队伍中脱颖而出&#xff0c;拿下该比赛&#xff08;唯一赛道&#xff09;冠军。此次夺冠是团…

Mysql replace into与on duplicate key update区别

1、replace into REPLACE INTO 首先判断数据是否存在&#xff1b;如果不存在&#xff0c;则插入&#xff1b;如果已存在则更新&#xff08;先删除再插入 根据主键或唯一索引判断记录是否已存在&#xff0c;所以插入数据的表必须要有主键或者唯一索引&#xff01;否则的话&…

Java 实现访问Redis哨兵(六)

目录 一、哨兵和复制 1.1 哨兵(sentinal) 1.Redis哨兵主要功能 2.Redis哨兵的高可用 1.2 Redis复制(Replication) 1.数据复制原理(执行步骤) 1.3 Redis 主从复制、哨兵和集群这三个有什么区别 二、Java访问哨兵实现 一、哨兵和复制 谈到Redis服务器的高可用&#xff0c…

【笔记】I2S协议是什么?

什么是I2S协议 I2S协议的介绍I2S协议有什么 这两天在搞ESP32的btAudio库&#xff0c;接触到了I2S&#xff0c;简单做个笔记。 I2S协议的介绍 I2S(Inter—IC Sound)总线, 又称集成电路内置音频总线&#xff0c;是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标…

2.QT窗口部件

类继承关系图 &#xff08;上面为Base类&#xff0c;下面为Derived类&#xff09; 窗口与子部件 窗口&#xff1a;没有父部件的部件&#xff0c;称为顶级部件 子部件&#xff1a;非窗口部件 新建空的qmake项目mywidget1 //mywidget1.proQT core gui greaterThan(QT_MAJO…

这是一个黑科技:C++爬虫~(文末报名C/C++领域新星计划)

目录 写在前面 完整代码 这里必看&#xff01;&#xff01; 写在最后 写在前面 现在所有人都知道万能的Python可以做机器学习&#xff0c;可以做人工智能&#xff0c;可以爬取各种小网站&#xff0c;但是你不知道&#xff0c;基于C的正则表达式早就能够爬取各种网络数据啦&a…

华为OD机试——对称美学(通过率只有8.51%???)

用java写的这道题&#xff0c;两个样例都可以通过&#xff0c;但是提交之后最终的通过率只有8.51%&#xff1f;&#xff1f;&#xff1f;自己搞了半天一直都是这个通过率&#xff0c;然后用网上说的100%通过率的代码也是一样的结果&#xff0c;最后时间到了还是没有拿到满分&am…

这些vue基本语法,你掌握了吗

文章目录 一、 vue 项目重点概念介绍1. 单页面应用程序2. 单文件组件3.数据驱动视图 二、 vue 基本结构1、template2、script3、style 三、 vue 常用指令介绍1、内容渲染指令&#xff08;1&#xff09;插值表达式 {{xxx}} —常用方式&#xff08;2&#xff09;v-text&#xff0…

session和JWT的应用及区别

文章目录 登录认证(node)一、session1.下载session2.全部配置session3.存储session4.获取session5.销毁session 二、JWT (Json web token)1.JWT 的工作原理2.JWT 的组成3.下载JWT4.生成token5.解密TOken6.配置全局错误中间件 登录认证(node) 一、session 一、在node中使用sess…