【算法】分治法的基本思想和二分搜索的应用

news2024/12/26 22:41:08

创作不易,本篇文章如果帮助到了你,还请点赞 关注支持一下♡>𖥦<)!!
主页专栏有更多知识,如有疑问欢迎大家指正讨论,共同进步!
更多算法分析与设计知识专栏:算法分析🔥
给大家跳段街舞感谢支持!ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ

在这里插入图片描述


目录

  • 一、分治法的基本思想
  • 二、分治法的基本步骤
  • 三、分治法的复杂性分析
  • 分治法实现——二分搜索
    • 二分搜索的时间复杂性

一、分治法的基本思想

分治法它的基本思想是将一个大问题分解成若干个与原问题相似的小问题,用相同的方法递归地解决这些小问题,最后将这些小问题的解合并起来,得到原问题的解决方案。

分治法所能解决的问题一般具有以下特征:

  • 该问题的规模缩小到一定的程度就可以容易地解决
    因为问题的计算复杂性一般是随着问题规模的增加而增加,因此大部分问题满足这个特征。

  • 该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质
    这条特征是应用分治法的前提,它也是大多数问题可以满足的,此特征反映了递归思想的应用。

  • 利用该问题分解出的子问题的解可以合并为该问题的解。
    能否利用分治法完全取决于问题是否具有这条特征,如果具备了前两条特征,而不具备第三条特征,则可以考虑贪心算法或动态规划。

  • 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
    这条特征涉及到分治法的效率,如果各子问题是不独立的,则分治法要做许多不必要的工作,重复地解公共的子问题,此时虽然也可用分治法,但一般用动态规划较好。

在用分治法设计算法时,最好使子问题的规模大致相同。即将一个问题分成大小相等的k个子问题的处理方法是行之有效的。这种使子问题规模大致相等的做法是出自一种平衡(balancing)子问题的思想,它几乎总是比子问题规模不等的做法要好。

二、分治法的基本步骤

分治法通常包括三个步骤:

  • 分解:将原问题分解成若干个子问题,这些子问题是原问题的规模较小的版本,且它们的结构与原问题相同或类似。

  • 解决:递归地求解每个子问题。当子问题的规模足够小,可以直接求解时,则停止递归。

  • 合并:将所有子问题的解合并成原问题的解。

divide-and-conquer(P)
{
    if ( | P | <= n0) adhoc(P);   //解决小规模的问题
    divide P into smaller subinstances P1,P2,...,Pk;//1.分解
    for (i=1,i<=k,i++)
        yi=divide-and-conquer(Pi);  //2.解决:递归的解各子问题
    return merge(y1,...,yk);  //3.合并:将各子问题的解合并为原问题的解
}

三、分治法的复杂性分析

一个分治法将规模为n的问题分成k个规模为n/m的子问题去解。

设分解阀值n0=1,且adhoc解规模为1的问题耗费1个单位时间。

再设将原问题分解为k个子问题以及用mergek个子问题的解合并为原问题的解需用f(n)个单位时间

那么,分治算法的时间复杂度可以表示为:

T(n) = kT(n/k) + M(n)

根据主定理,可以得到分治算法的时间复杂度为:T(n) = O(nlogk)

其中,k表示将问题分成k个子问题。

分治法实现——二分搜索

问题描述:

给定已按升序排好序的n个元素a[0:n-1],现要在这n个元素中找出一特定元素x

分析:

①该问题的规模缩小到一定的程度就可以容易地解决;
②该问题可以分解为若干个规模较小的相同问题;
③分解出的子问题的解可以合并为原问题的解
④分解出的各个子问题是相互独立的

满足分治法的四个条件

  • 1.先将有序数组分成两部分,中间位置mid为基准值
  • 2.若该值等于目标值key,则直接返回;
  • 若该值大于目标值,则在左半部分进行二分搜索;若该值小于目标值,则在右半部分进行二分搜索

循环执行二分搜索,直到左侧low标记大于右侧high标记

在这里插入图片描述

示例代码:

int binarySearch(int[] nums, int target) 
{
    int left = 0; 
    int right = nums.length - 1; 	// 注意:此处为数组下标

    while(left <= right) 		//不是 < 搜索空间为空时终止循环,终止条件:left==right+1,如果使用<会漏掉一个元素 
    {
        int mid = left + (right - left) / 2;
        if(nums[mid] == target)
            return mid; 
        else if (nums[mid] < target)
            left = mid + 1; 	// 注意
        else if (nums[mid] > target)
            right = mid - 1; 	// 注意
    }
    return -1;
}

这里介绍一下我看过的labuladong的算法笔记中的内容:

二分查找的基本框架,几种二分搜索的变形都基于这个框架

int binarySearch(int[] nums, int target) {
    int left = 0, right = ...;

    while(...) {
        int mid = left + (right - left) / 2;
        if (nums[mid] == target) {
            ...
        } else if (nums[mid] < target) {
            left = ...
        } else if (nums[mid] > target) {
            right = ...
        }
    }
    return ...;
}

二分搜索的时间复杂性

每执行一次算法的while循环, 待搜索数组的大小减少一半。

因此,在最坏情况下,while循环被执行了O(logn)次。循环体内运算需要O(1) 时间,因此整个算法在最坏情况下的计算时间复杂性为O(logn)


在这里插入图片描述

大家的点赞、收藏、关注将是我更新的最大动力! 欢迎留言或私信建议或问题。
大家的支持和反馈对我来说意义重大,我会继续不断努力提供有价值的内容!如果本文哪里有错误的地方还请大家多多指出(●'◡'●)

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

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

相关文章

手写Mybatis:第9章-细化XML语句构建器,完善静态SQL解析

文章目录 一、目标&#xff1a;XML语句构建器二、设计&#xff1a;XML语句构建器三、实现&#xff1a;XML语句构建器3.0 引入依赖3.1 工程结构3.2 XML语句构建器关系图3.3 I/O资源扫描3.4 SQL源码3.4.1 SQL对象3.4.2 SQL源码接口3.4.3 原始SQL源码实现类3.4.4 静态SQL源码实现类…

Shopify上线新插件,与TikTok Shop销售集成

近日&#xff0c;Shopify推出一款TikTokShop集成插件&#xff0c;简化商家通过TikTokShop销售的流程&#xff0c;此举是对TikTokShop即将关闭半闭环模式的回应。 不久前&#xff0c;TikTok官方宣布将于9月12日关闭半闭环模式&#xff0c;转而专注于TikTokShop全闭环销售&#…

mysql-1:认识mysql

文章目录 数据库概述什么是数据库什么是关系型数据库 MySQL的概述MySQL是什么MySQL发展历程 SQL的概述什么是SQLSQL发展的简要历史&#xff1a;SQL语言分类 数据库概述 什么是数据库 数据库就是[存储数据的仓库]&#xff0c;其本质是一个[文件系统]&#xff0c;数据按照特定的…

系统架构设计师(第二版)学习笔记----系统架构设计师概述

【原文链接】系统架构设计师&#xff08;第二版&#xff09;学习笔记----系统架构设计师概述 文章目录 一、架构设计师的定义、职责和任务1.1 架构设计师的定义1.2 架构设计师的任务 二、架构设计师应具备的专业素质2.1 架构设计师应具备的专业知识2.2 架构设计师的知识结构2.3…

SIEM 中不同类型日志监控及分析

安全信息和事件管理&#xff08;SIEM&#xff09;解决方案通过监控来自网络的不同类型的数据来确保组织网络的健康安全状况&#xff0c;日志数据记录设备上发生的每个活动以及整个网络中的应用程序&#xff0c;若要评估网络的安全状况&#xff0c;SIEM 解决方案必须收集和分析不…

海外企业邮箱注册指南

海外企业邮箱怎么注册&#xff1f;随着全球化进程的加速&#xff0c;海外企业间的沟通和合作也越来越频繁。在这种情况下&#xff0c;拥有一个海外企业邮箱就显得非常必要。本文将向大家介绍如何注册海外企业邮箱。 步骤一&#xff1a;选择邮箱服务提供商 要注册海外企业邮箱&a…

音频修复和增强工具 iZotope RX 10 for mac激活最新

iZotope RX 10是一款音频修复和增强软件&#xff0c;主要特点包括&#xff1a; 声音修复&#xff1a;iZotope RX 10可以去除不良噪音、杂音、吱吱声等&#xff0c;使音频变得更加清晰干净。音频增强&#xff1a;iZotope RX 10支持对音频进行音量调节、均衡器、压缩器、限制器等…

读SQL学习指南(第3版)笔记11_字符串函数和数值函数

1. 尽管SQL标准指定了部分函数&#xff0c;但数据库厂商并没有遵循这些函数规范 2. 字符串 2.1. char 2.1.1. 固定长度、不足部分用空格填充的字符串 2.1.2. MySQL允许的char类型的最大长度为255个字符 2.1.3. Oracle Database允许的最大长度为2,000个字符 2.1.4. SQL Se…

Day54|动态规划part15:392.判断子序列、115.不同的子序列

392.判断子序列 leetcode链接&#xff1a;力扣题目链接 视频链接&#xff1a;动态规划之子序列&#xff0c;为了编辑距离做铺垫 | LeetCode&#xff1a;115.不同的子序列 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。字符串的一个子序列是原始字符串删除一些&…

【深度学习实验】数据可视化

目录 一、实验介绍 二、实验环境 三、实验内容 0. 导入库 1. 归一化处理 归一化 实验内容 2. 绘制归一化数据折线图 报错 解决 3. 计算移动平均值SMA 移动平均值 实验内容 4. 绘制移动平均值折线图 5 .同时绘制两图 6. array转换为tensor张量 7. 打印张量 一、…

C/C++源程序到可执行程序exe的全过程(及汇编和反汇编的区别)

1.C/C源程序到可执行程序exe的全过程&#xff08;及汇编和反汇编的区别&#xff09; 一个现代编译器的主要工作流程如下&#xff1a; 源程序&#xff08;source code&#xff09;→预处理器&#xff08;preprocessor&#xff09;→编译器&#xff08;compiler&#xff09;→汇…

【论文复现】Learning I/O Access Patterns to Improve Prefetching in SSDs 系列 1

文章目录 前言数据集准备数据初探数据处理分配标签抽取有效列并搭建模型训练失败分析 前言 LSTM完成ssd I/的预取 ref&#xff1a; git地址: https://github.com/Chandranil2606/Learning-IO-Access-Patterns-to-improve-prefetching-in-SSDs-paper地址: https://people.ucsc…

halo个人博客搭建及介绍

halo个人博客搭建及介绍 halo介绍 halo强大易用的开源建站工具&#xff0c;配合上丰富的模板与插件&#xff0c;帮助你构建你心中的理想站点。具体可以搜索下官网的搭建指南。 博客技术架构 后端 1.spring reactive ,响应式编程&#xff0c;代码风格简单及高并发队列优化相…

android studio cmake生成.a文件(静态库)及调用(c c++)静态库.a

第一步生成静态库.a文件&#xff1a; cmake 语法如何生成静态库&#xff0c;就不介绍了&#xff0c;比较简单&#xff0c;我下文列出的参考资料里面有详细介绍。 add_library(${CMAKE_PROJECT_NAME} STATICsrc/CalculStatic.cpp)这一步有坑&#xff0c;我刚开始的时候&#x…

数学建模之图论

目录 1 图的基本概念2 如何做图2.1 直接做图2.2 编程做图 3 权重邻接矩阵3.1 无向图3.2 有向图 4 Dijkstra 算法4.1 算法概述4.2 代码实现 5 Floyd 算法5.1 算法概述5.2 代码实现 6 思考题 1 图的基本概念 图论中的图&#xff08;Graph&#xff09;是由若干给定的点及连接两点的…

mkp勒索病毒的介绍和防范,勒索病毒解密,数据恢复

mkp勒索病毒是一种新兴的电脑病毒&#xff0c;它会对感染的电脑进行加密&#xff0c;并要求用户支付一定的赎金才能解锁。这种病毒已经引起了全球范围内的关注&#xff0c;因为它不仅具有高危害性&#xff0c;而且还有很强的传播能力。本文将对mkp勒索病毒进行详细介绍&#xf…

群辉NAS:J1900系统盘安装SATA固态硬盘方案【自留记录】

群辉NAS&#xff1a;J1900系统盘安装SATA固态硬盘方案 设备介绍&#xff1a; DSM版本&#xff1a;918 主板CPU&#xff1a;蜗牛星际J1900板 内存&#xff1a;8G DDR3 固态&#xff1a;移速SATA固态&#xff08;msata在win微桌面识别&#xff0c;群晖安装时候识别不到&#xf…

pdf用什么软件打开?介绍几种常用打开方法

pdf用什么软件打开&#xff1f;PDF是一种广泛使用的文件格式&#xff0c;由于其跨平台和易于共享的特点&#xff0c;它已成为许多人在日常工作和学习中使用的首选文件格式。但是&#xff0c;有时候我们可能会遇到一些问题&#xff0c;比如不知道用什么软件打开PDF文件&#xff…

Hadoop生态之hive

一 概述与特点 之所以把Hive放在Hadoop生态里面去写,是因为它本身依赖Hadoop。Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库表,并提供类 SQL 查询功能。 其本质是将 SQL 转换为 MapReduce/Spark 的任务进行运算,底层由 HDFS 来提供…

软件测试/测试开发丨Web自动化 PageObject设计模式

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27167 一、page object 模式简介 马丁福勒个人博客 selenium 官网 1.1、传统 UI 自动化的问题 无法适应 UI 频繁变化无法清晰表达业务用例场景大量的样…